Lingo编程解决优化问题
优化问题在中学我们已经接触,如利用线性规划解决问题就是优化问题。用Lingo解决优化问题简单来说就是把约束条件的数学表达式用Lingo程序编写出来,然后利用约束条件求得目标问题的最优解。关键问题是找出所有的约束条件。
题目如下
有7种规格的包装箱要装到两辆平板车上,包装箱宽和高是一样的,但厚度t(cm)和重量w(公斤)是不一样的。下表给出了每种包装箱的厚度,重量以及数量。
包装箱类型 | C1 | C2 | C3 | C4 | C5 | C6 | C7 |
---|---|---|---|---|---|---|---|
厚度t | 48.7 | 52.0 | 61.3 | 72.0 | 48.7 | 52.0 | 64.0 |
重量w | 2000 | 3000 | 1000 | 500 | 4000 | 2000 | 1000 |
件数 | 8 | 7 | 9 | 6 | 6 | 4 | 8 |
每辆平板车有10.2米的地方可以用来装包装箱,载重为40吨。由于地区货运的限制,对C5,C6,C7包装箱的总数有一个特别的限制:这三类包装箱所占空间(厚度)不能超过302.7厘米。
要求:设计一种装车方案,使剩余空间最小。
解题思路
- 第一步要知道我们要求的目标函数是什么,即让什么达到最优,这里我称之为优化目标。这里的优化目标是:第一辆平板车剩余空间+第二辆平板车剩余空间。设决策变量Ci类包装箱厚度为ti厘米,重量wi公斤,件数为ni件。第一辆车装载Ci类xi件,第二辆车装载Ci类yi件。则第一辆车剩余空间为:
Z 1 = 1020 − ∑ i = 1 7 t i x i Z_1 {\rm{ = }}1020{\rm{ - }}\sum\limits_{i = 1}^7 {{\rm{t}}_i x_i } Z1=1020−i=1∑7tixi
第二辆车剩余空间为:
Z 2 = 1020 − ∑ i = 1 7 t i y i Z_2 {\rm{ = }}1020{\rm{ - }}\sum\limits_{i = 1}^7 {{\rm{t}}_i y_i } Z2=1020−i=1∑7tiyi
目标函数为:
m i n Z = Z 1 + Z 2 minZ=Z_1+Z_2 minZ=Z1+Z2
此时优化目标已经get,即目标函数表示出来。 - 第二步就是约束条件
件数满足: x i + y i < = n i ( i = 1...7 ) x_i+y_i<=n_i(i=1...7) xi+yi<=ni(i=1...7)
重量满足(车载重40吨): ∑ i = 1 7 w i x i < = 40000 , ∑ i = 1 7 w i y i < = 40000 \sum\limits_{i = 1}^7 {{\rm{w}}_i x_i }<=40000,\quad\sum\limits_{i = 1}^7 {{\rm{w}}_i y_i }<=40000 i=1∑7wixi<=40000,i=1∑7wiyi<=40000
长度不超过1020厘米: ∑ i = 1 7 t i x i < = 1020 , ∑ i = 1 7 t i y i < = 1020 \sum\limits_{i = 1}^7 {{\rm{t}}_i x_i }<=1020,\quad\sum\limits_{i = 1}^7 {{\rm{t}}_i y_i }<=1020 i=1∑7tixi<=1020,i=1∑7tiyi<=1020
对C5,C6,C7类包装箱厚度不能超过302.7厘米: ∑ i = 5 7 t i ( x i + y i ) < = 302.7 \sum\limits_{i = 5}^7 {{\rm{t}}_i (x_i+y_i) }<=302.7 i=5∑7ti(xi+yi)<=302.7
总线性规划模型: m i n Z = ( 1020 − ∑ i = 1 7 t i x i ) + ( 1020 − ∑ i = 1 7 t i y i ) minZ=(1020{\rm{ - }}\sum\limits_{i = 1}^7 {{\rm{t}}_i x_i })+(1020{\rm{ - }}\sum\limits_{i = 1}^7 {{\rm{t}}_i y_i } ) minZ=(1020−i=1∑7tixi)+(1020−i=1∑7tiyi)
s . t . 省 略 , 即 上 面 的 约 束 表 达 式 s.t.省略,即上面的约束表达式 s.t.省略,即上面的约束表达式
使用Lingo编程代码如下
!平板车问题;
model:
sets:
num/1..7/:w,t,n,x,y;!定义一维数组即决策变量;
endsets
!输入数据;
data:
t=48.7,52.0,61.3,72.0,48.7,52.0,64.0;
w=2000,3000,1000,500,4000,2000,1000;
n=8,7,9,6,6,4,8;
enddata
min=(1020-@sum(num:t*x))+(1020-@sum(num:t*y));
@sum(num:t*x)<=1020;
@sum(num:t*y)<=1020;
@sum(num:w*x)<=40000;
@sum(num:w*y)<=40000;
@for(num(i):x(i)+y(i)<=n(i));
@sum(num(i)|i#GE#5#AND#i#LE#7:(x(i)+y(i))*t(i))<=302.7;
@for(num:@GIN(x));
@for(num:@GIN(y));
end
解得
m
i
n
Z
=
0.6
minZ=0.6
minZ=0.6