主要内容

设置线性程序,基于问题

将问题转换为求解器形式

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

问题中的变量和表达代表了操作化工厂的模型,从Edgar和Himmelblau的一个例子[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≤.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 + PP24550年
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 + PP24550年
(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.,LE10.,他们的下限。

  • I2244000年,它的上限。

  • 目标函数(成本)的非零组件是

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

相关的话题