当前位置:文档之家› LindoLingo软件基本知识

LindoLingo软件基本知识

Lindo/Lingo软件基本知识 Lindo/Lingo软件是美国Lindo系统公司开发的一套专门用于求解优化模型的软件。

一.Lingo入门

1.编写简单的Lingo程序

Lingo程序:在“模型窗口”中,按Lingo语法格式,输入一个完整的优化模型。 (注意:一个程序就是一个优化模型)

例1 要求解线性规划问题 .0,,1253,1034..,32maxyxyxyxtsyxz 输入程序: max=2*x+3*y; 4*x+3*y<=10; 3*x+5*y<=12;

例2 求解 .,0,,2,100..,23.027798max21212122212121且都是整数xxxxxxtsxxxxxx 输入程序: max=98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2; x1<=2*x2;x1+x2<=100; @gin(x1); @gin(x2);

2.语法格式

(1)目标函数 max= 或 min= (2)每个语句的结尾要有“;” (3)程序中,各个语句的先后次序无关 (4)自动默认各个变量均为大于等于零的实数 (5)不区分大写、小写 (6)程序中的“<=”、“<”等同于原模型中的“” 程序中的“>=”、“>”等同于原模型中的“” (7)对一个特定的变量 x ,进行限制: @free(x) :把x放宽为任意实数 @gin(x) :限制x为整数 @bin(x) :限制x只能取0或1 @bnd(-6,x,18) :限制x为闭区间[-6,18]上的任意实数

例3:某学校游泳队要从5名队员中选4名参加4乘100米混合泳接力赛。 5名队员4种泳姿的百米成绩(单位:秒) ----------------------------------------------------------------------------------- 李 王 张 刘 赵 蝶泳 66.8 57.2 78 70 67.4 仰泳 75.6 66 67.8 74.2 71 蛙泳 87 66.4 84.6 69.6 83.8 自由泳 58.6 53 59.4 57.2 62.4 ----------------------------------------------------------------------------------- 如何选拔? (1)请建立“0----1规划”模型; (2)用Lingo求解。

解:若第i名队员参加第j种泳姿比赛,则令1ijx;否则令0ijx;共有20

个决策变量ijx。第i名队员的第j种泳姿成绩记为ijc,则

目标函数为:5141minijijijxc

约束条件有:每名队员顶多能参加一种泳姿比赛 5,4,3,2,1,141ixjij; 每种泳姿有且仅有一人参加 .4,3,2,1,151jxiij

这样就能建立如下“0----1规划”模型: 5141minijijijxc

s.t. 5,4,3,2,1,141ixjij .4,3,2,1,151jxiij .4,3,2,1,5,4,3,2,1,10jixij或 Lingo程序如下: min=66.8*x11+57.2*x21+78*x31+70*x41+67.4*x51+75.6*x12+66*x22+67.8*x32+74.2*x42+71*x52+87*x13+66.4*x23+84.6*x33+69.6*x43+83.8*x53+58.6*x14+53*x24+59.4*x34+57.2*x44+62.4*x54; x11+x12+x13+x14<=1; x21+x22+x23+x24<=1; x31+x32+x33+x34<=1; x41+x42+x43+x44<=1; x51+x52+x53+x54<=1; x11+x21+x31+x41+x51=1; x12+x22+x32+x42+x52=1; x13+x23+x33+x43+x53=1; x14+x24+x34+x44+x54=1; @bin(x11); @bin(x21); @bin(x31); @bin(x41); @bin(x51); @bin(x12); @bin(x22); @bin(x32); @bin(x42); @bin(x52); @bin(x13); @bin(x23); @bin(x33); @bin(x43); @bin(x53); @bin(x14); @bin(x24); @bin(x34); @bin(x44); @bin(x54);

答:14433221,,,xxxx均等于1,即,依次取第2个人王、第3个人张、第4个

人刘、第1个人李参加蝶泳、仰泳、蛙泳、自由泳,成绩为253.2秒。 再介绍本题的另一个解法:用遍历法求出最佳组队方案。从5人中任取4人,

