Lingo编程解决优化问题

Lingo编程解决优化问题

优化问题在中学我们已经接触,如利用线性规划解决问题就是优化问题。用Lingo解决优化问题简单来说就是把约束条件的数学表达式用Lingo程序编写出来,然后利用约束条件求得目标问题的最优解。关键问题是找出所有的约束条件。

题目如下

有7种规格的包装箱要装到两辆平板车上,包装箱宽和高是一样的,但厚度t(cm)和重量w(公斤)是不一样的。下表给出了每种包装箱的厚度,重量以及数量。

包装箱类型C1C2C3C4C5C6C7
厚度t48.752.061.372.048.752.064.0
重量w200030001000500400020001000
件数8796648

每辆平板车有10.2米的地方可以用来装包装箱,载重为40吨。由于地区货运的限制,对C5,C6,C7包装箱的总数有一个特别的限制:这三类包装箱所占空间(厚度)不能超过302.7厘米。
要求:设计一种装车方案,使剩余空间最小。

解题思路

  1. 第一步要知道我们要求的目标函数是什么,即让什么达到最优,这里我称之为优化目标。这里的优化目标是:第一辆平板车剩余空间+第二辆平板车剩余空间。设决策变量Ci类包装箱厚度为ti厘米,重量wi公斤,件数为ni件。第一辆车装载Cixi件,第二辆车装载Ciyi件。则第一辆车剩余空间为:
    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=1020i=17tixi
    第二辆车剩余空间为:
    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=1020i=17tiyi
    目标函数为:
    m i n Z = Z 1 + Z 2 minZ=Z_1+Z_2 minZ=Z1+Z2
    此时优化目标已经get,即目标函数表示出来。
  2. 第二步就是约束条件
    件数满足: 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=17wixi<=40000,i=17wiyi<=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=17tixi<=1020,i=17tiyi<=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=57ti(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=(1020i=17tixi)+(1020i=17tiyi)
    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
在这里插入图片描述

  • 8
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值