资源描述:
《LINGO基本语法和编程.ppt》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、第3讲:LINGO基本语法和编程王丹理学院数学与系统科学系2016年夏季LINGO程序的基本结构LINGO中的集合LINGO中的简化函数LINGO中的运算符LINGO程序基本结构1:模型以Model以END结束Model:Title“Example”……END注:在程序中若没有Model和End也能执行,但建议写完整标准的程序LINGO程序基本结构2:五段(Section)结构Model:Title“Example”集合段数据段初始段计算段目标和约束段END五段结构中目标和约束段一般是不可少的,集合段用得比较多,数据段次之,初始段和计算段不一定有。这些段的顺序可调换。LINGO模型的基本结构
2、(1)集合段(SETS):以“SETS:”开始,“ENDSETS”结束,定义必要的集合变量(SET)及其元素(MEMBER,含义类似于数组的下标)和属性(ATTRIBUTE,含义类似于数组)。Sets:Car/12/:lcar;Box/1..7/:hd,zl,js;SL(Car,Box):x;TRI(Car,SL):trx;ENDSETS(2)数据段(DATA):以“DATA:”开始,“ENDDATA”结束,对集合的属性(数组)输入必要的常数数据。格式为:“attribute(属性)=value_list(常数列表);”常数列表(value_list)中数据之间可以用逗号“,”分开,也可以用
3、空格分开(回车等价于一个空格),如:Data:hd=48.75261.37248.75264;zl=200030001000500400020001000;js=8796648;ENDDATA(3)初始段(INIT):以“INIT:”开始,“ENDINIT”结束,对集合的属性(数组)定义初值(因为求解算法一般是迭代算法,所以用户如果能给出一个比较好的迭代初值,对提高算法的计算效果是有益的)。如果有一个接近最优解的初值,对LINGO求解模型是有帮助的。定义初值的格式为:“attribute(属性)=value_list(常数列表);”这与数据段中的用法是类似的。Init:x=111111111
4、11111;Endinit(4)计算段(CALC):以“CALC:”开始,“ENDCALC”结束,对一些原始数据进行计算处理。在实际问题中,输入的数据通常是原始数据,不一定能在模型中直接使用,可以在这个段对这些原始数据进行一定的“预处理”,得到模型中真正需要的数据。例如Calc:TotalWeight=@sum(Box(i):zl(i)*js(i));EndCalc注意计算段只能对常量进行计算,不能对需要通过解优化程序求解出来的变量进行计算。(5)目标与约束段:目标函数、约束条件等,没有段的开始和结束标记,因此实际上就是除其它四个段(都有明确的段标记)外的LINGO模型。这是Lingo程序最
5、重要的部分。MAX=@sum(Car(i):@sum(Box(j):hd(j)/100*x(i,j)));@for(Box(j):x(1,j)+x(2,j)<=js(j));@for(Car(i):@sum(Box(j):zl(j)/1000*x(i,j))<=40);@for(Car(i):@sum(Box(j):hd(j)/100*x(i,j))<=10.2);@for(Car(i):@sum(Box(j)
6、j#GE#5:hd(j)/100*x(i,j))<=3.027);@for(SL(i,j):x(i,j)>=0);@for(SL(i,j):@GIN(x(i,j)));一个简单的LI
7、NGO程序例直接用LINGO来解如下二次规划问题:输入窗口如下:输出结果:运行菜单命令“LINGO
8、Solve”最优整数解X=(35.37,64.63)最大利润=11077.87输出结果备注:通过菜单“WINDOW
9、StatusWindow”看到状态窗口,可看到最佳目标值“BestObj”与问题的上界“ObjBound”已经是一样的,当前解的最大利润与这两个值非常接近,是计算误差引起的。LINGO是将它作为NLP(非线性规划)来求解,找到的是全局最优解。一个复杂一些的LINGO程序例直接用LINGO来解如下线性规划问题:程序如下:集合段数据段初始段计算段目标函数约束条件输出结果LINGO是将
10、它作为ILP(整数线性规划)来求解,找到全局最优解。LINGO程序注意的几个问题LINGO的基本用法的几点注意事项LINGO中不区分大小写字母;变量和行名可以超过8个字符,但不能超过32个字符,且必须以字母开头。用LINGO解优化模型时已假定所有变量非负(除非用限定变量取值范围的函数@free或@sub或@slb另行说明)。变量可以放在约束条件的右端(同时数字也可放在约束条件的左端)。但为了提高LINGO求解