Gurobi Optimizerは最適化モデルを構築するための様々なオプションを提供しています。一般的には、各種プログラミング言語(C, C++, C#, Java, etc.)に対するAPIを使うか、より上位のアプリケーション環境(a notebook, spreadsheet, a modeling system, MATLAB, R etc.)から利用することが多いです。しかし、今回のチュートリアルをより簡潔にするために、LPフォーマットファイルからの読み込みをご紹介します。LPフォーマットは人間の読みやすいようにデザインされたテキストファイルのフォーマットです。
以下に示す例の通り、LPフォーマットはほとんどそのまま数式を表現しています。
Maximize 0.01 Pennies + 0.05 Nickels + 0.1 Dimes + 0.25 Quarters + 1 Dollars Subject To Copper: 0.06 Pennies + 3.8 Nickels + 2.1 Dimes + 5.2 Quarters + 7.2 Dollars - Cu = 0 Nickel: 1.2 Nickels + 0.2 Dimes + 0.5 Quarters + 0.2 Dollars - Ni = 0 Zinc: 2.4 Pennies + 0.5 Dollars - Zi = 0 Manganese: 0.3 Dollars - Mn = 0 Bounds Cu <= 1000 Ni <= 50 Zi <= 50 Mn <= 50 Integers Pennies Nickels Dimes Quarters Dollars End
お手元にGurobiをインストールされている場合、coins.lp というファイルが<インストールディレクトリ>/examples/data下にあります。 例えばLinuxに対してGurobi 11.0.1 をデフォルトディレクトリにインストールした場合、/opt/gurobi1103/linux64/examples/data/coins.lpに配置されています。
LPファイルの実態はテキストファイルですので、これを変数する場合には任意のテキストエディターが利用できます。
LPファイルの編集
このLPファイルに手を加えたり、新しくLPファイルを作ったりする前にいくつかの記法を紹介しておきます。
1. セクションの順番
今回の例には、目的関数セクション(Maximize...)、制約セクション(Subject To...)、変数上下限セクション(Bounds...)、変数型宣言セクション(Integers...)がありますが、セクションはこの順番に記述する必要があります。セクションの種類のリストと順番に関するルールについての詳細は、Gurobi Reference Manualのファイル形式のセクションにあります。
2. 要素間のスペーシング
演算子、定数、変数など各要素の間は必ずスペースか改行によって分割されている必要があります。例えば
+ 0.1 Dimes
という式には+と0.1の間にスペースまたは改行、0.1とDimesとの間にもスペースか改行が必要です。
3. 変数の配置
LPファイルとC APIにおいては、変数を含む項は制約式の左辺に配置される必要があります。すなわち右辺は常に定数項のみ許されます。したがって、今回のモデルの制約式である
Cu = 0.06 Pennies + 3.8 Nickels + 2.1 Dimes + 5.2 Quarters + 7.2 Dollars
は次のように変形しておく必要があります。
0.06 Pennies + 3.8 Nickels + 2.1 Dimes + 5.2 Quarters + 7.2 Dollars - Cu = 0
4. デフォルトの変数上下限
特に明示しない限り、各変数は下限値0と無限大の上限値の範囲で定義されます。したがって、
Cu <= 1000 は実際には 0 <= Cu <= 1000 を意味します。同様にBoundsセクションで定義されなかった変数はすべて非負変数として扱われます。
次へ:チュートリアル(硬貨の製造):gurobi_clを使って最適化モデルを解く
その他の資料
コメント
0件のコメント
記事コメントは受け付けていません。