优化模型讲解 附LINGO程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数学建模培训讲义
——优化模型与LINGO软件
二○一一年七
目录
1 静态优化模型 (1)
1.1 最优生产计划问题 (1)
1.2 存贮模型 (2)
2 线性规划模型 (2)
2.1 LINGO简介 (2)
2.2 配料问题 (3)
2.3 练习:运输问题 (4)
3 整数规划模型 (4)
3.1 电影院广告问题 (4)
3.2 练习:生产计划问题 (5)
4 0-1规划 (5)
4.1 背包问题 (5)
4.2 矿井选址问题 (6)
4.3 练习:混合泳接力队的选拔问题 (7)
5 LINGO应用 (8)
5.1 变量定界函数 (8)
5.2 集合 (8)
5.3 帆船生产问题 (9)
5.4 派生集合 (11)
5.5 通过电子表格(Excel)文件传递数据 (12)
5.6 旅游问题 (13)
优化模型与LINGO 软件
优化问题是计划管理工作中经常要碰到的问题,比如,出门旅行就要考虑选择什么样的路线和交通工具,才能使旅行费用最省或使所花费的时间最少。
在工厂技术、经济管理和科学研究等领域中,最优化问题就更多,一个工厂要怎样安排产品的生产,才能获得最大利润?一个设计部门要考虑在满足结构强度的要求下怎样使得所用的材料的总重量最轻?
比较有效的求解优化问题的一个方法使数学规划,它包括:线性规划、非线性规划、整数规划、动态规划和多目标规划等等。
用数学建模的方法来处理一个优化问题的时候,首先要确定优化的目标是什么,寻求的决策是什么,决策受到哪些条件的限制(如果有限制的话),然后用数学工具(变量、函数等)表示它们。
1 静态优化模型
静态优化模型,归结为微积分中的函数极值问题,可以直接用微分法求解。
1.1 最优生产计划问题
一计算机公司引进A 、B 两种类型的芯片技术,总耗资400000元,准备生产这两种类型的芯片出售。
生产一片A 芯片的成本为1950元,而市场售价为3390元,生产一片B 芯片的成本为2250元,而市场售价3990元。
由于市场存在竞争,每售出一片A 芯片,A 芯片就会降价0.1元,并且令B 芯片降低0.04元,每售出一片B 芯片,B 芯片就会降价0.1元,并且令A 芯片降价0.03元。
假设生产的芯片都能卖出,求一生产计划,以获得最大利润。
模型分析:
假设A 、B 两种芯片的数量分别是1x 和2x ,市场价格分别是1p 和2p ,用R 表示出售芯片的总收入,用C 表示生存芯片的总费用,用P 表示总利润。
根据题意,上述变量有如下关系:
11233900.10.03p x x =-- 21239900.040.1p x x =--
1122R p x p x =+
1240000019502250C x x =++
P R C =- 模型建立:
根据上述分析,可得优化模型
22
112212max 14400.117400.10.07400000P x x x x x x =-+---
.s t 1,x 20x ≥且为整数 模型求解:
用微分法求解
121
122
14400.20.0717400.070.2P
x x x P x x x ∂⎧=--⎪∂⎪⎨
∂⎪=--⎪∂⎩ 最优解是
14735x =,27043x =
此时
max 9136410P =
1.2 存贮模型
详见“静态优化模型”PDF 文档。
2 线性规划模型
如果约束条件和目标函数都是线性的,称之为线性规划模型。
例如: 12max 25f x x =+
12
12124
3.28,0
x x s t x x x x ≤⎧⎪≤⎪⎨+≤⎪⎪≥⎩
解法一:两个变量的线性规划模型的图解法 解法二:消元法(迭代法) 解法三:单纯形法(迭代法演化) 解法四:LINGO 软件求解
max=2*x1+5*x2; x1<=4; x2<=3; x1+2*x2<=8; 2.1 LINGO 简介
LINGO 是英文“Linear Interactive And General Optimizer ”字首的缩写形式,即“交互式线性和通用优化求解器”,其语法特点是:
(1)语句的顺序不重要,因为LINGO 总是根据“max =”或“min =”语句寻找目标函数,而其他语句都是约束条件,也可以没有约束条件。
(2)LINGO 不区分大小写,但变量必须以字母开头。
(3)LINGO 默认所有变量非负。
(4)LINGO 模型是由一系列语句组成,每个语句都是以“;”结尾,编写程序时应注意保持模型的可读性,同时保持语法的严谨性。
(5)LINGO 中以感叹号“!”开始的是说明语句(说明语句也必须以“:”结束)。
LINGO 软件的具体用法在模型中介绍。
表1 各版本信息
2.2 配料问题
某养鸡场饲养一批小鸡,对小鸡健康成长的基本营养元素有三种,简单地称为A 、B 、C 。
这批小鸡每日对这三种营养的最低需要量是:元素A 为12单位,元素B 为36单位,元素C 为恰好为24单位,C 元素不够或过量都是有害的。
现市场供应的饲料有甲、乙两种,甲饲料每千克5元,所含的营养元素A 为2单位,B 为2单位,C 为2单位;乙饲料每千克4元,所含的营养元素A 为1单位,B 为9单位,C 为3单位。
养鸡场负责人希望得到甲乙两种饲料的混合饲料最优配比,既能满足小鸡健康成长的需要,又能降低饲料的费用。
模型建立:
假设甲饲料每天需求1x 千克,乙饲料每天需求2x 千克,每天饲料总费用为f 。
12min 54f x x =+
121
2
12122122936.2324,0x x x x s t x x x x +≥⎧⎪+≥⎪⎨+=⎪⎪≥⎩ LINGO 程序:
min=5*x1+4*x2;
2*x1+x2>=12; 2*x1+9*x2>=36; 2*x1+3*x2=24; 2.3 练习:运输问题
设有两个煤厂甲和乙,每月进煤数量分别为60和100吨,联合供应三个居民区A 、B 、C ,三个居民区每月对煤的需求量依次为50吨、70吨和40吨。
煤厂到各个居民区的运输费用如图所示,如何分配供煤量使得总费用最少?
3 整数规划模型
部分变量或全部变量要求取整数,称为整数规划模型。
LINGO 程序中通过“@gin(变量)”命令限制变量为整数,例如:
12max 43f x x =+
121212
410.238,0x x s t x x x x +≤⎧⎪
+≤⎨⎪≥⎩且为整数 LINGO 程序:max=4*x1+3*x2; 4*x1+x2<=10; 2*x1+3*x2<=8; @gin(x1); @gin(x2); 3.1 电影院广告问题
某小型工厂计划每周花71元在两个小型电影院加映广告片,推销该厂的产品,为了获得更多的观众,要合理的在两个电影院里分配经费。
已知甲电影院加映广告片的时间为4分钟,每放映一次要付12元,预计每次有200人观看,该电影院每周仅能为该厂提供13分钟广告时间;乙电影院广告片的时间为2分钟,每次收费16元,预计每次300人观看,该电影院仅能为该厂提供7分钟广告时间。
若观众人数以百人计,试建立数学模型解答。
12
8
4
乙
6510甲C B A
假设每周在甲电影院放映广告1x 次,在乙电影院放映2x 次,观看的观众总数为f 。
12max 23f x x =+
121
212121671413.27,0x x x s t x x x +≤⎧⎪≤⎪
⎨≤⎪⎪≥⎩且为整数 LINGO 程序:
max=2*x1+3*x2; 12*x1+16*x2<=71; 4*x1<=13; 2*x2<=7; @gin(x1); @gin(x2);
3.2 练习:生产计划问题
某工厂拥有A 、B 、C 三种类型的设备,生产甲、乙两种产品,每件产品在生产中需要占用的设备时数、每件产品可以获得的利润以及三种设备可利用的时数如表所示。
问题:工厂应如何安排生产可获得最大的利润?
4 0-1规划
0-1规划是整数规划中的一种特殊情形,当决策变量i x 只能取0或1时,这样的整数规划称之为0-1规划。
约束条件可以写成“01,i x ≤≤且为整数”,LINGO 中通过“@bin(变量)”命令实现。
4.1 背包问题
一旅行者的背包最多只能装6kg 的物品,待装的物品有4件,它们的重量和价值依次为:2kg ,1元;3kg ,1.2元;3kg ,0.9元;4kg ,1.1元。
那么他的背包中携带哪些物品可使价值最大?
设备设备能力产品乙产品甲2500
1500利润(元/件)
75
30设备C
4012设备B 6523A
/h
用i x 表示第i 种物品是否被携带,令
1,0,i i x i ⎧=⎨
⎩携带第种物品
不携带第种物品
携带物品的总价值记为f 。
1234max 1.20.9 1.1f x x x x =+++
123423346
.01,1,2,3,4)i i x x x x s t x x i +++≤⎧⎨
≤≤=⎩且为整数( LINGO 程序:
max=x1+1.2*x2+0.9*x3+1.1*x4; 2*x1+3*x2+3*x3+4*x4<=6; @bin(x1); @bin(x2); @bin(x3); @bin(x4); 4.2 矿井选址问题
某煤矿准备在5个矿井挖煤,现在有10个矿井可供选择,设10个矿井的代号为A1、 A2、…、A10,相应的开采费用分别为8、9、3、10、4、7、5、14、11、8,对矿井的选择要满足以下限制条件: (1)或选A1和A7,或选A8;
(2)在A4、A5、A6、A7中最多只能选两个; (3)选择A3或A4,就不能选择A5,反之亦然。
如何选择,才能使开采总费用最小? 模型建立:
用i x 表示第i 个矿井是否被选择,令
1,0,i i x i ⎧=⎨⎩选择第个矿井
不选择第个矿井
开采总费用记为f 。
12345678910max 8931047514118f x x x x x x x x x x =+++++++++
10
1
187845673545511.211
01,1,2,
,10)
i i i i x x x x x s t x x x x x x x x x x i =⎧=⎪⎪+=⎪⎪
+=⎪⎨
+++≤⎪⎪+≤⎪
+≤⎪⎪≤≤=⎩∑且为整数(
LINGO 程序:
max=8x1+9*x2+3*x3+10*x4+4*x5+7*x6+5*x7+14*x8+11*x9+8*x10; x1+x2+x3+x4+x5+x6+x7+x8+x9+x10=5; x1+x8=1; x7+x8=1; x4+x5+x6+x7<=2; x3+x5<=1; x4+x5<=1; @bin(x1); @bin(x2); @bin(x3); @bin(x4); @bin(x5); @bin(x6); @bin(x7); @bin(x8); @bin(x9); @bin(x10);
4.3 练习:混合泳接力队的选拔问题
某学校准备从5名游泳队员中选拔4人组成接力队,参加学校的4×100m 混合泳接力赛。
5名队员4种泳姿的百米平均成绩如表所示,问如何选拔队员组成接力队?
1分02秒4
57秒2
59秒4
53秒
58秒6
自由泳
1分23秒81分09秒61分24秒61分06秒41分27秒蛙泳1分11秒1分14秒21分07秒81分06秒1分15秒6仰泳1分07秒41分10秒1分18秒57秒21分06秒8蝶泳戊
丁
丙
乙
甲
5 LINGO 应用
5.1 变量定界函数
变量定界函数对变量的取值范围附加限制,共有以下四种函数: @bnd(a,x,b):限制a x b ≤≤。
@bin(x):限制x 为0或1。
@free(x):取消对x 的符号限制,即可取负数、0或正数。
@gin(x):限制x 为整数。
5.2 集合
理解LINGO 建模语言最重要的是理解集合及其属性的概念。
一段完整的LINGO 程序以“model:”开始,以“end ”结束,中间的程序语句由三部分构成:
(1)集合定义部分:以“sets:”开始,以“endsets ”结束,用来定义集合及其属性。
程序格式:“集合名称/集合元素/:集合属性”。
(2)数据输入部分:以“data:”开始,以“enddata ”结束,用以对属性赋值。
程序格式:“集合属性=常量值”。
(3)其他部分:给出目标函数及约束条件。
例如,4.1背包问题。
模型建立:
用i c 表示第i 种物品的价值,i d 表示第i 种物品的重量,i x 表示第i 种物品是否被携带,则
1,0,i i x i ⎧=⎨
⎩携带第种物品
不携带第种物品
携带物品的总价值记为f 。
4
1max i i i f c x ==∑
4
16.01,1,2,3,4)
i i i i i d x s t x x i =⎧≤⎪⎨⎪≤≤=⎩∑且为整数( LINGO 程序:
model: sets:
wupin/1,2,3,4/:c,d,x; endsets
data:
c=1,1.2,0.9,1.1;
d=2,3,3,4;
enddata
max=@sum(wupin(i):c(i)*x(i));
@sum(wupin(i):d(i)*x(i))<=6;
@for(wupin(i):@bin(x(i)));
end
说明:(1)调用系统函数,函数命令前缀为“@”。
(2)命令“@sum ”等价于求和符号“∑”,其程序格式是
@sum(集合(下标):关于集合属性的表达式)
(3)命令“@for ”是循环函数,其程序格式是
@for(集合(下标):关于集合属性的表达式)
5.3 帆船生产问题
SAILCO 公司需要决定下四个季度的帆船生产量。
下四个季度帆船的需求量分别是40条,60条,75条,25条,这些需求必须按时满足,每个季度正常的生产能力是40条帆船,每条船的生产费用为400美元。
如果加班生产,每条船的生产费用为450美元。
每个季度末,每条帆船的库存费用为20美元。
假定初始库存为10条帆船,如何安排生产,使总费用最小?
模型建立:
设i z (1,2,3,4i =)表示第i 个季度的正常产量,i j 表示第i 个季度的加班产量,i k 表示第i 个季度的库存量,i x 表示第i 个季度的需求量,0k 表示初始库存量,总费用记为f ,于是
4
00min (40045020)
40.10
,,0i i i i i i
i i i i i i f z j k z k k z j x s t k z j k ==++≤⎧⎪=++-⎪⎨=⎪⎪≥⎩∑且为整数
Lingo 程序(一):一般解放!
min=400*z1+450*j1+20*k1
+400*z2+450*j2+20*k2
+400*z3+450*j3+20*k3
+400*z4+450*j4+20*k4;
z1<=40;
z2<=40;
z3<=40;
z4<=40;
k0=10;
k1=k0+z1+j1-40;
k2=k1+z2+j2-60;
k3=k2+z3+j3-75;
k4=k3+z4+j4-25;
@gin(z1);
@gin(z2);
@gin(z3);
@gin(z4);
@gin(j1);
@gin(j2);
@gin(j3);
@gin(j4);
@gin(k1);
@gin(k2);
@gin(k3);
@gin(k4);
LINGO程序(二):集合解法!
model:
sets:
jd/1,2,3,4/:z,j,k,x;
endsets
data:
x=40,60,75,25;
enddata
min=@sum(jd(i):400*z(i)+450*j(i)+20*k(i));
@for(jd(i):z(i)<=40);
k(1)=10+z(1)+j(1)-x(1);
@for(jd(i)|i#gt#1:k(i)=k(i-1)+z(i)+j(i)-x(i));
@for(jd(i):@gin(z(i)));
@for(jd(i):@gin(j(i)));
@for(jd(i):@gin(k(i)));
end
说明:(1)“#gt#”是逻辑运算符,意思是“大于”;逻辑关系式“i#gt#1”的意思就是“i>1”。
LINGO 中的逻辑运算符有九种,分别是
(2)当1i =时0k 不包含在集合属性中,故在程序中必须将1i =时的约束条件单独写出,即“k(1)=10+z(1)+j(1)-x(1);”。
而对2,3,4i =的循环情况,需要增加逻辑关系式“i#gt#1”,这个限制条件与
集合之间用竖线“|”分开,称为过滤条件,即“@for(jd(i)|i#gt#1:k(i)=k(i-1)+z(i)+j(i)-x(i));”,意思就是“i>1(即2,3,4i =)时成立”。
5.4 派生集合
根据上述集合知识,集合的属性相当于以集合的元素为下标的数组。
例如,“i x ”表示属性x 的一维数组;那么,“ij x ”应该表示属性x 的二维数组,它的两个下标应该来自于两个集合的元素,即两个集合派生出来的二维集合,这种表示方式与矩阵的表示非常相似,因此LINGO 建模语言也称为矩阵生成器。
直接把元素列举出来的集合,称为基本集合。
基于基本集合而派生出来的二维或多维集合称为派生集合。
派生集合程序格式:“派生集合名称(基本集合1,基本集合2):派生集合属性”。
例如,2.3运输问题。
模型建立:
假设(1,2)i k i =表示第i 个煤厂的进煤量,(1,2,3)j q j =表示第j 个小区的需求量,ij c 表示第i 个煤厂到第j 个小区的运输费用,ij x 表示第i 个煤厂到第j 个小区的供煤量,总费用记作f 。
23
11
3
12
1
min (1,2)
.(1,2,3)
0(1,2;1,2,3)ij ij
i j ij i j ij i i ij f c x x k i s t x q j x i j =====⎧==⎪⎪⎪==⎨⎪⎪≥==⎪⎩
∑∑∑∑ LINGO 程序:
model:
sets:
mc/jia,yi/:kc;
jm/a,b,c/:xq;
links(mc,jm):c,x;
endsets
data:
kc=60,100;
xq=50,70,40;
c=10,5,6
4,8,12;
enddata
min=@sum(links(i,j):c(i,j)*x(i,j));
@for(mc(i):@sum(jm(j):x(i,j))=kc(i));
@for(jm(j):@sum(mc(i):x(i,j))=xq(j));
end
5.5 通过电子表格(Excel )文件传递数据
实际应用中,可能有大量数据是存放在Excel 电子表格中,LINGO 通过“@ole ”函数实现与Excel 文件进行数据传递,只能用在模型的集合段和数据段,其三种调用格式是:
(1)集合名/@ole(‘文件名.xls ’,’单元名’/:引用指定Excel 文件中的指定单元数据作为集合的元素。
(2)属性=@ole(‘文件名.xls ’,’单元名’):数据输入格式,将指定Excel 文件中的指定单元数据赋值给属性。
(3)@ole(‘文件名.xls ’,’单元名’) =属性:数据输出格式,将属性的值赋给指定Excel 文件中的指定单元。
备注:调用时,务必保证Excel 文件与LINGO 程序文件在同一个文件夹下。
例如,4.3混合泳接力队的选拔问题。
模型建立:
假设用(1,2,3,4,5;1,2,3,4)ij t i j ==表示第i 名队员的第j 种泳姿的成绩,ij x 表示第i 名队员的第j 种泳姿是否被选择,则
1,0,ij i j x i j ⎧=⎨⎩第名队员的第种泳姿被选择第名队员的第种泳姿未被选择
接力队总成绩记为f 。
54
115
14
1
min 1(1,2,3,4)
.1(1,2,3,4,5)
01(1,2,3,4;1,2,3,4,5)ij ij
i j ij j ij i ij f t x x i s t x j x i j =====⎧==⎪⎪⎪≤=⎨⎪⎪≤≤==⎪⎩
∑∑∑∑且为整数 LINGO 程序:
model:
sets:
dy/@ole('游泳接力队的选拔问题.xls','duiyuan')/;
yz/@ole('游泳接力队的选拔问题.xls','yongzi')/;
xb(dy,yz):t,x;
endsets
data:
t=@ole('游泳接力队的选拔问题.xls','chengji');
enddata
min=@sum(xb(i,j):t(i,j)*x(i,j));
@for(dy(i):@sum(yz(j):x(i,j))<=1);
@for(yz(j):@sum(dy(i):x(i,j))=1);
@for(xb(i,j):@bin(x(i,j)));
end
5.6 旅游问题
从北京乘飞机到东京、纽约、墨西哥城、伦敦、巴黎五个城市做旅游,每个城市去。