Lingo学习笔记.docx
《Lingo学习笔记.docx》由会员分享,可在线阅读,更多相关《Lingo学习笔记.docx(51页珍藏版)》请在冰豆网上搜索。
Lingo学习笔记
Lindo&Lingo
总序
CUMCM赛题:
约一半以上与优化有关,需用软件求解
运筹学(OR:
Operations/OperationalResearch)
管理科学(MS:
ManagementScience)
决策科学(DS:
DecisionScience)
(最)优化理论是运筹学的基本内容
OR/运筹学(OR:
Operations/OperationalResearch)
MS/管理科学(MS:
ManagementScience)
DS决策科学(DS:
DecisionScience)
优化(Optimization),规划(Programming)
约束优化的简单分类
连续优化
线性规划(LP)目标和约束均为线性函数
非线性规划(NLP)目标或约束中存在非线性函数
二次规划(QP)目标为二次函数、约束为线性
离散优化
整数规划(IP)决策变量(全部或部分)为整数
整数线性规划(ILP),整数非线性规划(INLP)
纯整数规划(PIP),混合整数规划(MIP)
一般整数规划,0-1(整数)规划
网址:
LINDO:
LinearINteractiveandDiscreteOptimizer(V6.1)
LINGO:
LinearINteractiveGeneralOptimizer(V8.0)
LINDOAPI:
LINDOApplicationProgrammingInterface(V2.0)
What’sBest!
:
(SpreadSheete.g.EXCEL)(V7.0)
建模时需要注意的几个基本问题
1、尽量使用实数优化,减少整数约束和整数变量
2、尽量使用光滑优化,减少非光滑约束的个数
如:
尽量少使用绝对值、符号函数、多个变量求
最大/最小值、四舍五入、取整函数等
3、尽量使用线性模型,减少非线性约束和非线性变
量的个数(如x/y<5改为x<5y)
4、合理设定变量上下界,尽可能给出变量初始值
5、模型中使用的参数数量级要适当(如小于10^3)
3.LINDO/LINGO软件的使用简介
需要掌握的几个重要方面
1、LINDO:
正确阅读求解报告(尤其要掌握敏感性分析)
2、LINGO:
掌握集合(SETS)的应用;
正确阅读求解报告;
正确理解求解状态窗口;
学会设置基本的求解选项(OPTIONS);
掌握与外部文件的基本接口方法
reducedcost值表示当该(x1、x2、...)非基变量增加一个单位时(其他非基变量保持不变)目标函数减少的量(对max型问题)也可理解为:
为了使该非基变量变成基变量,目标函数中对应系数应增加的量。
影子价格
最优解下“资源”增加1单位时“效益”的增量
原料增1单位,利润增48
时间加1单位,利润增2
能力增减不影响利润
RANGESINWHICHTHEBASISISUNCHANGED:
最优解不变(是最优解不变,OBJECTIVEFUNCTIONVALUE要变化!
)标系数允许变化范围(约束条件不变)
影子价格有意义时约束右端的允许变化范围(目标函数不变)注意:
充分但可能不必要。
使用LINDO的一些注意事项
1.“>”(或“<”)号与“>=”(或“<=”)功能相同
2.变量与系数间可有空格(甚至回车),但无运算符
3.变量名以字母开头,不能超过8个字符
4.变量名不区分大小写(包括LINDO中的关键字)
5.目标函数所在行是第一行,第二行起为约束条件
6.行号(行名)自动产生或人为定义。
行名以“)”结束
7.行中注有“!
”符号的后面部分为注释。
如:
!
It’sComment.
8.在模型的任何地方都可以用“TITLE”对模型命名
(最多72个字符),如:
TITLEThisModelisonlyanExample
9.变量不能出现在一个约束条件的右端
10.表达式中不接受括号“()”和逗号“,”等任何符号,例:
400(X1+X2)需写为400X1+400X2
11.表达式应化简,如2X1+3X2-4X1应写成-2X1+3X2
12.缺省假定所有变量非负;可在模型的“END”语句
后用“FREEname”将变量name的非负假定取消
13.可在“END”后用“SUB”或“SLB”设定变量上下界
例如:
“subx110”的作用等价于“x1<=10”
但用“SUB”和“SLB”表示的上下界约束不计入模型
的约束,也不能给出其松紧判断和敏感性分析。
14.“END”后对0-1变量说明:
INTn或INTname
15.“END”后对整数变量说明:
GINn或GINname
二次规划(QP)问题
1.LINDO可求解二次规划(QP)问题,但输入方式较
复杂,因为在LINDO中不许出现非线性表达式
2.需要为每一个实际约束增加一个对偶变量
(LAGRANGE乘子),在实际约束前增加有关
变量的一阶最优条件,转化为互补问题
3.“END”后面使用QCP命令指明实际约束开始的行
号,然后才能求解
4.建议总是用LINGO解QP
[注意]对QP和IP:
敏感性分析意义不大
LINGO软件简介
LINGO模型的优点
1包含了LINDO的全部功能
2提供了灵活的编程语言(矩阵生成器)
LINGO模型的构成:
5个段
1目标与约束段
2集合段(SETSENDSETS)
3数据段(DATAENDDATA)
4初始段(INITENDINIT)
5计算段(CALCENDCALC)-LINGO9.0
常用文件后缀:
LG4(LONGO模型文件)
文本文件
LNG(LONGO模型文件)
LTF(LONGO脚本文件)
LDT(LONGO数据文件)
LRP(LONGO报告文件
第1章 引言
线性规划模型的解的几种情况
线性规划问题
有可行解(Feasible)
无可行解
有最优解(Optimal)
无最优解
第二章LINDO软件的基本使用方法
§2.1LINDO入门
LINDO程序有以下特点:
★程序以“MAX”(或“MIN”)开始,表示目标最大化(或最小化)问题,后面直接写出目标函数表达式和约束表达式;
★目标函数和约束之间用“ST”分开;
(或用“s.t.”,“sunjectto”)
★程序以“END”结束(“END”也可以省略)。
★系数与变量之间的乘号必须省略。
★系统对目标函数所在行自动生成行名“1)”,对约束默认的行名分别是“2)”“3)”…,用户也可以自己输入行名;行名放在对应的约束之前。
★书写相当灵活,不必对齐,不区分字符的大小写。
★默认所有的变量都是非负的,所以不必输入非负约束。
★约束条件中的“<=”及“>=”可分别用“<”及“>”代替。
★一行中感叹号“!
”后面的文字为是注释语句,可增强程序的可读性,不参与模型的建立。
求解时会首先显示如右图所示的LINDO
“求解器运行状态窗口”。
名称
含义
Status
(当前状态)
显示当前求解状态:
“Optimal”表示已经达到最优解;其他可能的显示还有三个:
Feasible(可行解),Infeasible(不可行),Unbounded(最优值无界)。
Iterations
(迭代次数)
显示迭代次数:
“2”表示经过了2次迭代。
Infeasibility
(不可行性)
约束不满足的量(即各个约束条件不满足的“数量”的和;特别注意不是“不满足的约束个数”):
“0”表示这个解是可行的。
Objective
(当前的目标值)
显示目标函数当前的值:
7.45455。
BestIP
(整数规划当前的最佳目标值)
显示整数规划当前的最佳目标值:
“N/A”(NoAnswer或NotApplicable)表示无答案或无意义,因为这个模型中没有整数变量,不是整数规划(IP)。
名称
含义
IPBound
(整数规划的界)
显示整数规划的界(对最大化问题显示上界;对最小化问题,显示下界):
“N/A”含义同上。
Branches
(分枝数)
显示分枝定界算法已经计算的分枝数:
“N/A”含义同上。
ElapsedTime
(所用时间)
显示计算所用时间(秒):
“0.00”说明计算太快了,用时还不到0.005秒。
UpdateInterval
(刷新本界面的时间间隔)
显示和控制刷新本界面的时间间隔:
“1”表示1秒;用户可以直接在界面上修改这个时间间隔。
InterruptSolver
(中断求解程序)
当模型规模比较大时(尤其对整数规划),可能求解时间会很长,如果不想再等待下去时,可以在程序运行过程中用鼠标点击该按钮终止计算。
求解结束后这个按钮变成了灰色,再点击就不起作用了。
Close(关闭)
该按钮只是关闭状态窗口,并不终止计算。
如果你关闭了状态窗口,将来随时可以选择WINDOW|OPENSTATUSWINDOW菜单命令来再次打开这个窗口。
输出结果表示的意思是:
“REDUCEDCOST”给出最优的单纯形表中目标函数行(第1行)中变量对应的系数(即各个变量的检验数(也称为判别数)).其中基变量的reducedcost值一定为0;对于非基变量(注意:
非基变量本身取值一定为0),相应的reducedcost值表示当该非基变量增加一个单位(其他非基变量保持不变)时目标函数减少的量(对max型问题)。
本例最优解中两个变量都是基变量,所以对应的REDUCEDCOST的值均为0。
“SLACKORSURPLUS(松驰或剩余)”给出约束对应的松驰变量的值:
第2、3行松驰变量均为0,说明对于最优解来讲,两个约束(第2、3行)均取等号,即都是紧约束。
“DUALPRICES”给出对偶价格的值:
第2、3行对偶价格分别为.090909,.545455。
“NO.ITERATIONS=2”表示用单纯形法进行了两次迭代(旋转)。
选择File|Save(F5)命令把“结果报告”保存在一个文件中(缺省的后缀名为LTX,即LINDO文本文件)
LINDO模型的一些注意事项
1. 变量名由字母和数字组成,但必须以字母开头,且长度不能超过8个字符,不区分大小写字母,包括关键字(如MAX、MIN等)也不区分大小写字母。
2. 对目标函数和约束用行号(行名)进行标识,这些标识会在将来的求解结果报告中用到。
行名可以和变量名一样命名,也可以只用数字命名,还可以含有中文字符,但长度同样不能超过8个字符。
为了方便将来阅读求解结果报告,建议用户总是自觉地对每个约束进行命名。
行名结束标志符号、即右括号“)”必须是英文字符,否则会出现错误。
3. 可以用“TITLE”语句对输入的模型命名,用法是在TITLE后面写出其名字(最多72个字符,可以有汉字),在程序中单独占一行,可以在模型的任何地方。
模型命名的第一个作用类似于对模型的注释和说明。
模型命名的另一个目的,是为了方便将来阅读求解结果报告。
因为用户有可能同时处理多个模型,很容易混淆模型与求解结果的对应关系。
这时如果对不同模型分别进行了命名,就可以随时(例如在求解当前模型前)使用菜单命令“FILE|TITLE”将当前模型的名字显示在求解结果报告窗口中,这样就容易判别每个求解结果与每个模型的对应关系。
4. 模型中以感叹号“!
”开头的是注释行(注释语句,或称为说明语句),可以帮助他人或以后自己理解这个模型。
实际上,每行中“!
”符号后面的都是注释或说明。
注释语句中可以使用汉字字符。
5. 变量不能出现在一个约束条件的右端(即约束条件的右端只能是常数);变量与其系数间可以有空格(甚至回车),但不能有任何运算符号(包括乘号“*”等)。
6. 模型中不接受括号“()”和逗号“,”等符号(除非在注释语句中)。
例如:
4(X1+X2)需写为4X1+4X2;“10,000”需写为10000。
7. 表达式应当已经经过化简。
如不能出现2X1+3X2-4X1,而应写成-2X1+3X2等。
8. LINDO中已假定所有变量非负。
若要取消变量的非负假定,可在模型的“END”语句后面用命令“FREE”。
例如,在“END”语句后输入FREEvname,可将变量vname的非负假定取消。
9. 可以在模型的“END”语句后面用命令“SUB”(即设置上界(SETUPPERBOUND)的英文缩写)设定变量的上界,用命令“SLB”(即设置下界(SETLOWERBOUND)的英文缩写)设定变量的上下界。
其用法是:
“SUBvnamevalue”将变量vname的上限设定为value;“SLB”的用法类似。
用“SUB”和“SLB”表示的上下界约束不计入模型的约束,因此LINDO也不能给出其松紧判断和敏感性分析。
10. 数值均衡化考虑:
如果约束系数矩阵中各非零元的绝对值的数量级差别很大(相差1000倍以上),则称其为数值不均衡的。
为了避免数值不均衡引起的计算问题,使用者应尽可能自己对矩阵的行列进行均衡化。
此时还有一个原则,即系数中非零元的绝对值不能大于100000或者小于.0001。
LINDO不能对LP中的系数自动进行数值均衡化,但如果LINDO觉得矩阵元素之间很不均衡,将会给出警告。
11.简单错误的检查和避免:
输入模型时可能会有某些输入错误.当问题规模较大时,要查找错误是比较困难的。
在LINDO中有一些可帮助寻找错误的功能,其中之一就是菜单命令“Report|Picture(Alt+5)”,它的功能是可以将目标函数和约束表达式中的非零系数通过列表(或图形)显示出来。
模型中对变量x没有非负限制,对y有上限限制,对z有下限限制。
用FREE、SUB、SLB三个命令可以实现这些功能。
MAX2x–3y+4z
S.T.
con2)4x+3y+2z<=10
con3)-3x+5y-z<12
con4)x+y+5z>8
con5)-5x-y-z>2
END
freex!
说明:
变量x没有非负限制
suby20!
说明:
变量y的上界为20
slbz30!
说明:
变量z的下界为30
可以看出y的上界(20)在最优解中并没有达到,z的下界(30)也没有达到,因此模型中去掉“suby20”和“slbz30”两个语句,得到的结果应该是不变的。
但由于最优解中x的取值为负值,所以“freex”这个语句确实是不能少的。
不妨试一下,去掉这个语句后效果会怎样?
(不能运行!
)
§2.2敏感性分析
“REDUCEDCOST”
列出最优单纯形表中判别数所在行的变量的系数,表示当变量有微小变动时,目标函数的变化率.其中基变量的reducedcost值应为0,对于非基变量Xj(请注意,非基变量的取值一定是0),相应的reducedcost值表示当某个变量Xj增加一个单位时目标函数减少的量(max型问题)。
“DUALPRICE”(对偶价格)表示当对应约束有微小变动时,目标函数的变化率.输出结果中对应于每一个约束有一个对偶价格.若其数值为p,表示对应约束中不等式右端项若增加1个单位,目标函数将增加p个单位(max型问题)。
显然,如果在最优解处约束正好取等号(也就是“紧约束”,即起作用约束),对偶价格值才可能不是0。
敏感性分析的作用是给出“RANGESINWHICHTHEBASISISUNCHANGED”,即研究当目标函数的系数和约束右端项在什么范围变化(此时假定其他系数保持不变)时,最优基(矩阵)保持不变。
这个部分包括两方面的敏感性分析内容:
.目标函数中系数变化的范围
(OBJCOEFFICIENTRANGES)
由于此时约束没有变化(只是目标函数中某个系数发生变化),所以最优基保持不变的意思也就是最优解不变(当然,由于目标函数中系数发生了变化,所以最优值会变化)。
2.约束右端项变化的范围(RightHandSideRANGES)
不过由于此时约束发生变化,最优基即使不变,最优解、最优值也会发生变化。
如何变化呢?
敏感性分析结果表示的是最优基保持不变的系数范围。
由此,也可以进一步确定当目标函数的系数和约束右端项发生小的变化时,最优解、最优值如何变化。
例2.5继续讨论例1.1
MAX72x1+64x2
SUBJECTTO
2)x1+x2<=50
3)12x1+8x2<=480
4)3x1<=100
END
3个约束条件的右端不妨看作3种“资源”:
原料、劳动时间、车间甲的加工能力。
输出中SLACKORSURPLUS(松弛或剩余)给出这3种资源在最优解下是否有剩余:
原料、劳动时间的剩余均为零(即约束为紧约束),车间甲尚余40公斤加工能力(不是紧约束)。
目标函数可以看作“效益”,成为紧约束的“资源”一旦增加,“效益”必然跟着增长。
输出中DUALPRICES(对偶价格)给出这3种资源在最优解下“资源”增加1个单位时“效益”的增量:
原料增加1个单位(1桶牛奶)时利润增长48(元),劳动时间增加1个单位(1小时)时利润增长2(元),而增加非紧约束车间甲的能力显然不会使利润增长。
这里,“效益”的增量可以看作“资源”的潜在价值,经济学上称为影子价格(shadowprice),即1桶牛奶的影子价格为48元,1小时劳动的影子价格为2元,车间甲生产能力的影子价格为零。
需要注意的是:
灵敏性分析给出的只是最优基保持不变的充分条件,而不一定是必要条件。
比如对于上面的问题,“原料最多增加10(桶牛奶)”的含义只能是“原料增加10(桶牛奶)”时最优基保持不变,所以影子价格有意义,即利润的增加大于牛奶的投资。
反过来,原料增加超过10(桶牛奶),最优基是否一定改变?
影子价格是否一定没有意义?
一般来说,这是不能从灵敏性分析报告中直接得到的。
此时,应该重新用新数据求解规划模型,才能做出判断。
所以严格来说,我们上面回答“原料最多增加10(桶牛奶)”并不是完全科学的。
§2.3整数线性规划的求解
LINDO可用于求解线性纯整数规划或混合整数规划(IP),
模型的输入与LP问题类似,但需在END标志后定义整型变量。
0/1型的变量可由INTEGER(可简写为INT)命令来标识,
有以下两种可能的用法:
INTvname
INTn
前者只将决策变量vname标识为0/1型,
后者将当前模型中前n个变量标识为0/1型(模型中变量顺序由模型中输入时出现的先后顺序决定,该顺序可由输出结果中的变量顺序查证是否一致)。
一般的整数变量可用命令GIN(是GENERALINTEGER的意思),其使用方式及格式与INT命令相似。
所以要在一大堆变量中去找少量的几个取非零值的变量,这是不太方便的。
有没有办法只把取非零值的变量显示出来呢?
选择菜单命令“Reports|Solution…(Alt+0)”(这个命令的功能是要把最优解显示出来),这时会弹出一个选择对话框(图2-21),缺省的选项是“NonzerosOnly(只显示非零值)”。
按下对话框中的“OK”按钮,则报告窗口中的只显示取非零值的变量,这样阅读起来就很方便了。
请注意,这个功能并不仅仅在整数规划中可以使用,在其他模型中也是可以使用的,不妨试试就知道了。
这类似于线性规划中的敏感性分析,但是可惜的是,对于整数规划模型,一般没有与线性规划相类似的理论,此时LINDO中所输出的敏感性分析结果通常是没有意义的,因此不能利用这个输出的敏感性分析结果。
但是,如果生产某一类型汽车,则至少要生产80辆,这个约束怎么表达?
可以引入0-1变量,化为整数规划。
设y1只取0,1两个值,则“x1=0或80”等价于
其中M为相当大的正数,本例可取1000(x1不可能超过1000)。
于是这个模型构成一个混合整数规划模型(既有一般的实数变量x,又有0-1变量y),用LINDO直接求解时,输入的最后(END语句后)只需要加上0-1变量y的限定语句。
max2x1+3x2+4x3
st
1.5x1+3x2+5x3<600
280x1+250x2+400x3<60000
x1-1000y1<0
x2-1000y2<0
x3-1000y3<0
x1-80y1>0
x2-80y2>0
x3-80y3>0
end
inty1
inty2
inty3
备注
尽管LINDO对整数规划问题很有威力,但要想有效地使用,有时还是需要一定的技巧的。
这是因为,人们很容易将一个本质上很简单的问题列成一个不太好的输入模型,从而有可能会导致一个冗长的分枝定界计算。
遗憾的是,我们往往难以预先估计什么样的模型才能避免冗长的分枝定界计算,也难以判别什么样的模型是“不太好”的输入模型。
当然这时LINDO会主动砍去一些计算过程,以缩短计算时间,而且越是高版本的LINDO软件,这种自动处理的“智能”越强。
我们的建议是:
如果分枝定界计算时间很长仍得不到最优解,你可以试试对输入模型进行一些等价变换:
如交换变量的次序,交换约束的顺序等,有时也许会对减少求解所需的时间有所帮助。
§2.4*二次规划(QP)
LINDO可用于求解二次规划(QP)问题,但输入方式比较复杂,因为在LINDO中不许出现非线性表达式。
我们需要为每一个实际约束增加一个对偶变量(或LAGRANGE乘子),通过在实际约束前增加有关变量的一阶最优条件,从而转化二次型为线性互补型(对线性互补型有兴趣的读者,需要参阅其他一些专门书籍);并要使用QCP命令指明实际约束开始的行号,然后才能求解。
下面仅通过两个例子进行说明。
备注:
建议最好直接用下一章介绍的LINGO软件求解QP问题,因为LINGO中输入的模型更接近二次规划的数学表达形式,不容易出错,而计算效果同样很好。
要想学好和灵活应用LINDO软件,首先要多练习使用LINDO来解决问题,熟能生巧。
LINDO中的显示报告完全是英文的,大家要熟悉其含义。
不要太拘泥于书本或别人教你的方法,要会举一反三,综合使用,才能用得巧而精。
这就象编程序一样,同样的几条程序命令,有的人只能生搬硬套,而有的人却能发挥得淋漓尽致,这中间的功夫不是光靠一招招向书本学能得来的了。
§2.5*LINDO的主要菜单命令
菜单条上有6个主菜单:
File(文件)
Edit(编辑)
Solve(求解)
Reports(报告)
Window(窗口)
Help(帮助)
File(文件)菜单包括了LINDO通过文件与外部设备(如磁盘)
交换信息的命令;
Edit(编辑)菜单包括了在当前窗口下编辑文本的命令;
Solve(求解)菜单包括了求解模型的命令;
REPORTS(报告)菜单包括了生成解答结果报告的命令;
Window(窗口)菜单包括了窗口切换的命令;
HELP(帮助)菜单包括了访问在线帮助文挡的命令。
LINDO工具栏及其对应的菜单命令和快捷键
§2.5.1文件(File)主菜单
由于LINDO编辑