Lingo教案.docx
- 文档编号:26118544
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:22
- 大小:260.23KB
Lingo教案.docx
《Lingo教案.docx》由会员分享,可在线阅读,更多相关《Lingo教案.docx(22页珍藏版)》请在冰豆网上搜索。
Lingo教案
第Ⅱ部分运筹学实验
§1LINGO快速入门
一、LINDO/LINGO软件简介
LINDO和LINGO是美国LINDO系统公司开发的一套专门用于求解最优化问题的软件,这源于芝加哥大学的LinusSchrage教授于1980年前后开发的一套专门用于求解最优化问题的软件包.
LINDO用于求解线性规划和二次规划.目前LINGO除了具有LINDO的全部功能外,还可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解以及代数方程求根等.
LINDO和LINGO软件的最大特色是可以求解决策变量为整数的优化问题,而且执行速度很快.LINGO实际上是一种最优化问题的建模语言,简单易学、包括许多常用的函数可调用,并提供与其它数据文件的接口,易于输入、求解和分析大规模最优化问题.由于这些特点,LINDO和LINGO软件在教学、科研、工业、商业和服务等领域得到广泛应用.
本章着重在MicrosoftWindows系统下,介绍lingo9.0在运筹学中的使用和课本中相关问题求解的LINGO实现.
二、LINGO软件的安装
LINGO软件的安装非常简单,在Windows系统下双击运行安装光盘(或其它源)中的安装程序setup.exe,接受安装协议,选择安装目录,选择默认的LINGO语法(recommended),最后完成(finish)安装.
安装完成后,第一次运行LINGO软件,这时提示要输入密码,输入正版的密码输入,即可以使用LINGO软件;当然可以选择测试/试用(demo)版本,这时求解变量不能超过300个.运行成功后得到如下窗口:
图1.1
图1.1中:
File(文件)、Edit(编辑)、LINGO、Window(窗口)和Help为下拉菜单项,下面一行为菜单项中的一些快捷工具按钮.主窗口LINGOModel为输入模型的窗口,在没有命名保存(save)模型时,LINGO自动命名为LINGO1,LINGO2等.
点击help菜单的AboutLINGO可以获得版本的相关信息,如约束(constrain)、变量(variable)、整数变量(integervariable)、非线性变量(nonlinearvariable)的限定个数,可用内存(generatormemory)使用等.
§2求解规划问题
一、LINGO求解LP问题
下面就用简单的例子来说明LINGO中线性规划问题的求解.
例2.1求如下线性规划问题:
在LINGO模型窗口中图2.1输入:
图2.1
学习要点:
(1)输入max,min后LINGO就会识别优化类型;
数学运算符“乘号,除号,乘方”分别输入“*,/,^”;
关系运算符“
,
”分别输入“>=,<=”来表示;
每行命令结束用“;”来表示.
(2)算术运算符按优先级从高到低排序为:
-(负号);^;*,/;+,-(减号)
(3)关系运算符按优先级从高到低排序为:
<,=,>.
输入完毕后,点击求解按钮
(或依次点击菜单LINGO/Solve,或按Ctrl+S),求解状态窗口(LINGOSolveStatus)被激活,如图2.2:
图2.2
此窗口显示:
当前的求解状态,包括模型的类型(Model),解的状态类型(State),目标值(objective)等,如果模型由于陷入循环等一时无法得到解,可以点击中断求解按钮(InterruptSolver).
学习要点:
(1)LINGO默认所有变量非负.
(2)LINGO关于求解的种类一般有如下几种(在asibility处显示):
0全局最优(GlobalOptimum)
1不可行(Infeasible)
2无界(Unbounded)
3不确定(Undetermined)
4可行(Feasible)
5可行或者无界(InfeasibleorUnbounded)
6局部最优(LocalOptimum)
7局部不可行(LocallyInfeasible)
8目标函数的截断值被达到(Cutoff)
9算术运算错误而停止(NumericError)
当关闭(Close)求解状态窗口时,求解报告窗口(SolutionReport)被激活,如图2.3:
图2.3
求解报告显示:
求解所需的迭代次数(iteration)(线性规划默认单纯形法);变量的值(value);及变量变化一个单位时,目标值发生的变化量(ReducedCost);以及松弛或剩余变量(SlackorSurplus,按模型输入行的顺序显示)的值和对偶价格(DualPrice).
二、LINGO求解ILP问题
例2.2求如下整数规划问题:
在LINGO模型窗口中按如图2.4输入:
图2.4
点击求解按钮,就会得到:
求解状态窗口显示为纯整数规划(PILP),全局最优解得到.求解报告窗口显示最优解为x1=4,x2=1,最优值为14.
学习要点:
(1)“!
”后面可添加为注释语句(注释以英文标识下“;”结束);
“title”命令可以添加文档的标题和注释,在解的报告里会显示;
LINGO只有在“!
”和“title”命令后才可以使用中文字符.
(2)LINGO不区分大小写;
(3)LINGO模型的目标、约束和约束之间的顺序可以颠倒;
(4)变量界定函数:
@gin(x):
限制x为整数.
@bin(x):
限制x为0或1;@bnd(L,x,U):
限制L≤x≤U;
@free(x):
取消对变量x的默认下界为0的限制,即x可以为任意
实数;
其中符号“@”表示调用函数;
三、LINGO求解非线性规划(NLP)问题
例2.3求如下非线性规划问题:
在模型窗口中输入:
max=10*x1+2*x1^2-*x1^3+9*x2-x2^3;x1+x2<=5;
运行结果为:
x1=2.61,x2=1.73,z=32.33.
§3灵敏度分析
对模型的目标函数的系数,约束右端项进行灵敏度分析,首先要激活灵敏度分析.依次点击菜单LINGO|Option|GeneralSolverTab,在DualComputations列表框中,选择PricesandRanges选项.当求解模型时,也作出了灵敏度分析,可以点击菜单LINGO中的Range(Ctrl+R)来查看.
例2.4对例1.1的线性规划模型,按照上述步骤作灵敏度分析,打开灵敏度分析报告(RangeReport)显示如图3.1:
图3.1
灵敏度分析报告中显示,当前模型中的目标系数(CurrentCoefficient),约束右端项(CurrentRHS),对应参数在其它条件不变的情况下,可允许的增加量和减少量(AllowableIncrease,AllowableDecrease),INFINITY表示无穷.
本例显示在其它参数不变的情况下,参数在下列变化范围内,最优基保持不变:
目标函数中
的系数为2,其允许变化范围为
,
的系数为3,其允许变化范围为
;第一个约束右端项为350,其允许变化范围为
,第二个右端项为100,其可变化范围为
,第三个右端项600,其可变化范围为
.
§4LINGO中集合的定义与操作
当模型的变量、数据较多时,按照前面按照模型逐个输入的办法,就显得力不从心了.LINGO是一种建模语言,使用LINGO语言可以通过输入简单的文字而代替大规模变量和约束,处理大型问题就得心应手.理解LINGO语言,最重要的是理解集合(sets)和属性(atrribute)的概念.下面我们从简单例子出发来说明这些问题.
一、定义一个基本集(原始集)
基本集的格式为:
集合名/成员1,成员2,…/:
属性1,属性2,…;
例4.1产生表示价格的向量x=[352645786966]:
在模型窗口中输入如图4.1:
图4.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
例4.2定义一个名为产品的的基本集(可记为products),包括三种产品A,B和C(即它具有成员A,B和C),现在想研究它们对应的单位价格120、100和80以及对应的质量等级1、2和3(即属性可以记为price,quality)
在模型窗口中输入如图4.2:
图4.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,…;
例4.3导入矩阵
.
在模型窗口中输入如图4.3:
图4.3
运行结果为:
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.4:
图4.4
运行结果为:
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
例4.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.4中只取了派生集links中的一些元素,也称为稀疏集.
三、集循环函数
集循环函数是指对集合的元素进行循环操作的函数,其格式为:
@函数名(集合(指标)|过滤条件:
表达式)
函数有for,max,min,prod,sum五种,分别表示对集合满足过滤条件的每一元素:
独立生成表达式,求最大元素,求最小元素,计算乘积,求和.下面以简单例子来介绍@for和@sum函数的使用:
1、@for
例4.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求和
例4.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(或).
§5求解运输问题
学习了LINGO的集合操作之后,运输问题就可以编写成简单的LINGO程序来求解.
例5.1计算有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
表5.1
分析:
六个产地的总产量和为160,8个销售地的销量和为264,故产销不平衡,销大于产.定义集合workshop为有六个成员的产地,shop为有八个成员的销地,a为产量,b为销量,c为单位运价,x为待求调运量,编写程序如图5.1:
图5.1
运行部分结果为:
Objectivevalue:
272.0000
X(W1,V1)0.000000
X(W1,V2)0.000000
X(W1,V3)8.000000
X(W1,V4)0.000000
X(W1,V5)12.00000
........
X(W5,V5)0.000000
X(W5,V6)0.000000
X(W5,V7)0.000000
X(W5,V8)0.000000
学习要点:
(1)当销大于产时,对任意的销地j,从各个产地调往j的调运量之和不大于b(j),即有需求约束中为小于等于号;若产大于销,则产量约束中为小于等于号;
(2)目标函数可以进一步简化为:
min=@sum(links:
c*x)不影响结果.
§6求解网络问题
一、最短路问题
例6.1用LINGO求解图论中§6.3中例6.3.1所示的图6.3.1中从始点1到终点8的最短路问题的求解.
分析:
图中有8个顶点,需求出从结点1到结点8的最短路;设决策变量
可把最短问题转化成一个规划问题,
其中
为弧
上的权(即结点
与结点
之间的距离)
在模型窗口中编写程序如图6.1:
图6.1
运行后部分结果为:
Objectivevalue:
12.00000
VariableValue
X(1,6)1.000000
X(5,8)1.000000
X(6,7)1.000000
X(7,5)1.000000
这表明路线
为从始点1到终点8的最短路,长度为12.
学习要点:
(1)对无向图要把始点出发的弧和到达终点的弧当作单向弧,其余的等价为双向弧;
(2)终点约束与其余约束线性相关可以省略;
二、最大流问题
例6.2下面介绍运用LINGO求解§6.4中例6.4.1中图6.4.1所示的从始点s到终点t的最大流问题的求解.
分析:
根据最大流问题的要求和平衡条件,用flow表示可行流量,可以把它转化成一个规划问题,
在模型窗口中编写程序如图6.2:
图6.2
运行得到一种最大流方案为:
FLOW22.00000
F(S,4)8.000000
F(2,3)4.000000
F(2,4)0.000000
F(2,5)10.00000
F(3,T)4.000000
F(4,5)8.000000
F(5,3)0.000000
F(5,T)18.00000
三、最小费用最大流问题
例6.3用LINGO求解书中§6.5中图6.5.1所示的从始点s到终点t的最小费用最大流问题的求解.
分析:
根据最大流问题的要求和平衡条件,用F表最大流量,可以把它转化成一个规划问题,
根据最大流的求法可求得此网络的最大流量Q=15,编写程序如图6.3:
图6.3
运行得到一种最小费用最大流方案为:
Objectivevalue:
69.00000
F(S,2)8.000000
F(S,3)7.000000
F(2,3)0.000000
F(2,T)9.000000
F(3,4)7.000000
F(4,2)1.000000
F(4,T)6.000000
这与增广链和最短路标号法求得的结果一致.
§7LINGO中外部数据文件的调用
一、LINGO中调用文本文件数据
调用文本数据函数@file(‘filename’)用于将文本文件中的数据调入LINGO模型中,可以写相对和绝对路径,文件中的每组数据之间用符号“~”间隔,LINGO将按照此函数在模型中出现的顺序依次读取每组数据.下面以简例说明之.
例7.1对x=[258]求和,对y=[3614]取其最小元.按如图7.1在模型窗口中编写程序:
图7.1
其中data1.txt文件与此模型放在同一目录下,内容编写如图7.2:
图7.2
运行结果可得:
S15.00000,P1.000000
二、LINGO中调用excel数据
电子表格数据调用函数@ole(‘filename’)用于将excel表中的数据导入LINGO,文件路径设置与@file函数一致,
例7.2对例7.1,可编程如图7.3:
图7.3
其中data2.xls文件与模型放在同一目录,编辑如图7.4:
图7.4
其中要定义单元格A3:
A5为集合的名称price,B3:
B5定义为x,C3:
C6定义为y.定义单元格名称的方法是:
选定要定义的单元格,依次打开菜单插入|名称|定义,输入想要定义的名称即可.
学习要点:
(1)@file和@ole函数可以在模型的集合段,数据段和开始段使用,其他段落不能使用.
(2)@ole函数的完整格式为:
@ole(‘filename.xls’,[rangelist]),其中rangelist为包含数据的单元范围(与excel表格中的记法一致)
(3)这两个函数在集合段可以直接采用@file(‘filename’)和@ole(‘filename’)的形式,而在数据段要采用x=@file(‘filename’)或@ole(‘filename’)格式.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Lingo 教案