这个示例展示了如何使用基于问题的方法将线性问题从数学形式转换为最优化工具箱™求解器语法。
问题中的变量和表达式代表了一个化学工厂的运行模型,来自埃德加和希梅尔布劳的一个例子[1].两个相关视频描述了这个问题。
最优化的数学建模,第1部分以图形的形式给出问题,说明如何生成的数学表达式模型描述.
优化建模,第2部分:数学模型的基于问题的求解描述如何将这些数学表达式转换为“优化工具箱”求解器语法。这个视频展示了如何解决这个问题,以及如何解释结果。
这个示例紧随着第2部分的视频,重点是将问题转换为求解器语法。
第1部分视频建议了以下方法将问题转化为数学形式:
对问题有一个全面的认识。
确定目标(最大化或最小化某事)。
确定(命名)变量。
确定约束条件。
确定您可以控制哪些变量。
用数学符号说明所有的量。
检查模型的完整性和正确性。
有关本节中变量的含义,请参阅第1部分视频。
优化问题是最小化目标函数,以所有其他表达式为约束。
目标函数为:
0.002614 HPS + 0.0239 pp + 0.009825 ep
.
约束:
2500
≤P1
≤6250
I1
≤192000年
C
≤62000年
I1 - HE1
≤132000年
I1 = le1 + he1 + c
1. i1 = 1267.8 he1 + 1251.4 le1 + 192 c + 3413 p1
3000
≤P2
≤9000
I2
≤244000年
LE2
≤142000年
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
= he1 + he2 + bf1 - bf2
P1 + p2 + pp
≥24550年
EP +页
≥12,000
国会议员
≥271536年
有限合伙人
≥100623年
所有变量都是正的。
第一种解决方法涉及为每个问题变量创建一个优化变量。在创建变量时,包括它们的边界。
P1 = optimvar (“P1”,下界的, 2500,“UpperBound”, 6250);P2 = optimvar (“P2”,下界的, 3000,“UpperBound”, 9000);I1 = optimvar (“I1”,下界的0,“UpperBound”, 192000);I2 = optimvar (“I2”,下界的0,“UpperBound”, 244000);C = optimvar (“C”,下界的0,“UpperBound”, 62000);LE1 = optimvar (“LE1”,下界的, 0);LE2 = optimvar (“LE2”,下界的0,“UpperBound”, 142000);HE1 = optimvar (“HE1”,下界的, 0);何= optimvar (“何”,下界的, 0);HPS = optimvar (“HPS”,下界的, 0);议员= optimvar (“议员”,下界的, 271536);有限合伙人= optimvar (“有限合伙人”,下界的, 100623);BF1 = optimvar (BF1的,下界的, 0);BF2 = optimvar (“BF2”,下界的, 0);EP = optimvar (“EP”,下界的, 0);页= optimvar (“页”,下界的, 0);
创建一个优化问题容器。在问题中包含目标函数。
linprob = optimproblem (“目标”,0.002614* hps + 0.0239* pp + 0.009825* ep);
问题表达式包含三个线性不等式:
I1 - HE1 ≤132000年 EP +页 ≥12,000 P1 + p2 + pp ≥24550年 |
(1) |
创造这些不平等约束并将其纳入问题中。
linprob.Constraints。con1 = I1 - HE1 <= 132000;linprob.Constraints。con2 = EP + PP >= 12000;linprob.Constraints。con3 = P1 + P2 + PP >= 24550;
这个问题有8个线性等式:
I2 = le2 + he2 LPS = le1 + le2 + bf2 HPS = i1 + i2 + bf1 HPS = c + MPS + LPS I1 = le1 + he1 + c = he1 + he2 + bf1 - bf2 1. 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。econ3 = I1 + I2 + BF1 == HPS;linprob.Constraints。econs4 = C + MPS + LPS == HPS;linprob.Constraints。econ5 = 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.2703 e + 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
这张表太宽了,不容易看到里面的内容。堆叠变量以垂直排列它们。
var = {“P1”,“P2”,“I1”,“I2”,“C”,“LE1”,“LE2”,“HE1”,“何”,...“HPS”,“议员”,“有限合伙人”,BF1的,“BF2”,“EP”,“页”};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.0062 2e+05 HE1 1.2816e+05 HE2 1.4338e+05 HPS 3.8033e+05 MPS 2.7154e+05 LPS 1.0062 2e+05 BF1 0 BF2 0 EP 760.71 PP 11239
BF1
,BF2
,LE1
是0
它们的下界。
I2
是244000年
,它的上界。
目标函数(代价)的非零分量为
HPS
- - - - - -380328 .74点
页
- - - - - -11239 .29
EP
- - - - - -760.71
第二部分的视频从原始问题的角度解释了这些特征。
或者,您可以只使用一个优化变量来解决问题,该优化变量具有带有问题变量名称的索引。这种方法使您能够一次性给所有问题变量一个0的下界。
var = {“P1”,“P2”,“I1”,“I2”,“C”,“LE1”,“LE2”,“HE1”,“何”,...“HPS”,“议员”,“有限合伙人”,BF1的,“BF2”,“EP”,“页”};x = optimvar (“x”var,下界的, 0);
使用点表示法包括变量的边界。
x (“P1”).下界= 2500;x (“P2”).下界= 3000;x (“议员”).下界= 271536;x (“有限合伙人”).下界= 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 (“目标”, 0.002614 * x (“HPS”) + 0.0239 * x (“页”) + 0.009825 * x (“EP”));linprob.Constraints。cons1 = x (“I1”) - - - x (“HE1”) < = 132000;linprob.Constraints。cons2 = x (“EP”) + x (“页”) > = 12000;linprob.Constraints。cons3 = x (“P1”) + x (“P2”) + x (“页”) > = 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 table Var1 Var2 _____ __________ 'P1' 6250 'P2' 7060.7 'I1' 1.3633e+05 'I2' 2.44e+05 'C' 8169.7 'LE1' 0 'LE2' 1.0062 2e+05 'HE1' 1.2816e+05 'HE2' 1.4338e+05 'HPS' 3.8033e+05 'MPS' 2.7154e+05 'LPS' 1.0062 2e+05 'BF1' 0 'BF2' 0 'EP' 760.71 'PP' 11239
埃德加,托马斯·F,大卫·m·希梅尔布劳。化学过程的优化。纽约:麦格劳-希尔,1987年。