此示例显示如何使用基于问题的方法将线性问题从数学形式转换为优化工具箱™求解语法。
问题中的变量和表达代表了操作化工厂的模型,从Edgar和Himmelblau的一个例子[1].两个相关视频描述了这个问题。
数学建模与优化,第1部分呈现图片表单中的问题,展示了如何生成数学表达式模型描述.
优化建模,第2部分:基于问题的数学模型求解介绍如何将这些数学表达式转换为优化工具箱求解语法。此视频显示如何解决问题,以及如何解释结果。
这个例子紧跟第二部分视频,重点是将问题转换为求解器语法。
第一部分的视频提出了以下将问题转化为数学形式的方法:
对问题有一个整体的认识。
确定目标(最大化或最小化某事)。
确定(命名)变量。
确定约束条件。
确定您可以控制哪些变量。
在数学符号中指定所有数量。
检查模型以获得完整性和正确性。
有关本节中变量的含义,请参阅第1部分视频。
优化问题是最小化目标函数,受到所有其他表达式的约束。
目标函数为:
0.002614 HPS + 0.0239 pp + 0.009825 ep
.
约束:
2500
≤.P1
≤.6250.
I1
≤.192,000
C
≤.62000年
I1 - HE1
≤.132000年
I1 = le1 + he1 + c
1359.8 i1 = 1267.8 he1 + 1251.4 le1 + 192 c + 3413 p1
3000
≤.P2
≤.9000
I2
≤.244000年
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
≥24550年
EP + PP.
≥12,000.
国会议员
≥271536年
有限合伙人
≥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 ('he1'那'indowbound', 0);he2 = Optimvar('他'那'indowbound', 0);HPS = optimvar (“HPS”那'indowbound', 0);MPS = Optimvar(“议员”那'indowbound',271536);lps = Optimvar(“有限合伙人”那'indowbound', 100623);BF1 = optimvar ('bf1'那'indowbound', 0);BF2 = optimvar ('bf2'那'indowbound', 0);EP = Optimvar(“EP”那'indowbound', 0);页= optimvar ('pp'那'indowbound', 0);
创建一个优化问题容器。在问题中包含目标函数。
linprob = optimproblem ('客观的',0.002614* hps + 0.0239* pp + 0.009825* ep);
问题表达式包含三个线性不等式:
I1 - HE1 ≤.132000年 EP + PP. ≥12,000. P1 + P2 + PP ≥24550年 |
(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。ecs2 = 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美元。
检查解决方案变量值。
台= struct2table (linsol)
台= 1×16表BF1 BF2 C EP HE1 HE2 HPS I1 I2 LE1 LE2有限合伙人议员P1 P2页 ___ ___ ______ ______ __________ __________ __________ __________ ________ ___ __________ __________ __________ ____ ______ _____ 0 0 8169.7 760.71 1.2816 3.8033 1.4338 e + e + 05年05年1.3633 e + e + 05年05年2.44 1.0062 e + e + 05 0 05年1.0062 2.7154 e + e + 05年05 6250 7060.7 11239
这张桌子太宽了,很难看清里面的内容。堆叠变量以垂直排列它们。
vars = {'p1'那'p2'那'i1'那'i2'那'C'那“LE1”那'le2'那'he1'那'他'那......“HPS”那“议员”那“有限合伙人”那'bf1'那'bf2'那“EP”那'pp'};outputvars =堆栈(资源描述、var、“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 11239
BF1.
那BF2.
,LE1
是0.
,他们的下限。
I2
是244000年
,它的上限。
目标函数(成本)的非零组件是
HPS.
-380,328.74.
PP.
-11239 .29
EP.
-760.71.
第2部分视频在原始问题方面解释了这些特征。
或者,您可以使用一个优化变量来解决问题,该变量具有具有问题变量的名称的指标。此方法使您可以立即为所有问题变量提供零的较低限制。
vars = {'p1'那'p2'那'i1'那'i2'那'C'那“LE1”那'le2'那'he1'那'他'那......“HPS”那“议员”那“有限合伙人”那'bf1'那'bf2'那“EP”那'pp'};x = Optimvar(“x”var,'indowbound', 0);
使用点表示法包括变量上的界限。
X('p1').lowerbound = 2500;X('p2').LowerBound = 3000;X(“议员”).LowerBound = 271536;X(“有限合伙人”).LowerBound = 100623;X('p1').UpperBound = 6250;X('p2').UpperBound = 9000;X('i1').pperbound = 192000;X('i2').pperbound = 244000;X('C').UpperBound = 62000;X('le2').UpperBound = 142000;
问题设置的其余部分类似于使用单独的变量的设置。差异是,而不是通过其名称来解决变量,例如P1
,您使用其索引来解决它,x('p1')
.
创建问题对象,包括线性约束,并解决问题。
linprob = optimproblem ('客观的'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 ('他')== x('i2');linprob.Constraints。econs2 = x (“LE1”) + x ('le2') + x ('bf2')== x(“有限合伙人”);linprob.constraints.econs3 = x('i1') + x ('i2') + x ('bf1')== x(“HPS”);linprob.Constraints。econs4 = x ('C') + x (“议员”) + x (“有限合伙人”)== x(“HPS”);linprob.constraints.econs5 = x(“LE1”) + x ('he1') + x ('C')== x('i1');linprob.Constraints。econs6 = x ('he1') + x ('他') + x ('bf1')== x('bf2') + x (“议员”);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('他')+ 1251.4 * x('le2') + 3413 * x ('p2') = = 1359.8 * x ('i2');[linsol, fval] =解决(linprob);
找到最佳解决方案。
检查解决方案作为垂直表。
台=表(var ', linsol.x ')
TBL = 16×2表var1 var2 _____ ___________'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.和大卫M. Himmelblau。化学过程的优化。纽约:McGraw-Hill,1987年。