随意安排各人的泳姿,则共有 5!=120 种方案,取成绩最佳的方案。Matlab程序为 clear c=[66.8,75.6,87,58.6;57.2,66,66.4,53;78,67.8,84.6,59.4;70,74.2,69.6,57.2;67.4,71,83.8,62.4]; zxcj=888; for a1=1:5 for a2=1:5 for a3=1:5 for a4=1:5 aabb=(a1-a2)*(a1-a3)*(a1-a4)*(a2-a3)*(a2-a4)*(a3-a4); if aabb~=0 cj=c(a1,1)+c(a2,2)+c(a3,3)+c(a4,4); if cjzxcj=cj; fa=[a1,a2,a3,a4]; end end end end end end fa,zxcj 执行结果: fa = 2 3 4 1 zxcj = 253.2000

二.Lingo中使用集合 前面题3中的Lingo程序,其目标函数含有大规模的变量(20个),约束条件也很繁琐。现在,利用集合的概念,可使程序大大简化。

例4:某帆船制造公司要决定下两年八个季度的帆船生产量。八个季度

的帆船需求量分别是40条、60条、75条、25条、30条、65条、50条、20条,这些需求必须按时满足,既不能提前也不能延后。该公司每季度的正常生产能力是40条帆船,每条帆船的生产费用为400美圆。如果是加班生产的,则每条生产费用为450美圆。帆船跨季度库存的费用为每条20美圆。初始库存是10条帆船。如何生产? (注:本题当然可以用动态规划方法求解;接下来你将看到,建立优化模型用Lingo软件求解比较省事。)

解:八个季度的需求量数组记为xq,则 xq=[40,60,75,25,30,65,50,20]. 类似

地,用数组zc, jb, kc分别表示八个季度的正常生产量、加班生产量、季度末库存量。

目标函数是全部费用之和:.))(20)(450)(400(min81iikcijbizc

约束条件:生产能力 8,...,2,1,40)(iizc; 数量平衡 .8,...,3,2),()()()1()(),1()1()1(10)1(iixqijbizcikcikcxqjbzckc 以上是模型。怎样用Lingo编程呢? 把下标的范围当作集合,本题的集合是{1,2,3,4,5,6,7,8};定义在集合上的一个个数组,都分别称为该集合的属性,本题这个集合有四个属性,分别是xq,zc,jb,kc . 先看本题的Lingo程序,再看注解: model: sets: jihe/1..8/:xq,zc,jb,kc; endsets data: xq=40,60,75,25,30,65,50,20; enddata min=@sum(jihe:400*zc+450*jb+20*kc); @for(jihe:zc<=40); kc(1)=10+zc(1)+jb(1)-xq(1); @for(jihe(i)|i#gt#1:kc(i)=kc(i-1)+zc(i)+jb(i)-xq(i)); end

注解:(1)一个完整的Lingo程序必然以“model:”开始,以“end”结束。

(2)集合定义部分(从“sets:”到“endsets”):内容是定义集合及其属性,命令格式为 “ 集合名/集合的全部元素/:全体属性 ”。本程序中jihe/1..8/:xq,zc,jb,kc; ,这里的“1..8”等同于“1,2,3,4,5,6,7,8” 。 (3)数据输入部分(从“data:”到“enddata”):内容是输入已知数据。 (4)其它部分:包括目标函数、约束条件。 本程序中,@sum(jihe:400*zc+450*jb+20*kc),是求和函数, @for(jihe:zc<=40),是循环函数,zc的所有分量都不大于40,

@for(jihe(i)|i#gt#1:kc(i)=kc(i-1)+zc(i)+jb(i)-xq(i)),表示对集合jihe中

的所有大于1的i,都满足该项约束。

答:八个季度正常生产量 zc=[40,40,40,40,40,40,40,20]

八个季度加班生产jb=[0,10,35,0,0,0,10,0] 最小成本为 145750.0 美圆 。

练习题:解线性规划问题 .60,...,2,1,0,,,60,...,3,2,444,60,...,3,2,044,1,144..9min11111160jsrxjsxxjrxxsxrxtsxjjjjjjjjj 三.Lingo中的基本集合与派生集合 例5:料场选址问题

六个建筑工地的位置(用平面坐标a、b表示,距离单位:km)及其对水泥的日用量(用d表示,单位:t)由下表给出: 工地的位置(a,b)及 水泥日用量d --------------------------------------------------------------------------------------------------

相关主题