データ分析と最適化

データ分析ライブラリーの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)同じ意味になります。
 LpVariableaddvar/th>
非負変数LpVariable(変数名, lowBound=0)addvar(lowBound=0)
自由変数LpVariable(変数名, lowBound=None)addvar(lowBound=None)
  • 非負変数:0から∞までの値を取る変数
  • 自由変数:-∞から∞までの値を取る変数

addvarとLpVariableの違い

addvarLpVariableの違いは、以下の2点だけです。

  • addvarは、変数名を指定しなくてよいです。
    • LpVariableは、必ず変数名を指定しなければなりません。
  • addvarlowBoundのデフォルトは、0です。
    • addvar()は、addvar(lowBound=0)と同じです。
    • LpVariable(変数名)は、LpVariable(変数名, lowBound=None)と同じです。

上記以外では、addvarLpVariableと同一のオプションが使えます。

その他の変数作成関数

作成対象関数名/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という列に変数が作成されます。

数理的アプローチによる問題解決