データ分析と最適化¶
データ分析ライブラリーのpandasは、簡単に表を扱えるという特徴があります。つまり、表形式のデータ構造を扱うのに便利ということです。 実は、pandasの表にPuLPで作成した最適化モデルの変数を使えます。つまり、pandasの表を使って最適化モデルを作れます。このとき、変数はpandasの表の列になります。
pandasを使った最適化の手順¶
1変数が1行に対応する変数表を作成します
変数の列を変数表に追加します
モデルを作成します
変数表を使って、目的関数を設定します
変数表を使って、制約条件を追加します
モデルを解きます
モデルのステータスであることを確認します
結果の列を変数表に追加します
結果を確認します
pandasを使った最適化の要点¶
変数の作成:
addvars(df)
とします結果の作成:
addvals(df)
とします式の作成:
df.Price
などのように列を参照して使います
pandasを使うことの利点¶
変数の属性がわかりやすくなります
属性は単なる添字ではなく、列名を使えます
値は単なる数字ではなく、文字列など任意の値を使えます
pandasの便利な関数を使えます
条件による絞り込みや加工が簡単にできます
ortoolpyについて¶
pandasとPuLPを組み合わせて最適化モデルを作るときに、ortoolpyを使うとシンプルに記述できます。 PuLPのLpVariableでの変数作成方法は、以下の点で煩雑でした。
ユニークな変数名を指定しないといけない。
変数のリストを内包表記で書くのが複雑。
ortoolpyの以下の関数を使うと上記を解消できます。
addvar()
で非負の連続変数を作成します。LpVariable('v000001', lowBound=0)
と同じ意味になります。
LpVariable | addvar/th> | |
---|---|---|
非負変数 | LpVariable(変数名, lowBound=0) | addvar(lowBound=0) |
自由変数 | LpVariable(変数名, lowBound=None) | addvar(lowBound=None) |
非負変数:0から∞までの値を取る変数
自由変数:-∞から∞までの値を取る変数
addvarとLpVariableの違い¶
addvar
とLpVariable
の違いは、以下の2点だけです。
addvar
は、変数名を指定しなくてよいです。LpVariable
は、必ず変数名を指定しなければなりません。
addvar
のlowBound
のデフォルトは、0です。addvar()
は、addvar(lowBound=0)
と同じです。LpVariable(変数名)
は、LpVariable(変数名, lowBound=None)
と同じです。
上記以外では、addvar
でLpVariable
と同一のオプションが使えます。
その他の変数作成関数¶
作成対象 | 関数名/th> |
---|---|
非負変数 | addvar |
非負変数リスト | addvars |
0-1変数 | addbinvar |
0-1変数リスト | addbinvars |
全て、同一のオプションが使えます。
addvars(n)
とaddbinvars(n)
は、n個の変数のリストを作成します。多次元のリストも簡単に作れます。たとえば、
addbars(3, 2, 4)
とすると、3 x 2 x 4
の3次元のリストが作成できます。
df
をDataFrameとして、addvars(df)
やaddbinvars(df)
と書くこともできます。Var
という列に変数が作成されます。
0-1変数とは
0-1変数とは、0また1のどちらかの値しか取らない変数です。バイナリー変数ともいいます。bin
はバイナリーに由来します。
LpVariable
では、cat
オプションにLpBinary
を指定することで、0-1変数を作成できます。
同様のことは、addbinvar
でもできます。オプションを指定しなくて済むので、短く書けます。
結果の作成¶
df
をDataFrameとして、addvals(df)
として、Val
という列に変数が作成されます。