实验目的:1、掌握线性整数规划模型在lingo中的求解,并能达到灵活运用。2、学会用Lingo对非线性规划问题进行求解。实验二利用Lingo求解整数规划及非线性规划问题变量定界函数:@bin(x):限制x为0或1.@gin(x):限制x为整数.实验二利用Lingo求解整数规划及非线性规划问题例1用Lingo软件求解0-1规划问题12341234123412341234max253440242411,,,01zxxxxxxxxxxxxxxxxxxxx或max=2*x1+5*x2+3*x3+4*x4;-4*x1+x2+x3+x4=0;-2*x1+4*x2+2*x3+4*x4=1;x1+x2-x3+x4=1;@bin(x1);@bin(x2);@bin(x3);@bin(x4);Lingo程序:一、用Lingo求解规划问题例2用Lingo软件求解整数规划问题123123123123min25340242220,1,2,3izxxxxxxxxxxxxxi且取整数min=2*x1+5*x2+3*x3;-4*x1-x2+x3=0;-2*x1+4*x2-2*x3=2;x1-x2+x3=2;@gin(x1);@gin(x2);@gin(x3);Lingo程序:例3用Lingo软件求解非线性规划问题2212211212min121,2,0,0.zxxxxxxxxmin=(x1-1)^2+(x2-2)^2;x2-x1=1;x1+x2=2;Lingo程序:注意:Lingo默认变量的取值从0到正无穷大,变量定界函数可以改变默认状态.@free(x):取消对变量x的限制(即x可取任意实数值)例4求函数的最小值.2222zxy解:编写Lingo程序如下:min=(x+2)^2+(y-2)^2;@free(x);例4求函数的最小值.2222zxy求得结果:x=-2,y=2二、Lingo循环编程语句(1)集合的定义包括如下参数:1)集合的名称.命名规则:以字母开头,后面是字母或下划线.字母不区分大小写.2)集合包含的元素(可选).3)集合中元素的所有属性(可选).例4Math,English,totalsets:endsetsstudentsJohn,Jill,Rose,Mikesets:students/John,Jill,Rose,Mike/:Math,English,total;endsets(2)数据赋值例4data:enddatadata:Math=80,85,90,70;English=75,80,72,60;enddata格式:(1)集合的定义例4sets:students/John,Jill,Rose,Mike/:Math,English,total;endsets(3)集合的循环函数集合的循环函数可以使所有的元素重复完成一些操作.函数函数功能@for形成集合所有元素需满足的约束条件@sum计算集合中元素所在表达式的和@min计算集合中元素所在表达式的最小值@max计算集合中元素所在表达式的最大值maxM=@max(students(i):Math);maxE=@max(students(i):English);averageM=@sum(students(i):Math)/4;@for(students(i):total(i)=Math(i)+English(i));例4!数学的最高分;!英语的最高分;!数学的平均分;!每个学生数学与英语分数之和.(4)衍生集合的定义.包括如下参数:1)衍生集合的名称.3)衍生集合包含的元素(可选).4)集合中元素的所有属性(可选).例5link2)衍生集合的父集合名称.sets:ren/A,B,C,D/:rent;job/1..5/:jobt;link(ren,job):time;endsetsrenjobtime注:若没有指明元素列表,LINGO将用父集合元素的所有组合作为衍生集合的元素.(A,1),(A,2),(A,3),(A,4)(A,5)(B,1),(B,2),(B,3),(B,4)(B,5)(C,1),(C,2),(C,3),(C,4)(C,5)(D,1),(D,2),(D,3),(D,4)(D,5)(5)Lingo内部的数学函数及其返回值@abs(x):返回x的绝对值@sin(x):返回x的正弦值@cos(x):返回x的余弦值@tan(x):返回x的正切值@log(x):返回x的自然对数值@exp(x):返回ex的值@sqr(x):返回x的平方值.该函数可以用表达式x^2代替@sqrt(x):返回x的正的平方根.可以用表达式x^(1/2)代替三、Lingo循环编程举例例5现有五名工人甲,乙,丙,丁,戊,完成五项工作A,B,C,D,E,所需时间列表如下工作时间(小时)工人ABCDE甲10.521.754乙2131.53.5丙1.751.52.513丁2.521.50.54戊11.5223(2)求每份工作最短的用时.(1)求每个人的最短工作时间;问题:三、Lingo循环编程举例例5sets:ren/A,B,C,D,E/:rent;job/1..5/:jobt;link(ren,job):time;endsetsdata:time=1,0.5,2,1.75,42,1,3,1.5,3.51.75,1.5,2.5,1,32.5,2,1.5,0.5,41,1.5,2,2,3;enddataS=@sum(link(i,j):time(i,j));@for(ren(i):rent=@min(job(j):time(i,j)));@for(job(j):jobt=@min(ren(i):time(i,j)));!定义集合;!数据赋值;!所有工作时间求和;!求每个人的最短工作时间;!求每份工作最短的用时;三、Lingo循环编程举例例5用Lingo循环编程语句求解线性规划模型12max7264zxx121211250,128480,3100,0,0.xxxxxxx三、Lingo循环编程举例sets:bliang/1,2/:x,a;yshu/1,2,3/:b;xshu(yshu,bliang):c;endsetsdata:a=72,64;b=50,480,100;c=1,112,83,0;enddatamax=@sum(bliang(i):a(i)*x(i));@for(yshu(j):@sum(bliang(i):x(i)*c(j,i))=b(j));!定义集合;!数据赋值;!目标函数;!约束条件;12max7264zxx121211250,128480,3100,0,0.xxxxxxx例5用Lingo循环编程语句求解线性规划模型例6、指派问题公司在各地有4项业务,选定了4位业务员去处理。由于业务能力、经验和其它情况不同,4业务员去处理4项业务的费用(单位:元)各不相同,见下表:应当怎样分派任务,才能使总的费用最小?业务1234111008001000700260050030080034008001000900411001000500700业务员4141minijijijxaZ4,3,2,1,104,3,2,114,3,2,11..4141jixixjxtsijjijiij或这是一个最优指派问题。引入如下变量:项业务个人做第若不分派第项业务个人做第若分派第jijixij01设矩阵a(4,4)为指派矩阵,其中a(i,j)为第i个业务员做第j项业务的业务费。则可以建立如下模型:MODEL:SETS:person/A,B,C,D/;task/1..4/;assign(person,task):a,x;ENDSETSDATA:a=1100,800,1000,700,600,500,300,800,400,800,1000,900,1100,1000,500,700;ENDDATAmin=@sum(assign:a*x);@for(person(i):@sum(task(j):x(i,j))=1);@for(task(j):@sum(person(i):x(i,j))=1);@for(assign(i,j):@bin(x(i,j)));ENDLINGO程序如下:上机作业题1、某游泳队拟选用甲,乙,丙,丁四名游泳运动员组成一个4×100m混合泳接力队,参加今年的锦标赛.他们的100m自由泳,蛙泳,蝶泳,仰泳的成绩如表所示乙丙丁56成绩自由泳/s甲63575574蛙泳/s69777661蝶泳/s65636263仰泳/s716762甲,乙,丙,丁四名队员各自游什么姿势,才最有可能取得好成绩?上机作业题2、某旅馆每日至少需要下列数量的服务员.每班服务员从开始上班到下班连续工作八小时,为满足每班所需要的最少服务员数,这个旅馆至少需要多少服务员。班次时间段人数班次时间段人数106:00~10:0080418:00~22:0070210:00~14:0090522:00~02:0040314:00~18:0085602:00~06:00303、将机床用来加工产品A,6小时可加工100箱。若用机床加工产品B,5小时可加工100箱。设产品A和产品B每箱占用生产场地分别是10和20个体积单位,而生产场地(包括仓库)允许15000个体积单位的存储量。机床每周加工时数不超过60小时。产品A生产1x(百箱)的收益为11(605)xx元,产品B生产2x(百箱)的收益为22(804)xx元,又由于收购部门的限制,产品A的生产量每周不能超过800箱,试制定周生产计划,使机床生产获最大收益。上机作业题