此示例显示如何使用基于问题的方法将数学形式的线性问题转换为优化工具箱™求解语法。
问题中的变量和表达式代表了埃德加和Himmelblau的示例中操作化学设备的模型[1]。两个关联的视频描述了问题。
数学建模与优化,第1部分呈现出图表中的问题,展示了如何生成的数学表达式模型描述。
优化建模,第2部分:基于问题的数学模型解决方案介绍如何将这些数学表达式转换为优化工具箱求解语法。此视频显示如何解决问题,以及如何解释结果。
此示例紧密遵循第2部分视频,侧重于将问题转换为求解语法。
第1部分视频表明以下方法将问题转换为数学形式:
解决问题的整体思想。
确定目标(最大化或最小化某事)。
识别(名称)变量。
确定约束条件。
确定您可以控制哪些变量。
在数学符号中指定所有数量。
检查模型以获得完整性和正确性。
对于本节中变量的含义,请参阅第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
议员
≥271,536
LPS.
≥100,623
所有变量都是积极的。
第一种解决方法涉及为每个问题变量创建一个优化变量。在创建变量时,包括它们的边界。
p1 = Optimvar('p1'那'indowbound',2500,'上行',6250);p2 = Optimvar('p2'那'indowbound', 3000,'上行',9000);i1 = Optimvar('i1'那'indowbound',0,'上行',192000);I2 = Optimvar('i2'那'indowbound',0,'上行',244000);c = Optimvar('C'那'indowbound',0,'上行',62000);Le1 = Optimvar('le1'那'indowbound',0);Le2 = Optimvar('le2'那'indowbound',0,'上行',142000);he1 = Optimvar('他1'那'indowbound',0);he2 = Optimvar('他'那'indowbound',0);hps = Optimvar('hps'那'indowbound',0);MPS = Optimvar(“议员”那'indowbound',271536);lps = Optimvar('lps'那'indowbound',100623);bf1 = Optimvar('bf1'那'indowbound',0);bf2 = Optimvar('bf2'那'indowbound',0);EP = Optimvar('EP'那'indowbound',0);pp = Optimvar('pp'那'indowbound',0);
创建优化问题容器。包括问题的目标函数。
linprob = OptimProblem('客观的',0.002614 * HPS + 0.0239 * PP + 0.009825 * EP);
问题表达式包含三个线性不等式:
I1 - He1. ≤.132,000 EP + PP. ≥12,000 P1 + P2 + PP ≥24,550. |
(1) |
创建这些不等式约束,并在问题中包含它们。
linprob.constraints.cons1 = i1 - he1 <= 132000;linprob.constraints.cons2 = EP + PP> = 12000;linprob.constraints.cons3 = p1 + p2 + pp> = 24550;
问题有八个线性等分:
I2 = Le2 + He2 LPS = LE1 + LE2 + BF2 HPS = i1 + i2 + bf1 HPS = C + MPS + LPS i1 = le1 + he1 + c MPS = HE1 + HE2 + BF1 - BF2 1359.8 I1 = 1267.8 HE1 + 1251.4 LE1 + 192 C + 3413 P1 1359.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;
问题配方完成。解决问题解决
。
LINSOL =解决(LINPROB);
找到最佳解决方案。
评估目标函数。(第一次打电话时,您也可以在此值解决
。)
评估(linprob.objective,linsol)
ANS = 1.2703E + 03
操作厂房的最低成本方法是1,207.30美元。
检查解决方案变量值。
tbl = struct2table(linsol)
TBL = 1×16表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 + 053.8033E + 05 1.3633E + 05 2.44E + 05 0 1.0062E + 05 1.0062E + 05 2.7154E + 05 2.7154E + 05 6250 7060.7 11239
此表太宽,无法轻松查看其内容。堆叠变量以垂直排列。
vars = {'p1'那'p2'那'i1'那'i2'那'C'那'le1'那'le2'那'他1'那'他'那......'hps'那“议员”那'lps'那'bf1'那'bf2'那'EP'那'pp'};outputvars =堆栈(资源描述、var、'newdatavariablename'那'amt'那'indexvariablename'那'var'的)
outputVars = 16×2表var AMT ___ __________ P1 6250 P2 7060.7 I1 1.3633E + 05 I2 2.44E + 05 C 8169.7 LE1 0 LE2 1.0062E + 05 HE2 1.4338E + 05 HPS 3.8033E + 05 HPS 3.8033E + 05 MPS 2.7154E + 05 LPS 1.0062E + 05 BF1 0 BF2 0 EP 760.71 PP 11239
BF1.
那BF2.
, 和le1.
是0.
,他们的下限。
I2
是244,000.
,它的上限。
目标函数(成本)的非零组件是
HPS.
-380,328.74.
PP.
-11,239.29
ep.
-760.71
第2部分视频在原始问题方面解释了这些特征。
或者,您可以使用一个优化变量来解决问题,该变量具有具有问题变量的名称的索引。此方法使您能够一次为所有问题变量提供零的零点。
vars = {'p1'那'p2'那'i1'那'i2'那'C'那'le1'那'le2'那'他1'那'他'那......'hps'那“议员”那'lps'那'bf1'那'bf2'那'EP'那'pp'};x = Optimvar('X',vars,'indowbound',0);
使用点表示法包括变量上的界限。
X('p1').LowerBound = 2500;X('p2').LowerBound = 3000;X(“议员”).LowerBound = 271536;X('lps').LowerBound = 100623;X('p1').pperbound = 6250;X('p2').pperbound = 9000;X('i1').pperbound = 192000;X('i2').pperbound = 244000;X('C').pperbound = 62000;X('le2').pperbound = 142000;
问题设置的其余部分类似于使用单独的变量的设置。差异是,而不是通过其名称来解决变量,例如P1.
,您使用其索引来解决它,x('p1')
。
创建问题对象,包括线性约束,并解决问题。
linprob = OptimProblem('客观的'0.002614 * x('hps')+ 0.0239 * x('pp')+ 0.009825 * x('EP'));linprob.constraints.cons1 = x('i1') - X('他1')<= 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('他')== 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(“议员”)+ x('lps')== x('hps');linprob.constraints.econs5 = x('le1')+ x('他1')+ x('C')== x('i1');linprob.constraints.econs6 = x('他1')+ x('他')+ x('bf1')== x('bf2')+ x(“议员”);linprob.constraints.econs7 = 1267.8 * x('他1')+ 1251.4 * x('le1')+ 192 * x('C')+ 3413 * x('p1')== 1359.8 * x('i1');linprob.constraints.econs8 = 1267.8 * x('他')+ 1251.4 * x('le2')+ 3413 * x('p2')== 1359.8 * x('i2');[LINSOL,FVAL] =解决(LINPROB);
找到最佳解决方案。
检查作为垂直表的解决方案。
TBL =表(vars',linsol.x')
TBL = 16×2表var1 var2 _____ __________'p1'6250'p2'7060.7'I1'105'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]埃德加,托马斯F.和David M. Hemmelblau。化学过程的优化。纽约:麦格劳山,1987年。