線形計画法の設定、問題ベース
ソルバー形式への問題の変換
この例では、問題ベースのアプローチを使用して、線形問題を数学的な形式から Optimization Toolbox™ ソルバーの構文に変換する方法を示します。
問題に含まれる変数や式は、化学工場の運営モデルを表しており、Edgar と Himmelblau による [1] から引用しています。2 つの関連するビデオで問題が解説されます。
Mathematical Modeling with Optimization, Part 1 では、問題が図解され、モデルの説明 の数式の生成方法が示されています。
Optimization Modeling, Part 2: Problem-Based Solution of a Mathematical Model では、これらの数式を Optimization Toolbox ソルバーの構文に変換する方法が説明されています。また、問題の解法や、結果の解釈方法も示されています。
Part 2 のビデオに厳密に従っているこの例は、問題をソルバー構文に変換することに焦点が当てられています。
モデルの説明
Part 1 のビデオは、問題を数学的形式に変換するための次のアプローチを提案しています。
問題の概要を示す。
ゴールを特定する (何らかの要素の最大化または最小化)。
変数を特定 (指定) する。
制約を特定する。
制御可能な変数を判別する。
すべての数量の数学的表記で指定する。
モデルの完全性と正確さをチェックする。
このセクションでの変数の意味については、Part 1 のビデオを参照してください。
最適化の問題では、すべての他の式を制約として、目的関数を最小化します。
ここでは、目的関数は次のとおりです。
0.002614 HPS + 0.0239 PP + 0.009825 EP.
制約は次のとおりです。
2500 ≤ P1 ≤ 6250
I1 ≤ 192,000
C ≤ 62,000
I1 - HE1 ≤ 132,000
I1 = LE1 + HE1 + C
1359.8 I1 = 1267.8 HE1 + 1251.4 LE1 + 192 C + 3413 P1
3000 ≤ P2 ≤ 9000
I2 ≤ 244,000
LE2 ≤ 142,000
I2 = LE2 + HE2
1359.8 I2 = 1267.8 HE2 + 1251.4 LE2 + 3413 P2
HPS = I1 + I2 + BF1
HPS = C + MPS + LPS
LPS = LE1 + LE2 + BF2
MPS = HE1 + HE2 + BF1 - BF2
P1 + P2 + PP ≥ 24,550
EP + PP ≥ 12,000
MPS ≥ 271,536
LPS ≥ 100,623
すべての変数が正です。
最初の解法: 各問題変数の最適化変数の作成
最初の解法では、各問題変数の最適化変数を作成します。変数を作成する際に、それらの範囲を含めます。
P1 = optimvar("P1",LowerBound=2500,UpperBound=6250); P2 = optimvar("P2",LowerBound=3000,UpperBound=9000); I1 = optimvar("I1",LowerBound=0,UpperBound=192000); I2 = optimvar("I2",LowerBound=0,UpperBound=244000); C = optimvar("C",LowerBound=0,UpperBound=62000); LE1 = optimvar("LE1",LowerBound=0); LE2 = optimvar("LE2",LowerBound=0,UpperBound=142000); HE1 = optimvar("HE1",LowerBound=0); HE2 = optimvar("HE2",LowerBound=0); HPS = optimvar("HPS",LowerBound=0); MPS = optimvar("MPS",LowerBound=271536); LPS = optimvar("LPS",LowerBound=100623); BF1 = optimvar("BF1",LowerBound=0); BF2 = optimvar("BF2",LowerBound=0); EP = optimvar("EP",LowerBound=0); PP = optimvar("PP",LowerBound=0);
問題および目的の作成
最適化問題コンテナーを作成します。目的関数を問題に含めます。
linprob = optimproblem(Objective=0.002614*HPS + 0.0239*PP + 0.009825*EP);
線形制約を作成して含める
問題の式には、次の 3 つの線形不等式が含まれています。
I1 - HE1 ≤ 132,000EP + PP ≥ 12,000P1 + P2 + PP ≥ 24,550 | (1) |
これらの不等式制約を作成し、問題に含めます。
linprob.Constraints.cons1 = I1 - HE1 <= 132000; linprob.Constraints.cons2 = EP + PP >= 12000; linprob.Constraints.cons3 = P1 + P2 + PP >= 24550;
問題には、次の 8 つの線形等式が含まれています。
I2 = LE2 + HE2LPS = LE1 + LE2 + BF2HPS = I1 + I2 + BF1HPS = C + MPS + LPSI1 = LE1 + HE1 + CMPS = HE1 + HE2 + BF1 - BF21359.8 I1 = 1267.8 HE1 + 1251.4 LE1 + 192 C + 3413 P11359.8 I2 = 1267.8 HE2 + 1251.4 LE2 + 3413 P2. | (2) |
これらの制約も含めます。
linprob.Constraints.econs1 = LE2 + HE2 == I2; linprob.Constraints.econs2 = LE1 + LE2 + BF2 == LPS; linprob.Constraints.econs3 = I1 + I2 + BF1 == HPS; linprob.Constraints.econs4 = C + MPS + LPS == HPS; linprob.Constraints.econs5 = LE1 + HE1 + C == I1; linprob.Constraints.econs6 = HE1 + HE2 + BF1 == BF2 + MPS; linprob.Constraints.econs7 = 1267.8*HE1 + 1251.4*LE1 + 192*C + 3413*P1 == 1359.8*I1; linprob.Constraints.econs8 = 1267.8*HE2 + 1251.4*LE2 + 3413*P2 == 1359.8*I2;
問題を解く
問題の定式化は完了です。solve を使用して、問題を解きます。
linsol = solve(linprob);
Solving problem using linprog. Optimal solution found.
解の検証
目的関数を評価します。([linsol,fval] = solve(linprob) を呼び出すことで、この値を取得することもできます。)
evaluate(linprob.Objective,linsol)
ans = 1.2703e+03
この工場の運営にかかる最低コストは $1,207.30 です。
解の変数値を調べます。
tbl = struct2table(linsol)
tbl =
1×16 table
BF1 BF2 C EP HE1 HE2 HPS I1 I2 LE1 LE2 LPS MPS P1 P2 PP
___ ___ ______ ______ __________ __________ __________ __________ ________ ___ __________ __________ __________ ____ ______ _____
0 0 8169.7 760.71 1.2816e+05 1.4338e+05 3.8033e+05 1.3633e+05 2.44e+05 0 1.0062e+05 1.0062e+05 2.7154e+05 6250 7060.7 11239
この表は幅が広すぎて内容を簡単に把握できません。変数を縦に並べて見やすくします。
vars = ["P1","P2","I1","I2","C","LE1","LE2","HE1","HE2",... "HPS","MPS","LPS","BF1","BF2","EP","PP"]; outputvars = stack(tbl,vars,NewDataVariableName="Amt",IndexVariableName="Var")
outputvars =
16×2 table
Var Amt
___ __________
P1 6250
P2 7060.7
I1 1.3633e+05
I2 2.44e+05
C 8169.7
LE1 0
LE2 1.0062e+05
HE1 1.2816e+05
HE2 1.4338e+05
HPS 3.8033e+05
MPS 2.7154e+05
LPS 1.0062e+05
BF1 0
BF2 0
EP 760.71
PP 11239BF1、BF2、およびLE1は、下限値である0です。I2は上限値である244,000です。目的関数 (コスト) のゼロでない成分は以下のとおりです。
HPS—380,328.74PP—11,239.29EP—760.71
Part 2 のビデオでは、元の問題に関して、これらの特性が説明されています。
2 番目の解法: 1 つの最適化変数とインデックスの作成
別の方法として、問題変数の名前をインデックスとしてもつ最適化変数を 1 つのみ使用して、問題を解くこともできます。この方法では、下限 0 を一度にすべての問題変数に与えることができます。
vars = ["P1","P2","I1","I2","C","LE1","LE2","HE1","HE2",... "HPS","MPS","LPS","BF1","BF2","EP","PP"]; x = optimvar("x",vars,LowerBound=0);
変数範囲の設定
ドット表記を使用して、変数に範囲を含めます。
x("P1").LowerBound = 2500; x("P2").LowerBound = 3000; x("MPS").LowerBound = 271536; x("LPS").LowerBound = 100623; x("P1").UpperBound = 6250; x("P2").UpperBound = 9000; x("I1").UpperBound = 192000; x("I2").UpperBound = 244000; x("C").UpperBound = 62000; x("LE2").UpperBound = 142000;
問題、線形制約、解の作成
問題の設定の残りの部分は、個別の変数を使用した設定に似ています。違いは、P1 などの名前で変数を指定するのではなく、そのインデックス x("P1") を使用する点です。
問題のオブジェクトを作成し、線形制約を含めて、問題を解きます。
linprob = optimproblem(Objective=0.002614*x("HPS") + 0.0239*x("PP") + 0.009825*x("EP")); linprob.Constraints.cons1 = x("I1") - x("HE1") <= 132000; linprob.Constraints.cons2 = x("EP") + x("PP") >= 12000; linprob.Constraints.cons3 = x("P1") + x("P2") + x("PP") >= 24550; linprob.Constraints.econs1 = x("LE2") + x("HE2") == x("I2"); linprob.Constraints.econs2 = x("LE1") + x("LE2") + x("BF2") == x("LPS"); linprob.Constraints.econs3 = x("I1") + x("I2") + x("BF1") == x("HPS"); linprob.Constraints.econs4 = x("C") + x("MPS") + x("LPS") == x("HPS"); linprob.Constraints.econs5 = x("LE1") + x("HE1") + x("C") == x("I1"); linprob.Constraints.econs6 = x("HE1") + x("HE2") + x("BF1") == x("BF2") + x("MPS"); linprob.Constraints.econs7 = 1267.8*x("HE1") + 1251.4*x("LE1") + 192*x("C") + 3413*x("P1") == 1359.8*x("I1"); linprob.Constraints.econs8 = 1267.8*x("HE2") + 1251.4*x("LE2") + 3413*x("P2") == 1359.8*x("I2"); [linsol,fval] = solve(linprob);
Solving problem using linprog. Optimal solution found.
インデックス付きの解の検証
解を縦型の表として調べます。
tbl = table(vars',linsol.x')
tbl =
16×2 table
Var1 Var2
_____ __________
"P1" 6250
"P2" 7060.7
"I1" 1.3633e+05
"I2" 2.44e+05
"C" 8169.7
"LE1" 0
"LE2" 1.0062e+05
"HE1" 1.2816e+05
"HE2" 1.4338e+05
"HPS" 3.8033e+05
"MPS" 2.7154e+05
"LPS" 1.0062e+05
"BF1" 0
"BF2" 0
"EP" 760.71
"PP" 11239参考文献
[1] Edgar, Thomas F., and David M. Himmelblau. Optimization of Chemical Processes. New York: McGraw-Hill, 1987.