主要内容

建立一个基于问题的线性计划

将问题转换为求解器形式

此示例演示如何使用基于问题的方法将线性问题从数学形式转换为Optimization Toolbox™求解器语法。

问题中的变量和表达式代表了一个化工厂的操作模型,来自埃德加和希梅尔布劳的一个例子[1].两个相关视频描述了这个问题。

这个示例紧跟第2部分视频的内容,重点是将问题转换为求解器语法。

模型描述

第一部分的视频建议以下方法将问题转化为数学形式:

  1. 对这个问题有一个总体的认识。

  2. 确定目标(最大化或最小化某物)。

  3. 识别(命名)变量。

  4. 确定约束条件。

  5. 确定哪些变量是你可以控制的。

  6. 用数学符号指定所有的量。

  7. 检查模型的完整性和正确性。

关于本节中变量的含义,请参见第1部分视频。

优化问题是最小化目标函数,以所有其他表达式为约束条件。

目标函数为:

0.002614 HPS + 0.0239 pp + 0.009825 ep

约束条件是:

2500P16250
I1192000年
C62000年
I1 - he1132000年
I1 = le1 + he1 + c
1359.8 i1 = 1267.8 he1 + 1251.4 le1 + 192 c + 3413 p1
3000P29000
I2244000年
LE2142000年
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 + pp24550年
Ep + pp12000年
国会议员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);HE2 = optimvar(“何”下界的, 0);HPS = optimvar(“HPS”下界的, 0);MPS = optimvar(“议员”下界的, 271536);LPS = optimvar(“有限合伙人”下界的, 100623);BF1 = optimvar(BF1的下界的, 0);BF2 = optimvar(“BF2”下界的, 0);EP = optimvar(“EP”下界的, 0);PP = optimvar(“页”下界的, 0);

创造问题和目标

创建一个优化问题容器。在问题中包含目标函数。

Linprob =优化问题(“目标”,0.002614* hps + 0.0239* pp + 0.009825* ep);

创建并包含线性约束

问题表达式包含三个线性不等式:

I1 - he1132000年
Ep + pp12000年
P1 + p2 + pp24550年
(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
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 = solve(linprob);
找到最优解。

检查解决方案

评估目标函数。(您也可以通过调用[linsol,fval] = solve(linprob))。

评估(linprob.Objective linsol)
Ans = 1.2703e+03

运营该工厂的最低成本为1,207.30美元。

检查解决方案变量值。

TBL = 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”“页”};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 11239
  • BF1BF2,LE10,它们的下界。

  • I2244000年为它的上界。

  • 目标函数(成本)的非零分量为

    • HPS- - - - - -380328 .74点

    • - - - - - -11239 .29

    • EP- - - - - -760.71

第二部分视频根据原问题解释了这些特征。

第二种解决方法:创建一个优化变量和指标

或者,您可以仅使用一个具有问题变量名称索引的优化变量来解决该问题。此方法使您能够一次性为所有问题变量给出0的下界。

Vars = {“P1”“P2”“I1”“I2”“C”“LE1”“LE2”“HE1”“何”...“HPS”“议员”“有限合伙人”BF1的“BF2”“EP”“页”};X = optimvar(“x”var,下界的, 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”).上界= 192000;x (“I2”).UpperBound = 244000;x (“C”).上界= 62000;x (“LE2”).上界= 142000;

创建问题、线性约束和解决方案

问题设置的其余部分类似于使用单独变量的设置。不同之处在于,不是通过变量的名称来寻址变量,例如P1,则使用它的索引来寻址,x (P1)

创建问题对象,包括线性约束,并解决问题。

Linprob =优化问题(“目标”, 0.002614 * x (“HPS”+ 0.039 *x(“页”) + 0.009825*x(“EP”));linprob.Constraints。con1 = x(“I1”) - x(“HE1”) <= 132000;linprob.Constraints。con2 = x(“EP”) + x(“页”) >= 12000;linprob.Constraints。con3 = 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”) *x(“LE1”) + 192*x(“C”) + 3413*x(“P1”) == 1359.8*x(“I1”);linprob.Constraints。Econs8 = 1267.8*x(“何”) *x(“LE2”) + 3413*x(“P2”) == 1359.8*x(“I2”);[linsol,fval] = solve(linprob);
找到最优解。

检查索引解决方案

将解决方案作为一个垂直的表格进行检查。

TBL = table(vars',linsol.x')
tbl = 16×2表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

参考书目

埃德加,托马斯F.和大卫M.希梅尔布劳。化学过程优化“,”纽约:麦格劳-希尔,1987年。

相关的话题