实验5 优化模型求解实验 二.docx
- 文档编号:30068848
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:18
- 大小:150.38KB
实验5 优化模型求解实验 二.docx
《实验5 优化模型求解实验 二.docx》由会员分享,可在线阅读,更多相关《实验5 优化模型求解实验 二.docx(18页珍藏版)》请在冰豆网上搜索。
实验5优化模型求解实验二
实验5优化模型求解实验
(二)
一、实验目的和要求
掌握用Lingo软件求解优化模型的编程方法。
二、实验环境
Windows系列操作系统,Lingo软件。
三、实验内容
使用示例的内容学习Lingo中关于集的定义,进一步练习集循环函数。
四、实验步骤
(1)从网络教学平台下载实验文件到本地机上;
(2)练习实验内容中的相应例题;
(3)根据练习内容完成练习题1.
五、实验结果:
提交练习题1的程序及实验结果
一、定义一个基本集(原始集)
基本集的格式为:
集合名/成员1,成员2,…/:
属性1,属性2,…;
例1产生表示价格的向量x=[352645786966]:
在模型窗口中输入如图1:
sets:
price/1..6/:
x;
endsets
data:
x=352645786966;
enddata
图1
运行得到:
VariableValue
X
(1)35.00000
X
(2)26.00000
X(3)45.00000
X(4)78.00000
X(5)69.00000
X(6)66.00000
例2定义一个名为产品的的基本集(可记为products),包括三种产品A,B和C(即它具有成员A,B和C),现在想研究它们对应的单位价格120、100和80以及对应的质量等级1、2和3(即属性可以记为price,quality)
在模型窗口中输入如图2:
sets:
products:
price,quality;
endsets
data:
products,price,quality=A1201B1002C803;
enddata
图2
运行结果为:
VariableValue
PRICE(A)120.0000
PRICE(B)100.0000
PRICE(C)80.00000
QUALITY(A)1.000000
QUALITY(B)2.000000
QUALITY(C)3.000000
学习要点:
(1)定义一个基本集:
集合名/集合的成员/:
属性,属性,…,属性;
(2)集合要夹在sets和endsets之间;
(3)连续可编号的n个成员可以使用1..n或用带字母的编号表示如w1..wn来输入,也可以直接以逗号间隔,将n个成员输入为w1,…,wn;
(4)数据部分要夹在data和enddata之间;
(5)成员可以当作数据输入.
二、定义一个派生集
派生集的基本格式:
派生集名(基本集1,基本集2,…):
属性1,属性2,…;
例3导入矩阵
.
在模型窗口中输入如图3:
图3
sets:
row/1..2/;
column/1..3/;
links(row,column):
A;
endsets
data:
A=124
456;
enddata
运行结果为:
VariableValue
A(1,1)1.000000
A(1,2)2.000000
A(1,3)4.000000
A(2,1)4.000000
A(2,2)5.000000
A(2,3)6.000000
例4产生矩阵
,其中“-”表示对应位置没有数据.
在模型窗口中输入如图4:
图4
sets:
row/1..3/;
column/1..3/;
links(row,column)/1,11,32,12,23,23,3/:
B;
endsets
data:
B=214012222231;
enddata
运行结果为:
VariableValue
B(1,1)21.00000
B(1,3)40.00000
B(2,1)12.00000
B(2,2)22.00000
B(3,2)22.00000
B(3,3)31.00000
例5在模型窗口中输入:
sets:
product/1..2/;
quality/1..2/;
cost/1..2/;
links(product,quality,cost):
x;
endsets
运行后会发现:
派生集合links产生八个成员:
(1,1,1),(1,1,2),(1,2,1),(1,2,2),(2,1,1),(2,1,2),(2,2,1),(2,2,2).
学习要点:
(1)派生集的基本格式为:
派生集名(基本集1,基本集2):
属性1,属性2,…,属性n;利用派生集可以产生多维数组,它是基本集合成员的所有可能组合;
(2)对于派生集,可以定义其具体的成员,其格式与基本集的格式类似:
派生集名(基本集1,基本集2)/成员/:
属性1,属性2,…,属性n;
(3)在例4中只取了派生集links中的一些元素,也称为稀疏集.
三、集循环函数
集循环函数是指对集合的元素进行循环操作的函数,其格式为:
@函数名(集合(指标)|过滤条件:
表达式)
函数有for,max,min,prod,sum五种,分别表示对集合满足过滤条件的每一元素:
独立生成表达式,求最大元素,求最小元素,计算乘积,求和.下面以简单例子来介绍@for和@sum函数的使用:
1、@for
例6产生序列{4916253649}.
在模型窗口中输入:
model:
sets:
number/1..7/:
x;
endsets
@for(number(i)|i#ge#2:
x(i)=i^2);
end
运行结果为:
X
(2)4.000000
X(3)9.000000
X(4)16.00000
X(5)25.00000
X(6)36.00000
X(7)49.00000
2)@sum求和
例7对数列12546求和.
在模型窗口中输入:
model:
sets:
number/1..5/:
x;
endsets
S=@sum(number(I):
x(I));
data:
x=12546;
enddata
end
运行结果为:
VariableValue
S18.00000
X
(1)1.000000
X
(2)2.000000
X(3)5.000000
X(4)4.000000
X(5)6.000000
学习要点:
(1)一个模型可写在model和end之间,这是为了表示一个完整的模型,不至于与模型窗口中的其它模型混淆;
(2)集合中使用符号“|”表示其后为过滤条件,只有集合中满足条件的指标才执行其后的表达式;
(3)如使用循环函数时,其中number(i)表示集合number中的第i个元素,循环函数就会遍历number中满足条件的每个元素,执行其后所有表达式;
(4)“ge”为逻辑符号,表示“大于等于”,逻辑运算符使用时要夹在“#”之间;所有逻辑运算符按优先级顺序由高到低排序为:
not(非);eq(等于),ne(不等于),gt(大于),lt(小于);ge(大于等于),le(小于等于);and(与),or(或).
六、练习:
1.编程求解课本§4.3节中例1自来水输运问题。
min=160*x11+130*x12+220*x13+170*x14+140*x21+130*x22+190*x23+150*x24+190*x31+200*x32+230*x33;
x11+x12+x13+x14=50;
x21+x22+x23+x24=60;
x31+x32+x33=50;
x11+x21+x31>=30;
x11+x21+x31<=80;
x12+x22+x32>=70;
x12+x22+x32<=140;
x13+x23+x33>=10;
x13+x23+x33<=30;
x14+x24>=10;
x14+x24<=50;
通过求解得到,运输方案为:
A水库向乙水区供水50,B水库向乙水区供水50,向丁水区供水10,C水库向甲水区供水40,向丙水区供水10.此时引水管理费为24400元,利润最大为144000-72000-24400=47600元。
每个水库的最大水量提高一倍时:
min=290*x11+320*x12+230*x13+280*x14+310*x21+320*x22+260*x23+300*x24+260*x31+250*x32+220*x33;
x11+x12+x13+x14<=100;
x21+x22+x23+x24<=120;
x31+x32+x33<=100;
x11+x21+x31>=30;
x11+x21+x31<=80;
x12+x22+x32>=70;
x12+x22+x32<=140;
x13+x23+x33>=10;
x13+x23+x33<=30;
x14+x24>=10;
x14+x24<=50;
通过运算可得,A水库向乙区供水100,B水库向甲,乙,丙区分别供水30,40,50,C水库向甲,丙区分别供水50,30,总理韵味88700元。
2.编程求解课本§4.3节中例2货机装运问题。
sets:
cang/1..3/:
WET,VOL;
wu/1..4/:
w,v,p;
limk(wu,cang):
x;
endsets
data:
WET=10,16,8;VOL=6800,8700,5300;
w=18,15,23,12;
v=480,650,580,390;
p=3100,3800,3500,2850;
enddata
max=@sum(wu(i):
p(i)*@sum(cang(j):
x(i,j)));
@for(wu(i):
@sum(cang(j):
x(i,j)) @for(cang(j): @sum(wu(i): x(i,j)) @for(cang(j): @sum(wu(i): v(i)*x(i,j)) @for(cang(j): @for(cang(k)|k#GT#j: @sum(wu(i): x(i,j)/WET(j))=@sum(wu(i): x(i,k)/WET(k)));); end 结果为货物2装入前舱10t,装入后舱5t,货物3装入中仓13t,装入后舱3t,货物4装入中仓3t,最大利润约为121516元。 3. 求解运输问题 学习了LINGO的集合操作之后,运输问题就可以编写成简单的LINGO程序来求解. 例计算有5个产地A1—A5,8个销地B1-B8的运输问题的最优调运方案.单位运价表如表: 单位运价销地 产地 B1 B2 B3 B4 B5 B6 B7 B8 产量 A1 2 7 1 9 2 3 5 2 40 A2 5 8 4 1 6 5 5 5 20 A3 4 1 2 7 4 4 4 4 30 A4 3 7 6 3 2 2 6 2 45 A5 6 2 8 4 5 7 6 4 25 销量 23 45 18 24 48 36 50 20 要求: 建立具体模型,并给出Lingo程序和求解结果。 六个产地的总产量和为160,8个销售地的销量和为264,故产销不平衡,销大于产.定义集合workshop为有六个成员的产地,shop为有八个成员的销地,a为产量,b为销量,c为单位运价,x为待求调运量,编写程序如下: model: sets: workshop/w1..w5/: a; shop/v1..v8/: b; links(workshop,shop): c,x; endsets min=@sum(links(i,j): c(i,j)*x(i,j)); @for(shop(j): @sum(workshop(i): x(i,j))<=b(j)); @for(workshop(i): @sum(shop(j): x(i,j))=a(i)); data: a=4020304525; b=2345182448365020; c=27192352 58416555 41274444 37632262 62845764; enddata end 出师表 两汉: 诸葛亮 先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。 然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。 诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。 宫中府中,俱为一体;陟罚臧否,不宜异同。 若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理;不宜偏私,使内外异法也。 侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下: 愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。 将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰“能”,是以众议举宠为督: 愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。 亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。 先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。 侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之、信之,则汉室之隆,可计日而待也 。 臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。 先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。 后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。 先帝知臣谨慎,故临崩寄臣以大事也。 受命以来,夙夜忧叹,恐托付不效,以伤先帝之明;故五月渡泸,深入不毛。 今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。 此臣所以报先帝而忠陛下之职分也。 至于斟酌损益,进尽忠言,则攸之、祎、允之任也。 愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。 若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏。 臣不胜受恩感激。 今当远离,临表涕零,不知所言。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验5 优化模型求解实验 实验 优化 模型 求解