主要内容

设置线性程序,基于问题

将问题转换为求解器形式

此示例显示如何使用基于问题的方法将数学形式的线性问题转换为优化工具箱™求解语法。

问题中的变量和表达式代表了埃德加和Himmelblau的示例中操作化学设备的模型[1]。两个关联的视频描述了问题。

此示例紧密遵循第2部分视频,侧重于将问题转换为求解语法。

模型描述

第1部分视频表明以下方法将问题转换为数学形式:

  1. 解决问题的整体思想。

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

  3. 识别(名称)变量。

  4. 确定约束条件。

  5. 确定您可以控制哪些变量。

  6. 在数学符号中指定所有数量。

  7. 检查模型以获得完整性和正确性。

对于本节中变量的含义,请参阅第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 + PP24,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 + PP24,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.,他们的下限。

  • I2244,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年。

相关的话题