LINGO中的常见函数
Lingo简介
Lingo简介1.目标函数 :一个函数解析式,你希望求它的最大或最小值max=函数解析式; 或 min=函数解析式;例: max=3*b+2*c^2; min=b^(1/3)-c*k;Lingo的语句以;号结束.2.运算:加(+),减(-),乘(*),除(/),乘方(x^a)3.变量:用字母或字母数字的组合表示例: a,b, cc1,x1.Lingo的变量缺省值为非负数4.限制条件 :一组等式或不等式Lingo的>,<与>=,<=等价范例程序1:min=3*x1+5*x2;!x1,x2是变量;Lingo的注释语句用!开头用;结束; 3*x1+2*x2>=36;3*x1+5*x2>=45;5..变量类型@bin(变量名) ;——限制该变量为0或1.@bnd( a, 变量名, b)——限制该变量介于a,b之间.@free(变量名)——允许该变量为负数.lingo默认素所有参数非负;@gin(变量名)——限制该变量为整数.Lingo高级连续六个月的产量,可以用x1,x2,x3,x4,x5,x6表示, 但十二个月的产量用同样的方法表示就显繁琐.Lingo可以通过sets语句设置数组功能使问题变得简介:以十二个月的产量为例:sets:r/1..12/:x;!r是组的类型名,x数组名;endsets;这样就定义了数组x, 有x(1),x(2),x(3),x(4)…x(12)个成员;sets语句以sets开头,endsets结束范例程序2:sets:mat/1..4/:x;!mat是组的类型名,x数组名;endsetsmin=50*x(1)+20*x(2)+30*x(3)+80*x(4);400*x(1)+200*x(2)+150*x(3)+500*x(4)>=500;3*x(1)+2*x(2)>=6;2*x(1)+2*x(2)+4*x(3)+4*x(4)>=10;2*x(1)+4*x(2)+x(3)+5*x(4)>=8;有时,我们要用到常数数组,比如在400*x(1)+200*x(2)+150*x(3)+500*x(4)>=500中,x(1),x(2),x(3),x(4)的系数400 200 150 500;此时,可用data语句;例:sets:l/1..4/:a,x;endsetsdata:a=7 2 3 9;enddatadata语句是以data开头,enddata结尾.这样就定义了数组a, 其中a(1)=7,a(2)=2,a(3)=3,a(4)=9. 范例程序3:sets:l/1..4/:x,a;endsetsdata:a=7 2 3 9;!a(1)=7, a(2)=2, a(3)=3, a(4)=9;enddatamax=x(1)*a(3)+x(2)*a(1)+x(3)*a(4)+x(4)*a(2);x(1)+x(4)-x(2)-x(3)<a(1);x(4)+2*x(2)<a(4);x(1)+x(3)<a(1);Lingo含有一些针对数组的命令,方便了数组的使用@for循环语句:@for(数组类型名(i):循环的语句);范例程序4:sets:r/1..5/: a, b;endsetsdata:a= 3.3 4.6 2.7 7.1 10.3;enddatamax=a(1)*b(1)-a(2)*b(2)+a(3)*b(3)-a(4)*b(4);@for(r(i): b(i)< a(i));!等价于b(1)<a(1),b(2)<a(2),b(3)<a(3),b(4)<a(4);@for(r(i):@gin(b(i)));!等价于@gin(b(1)); @gin(b(2)); @gin(b(3)); @gin(b(4)); @sum语句:@sum(数组类型名(i):含数组名(i)的语句);范例程序5:sets:r/1..5/: a, b;endsetsdata:a= 3.3 4.6 2.7 7.1 10.3;enddatamax=@sum(r(i):b(i))+@sum(r(i):b(i)/a(i))+@sum(r(i):b(i)*a(i));!等价于max=b(1)+b(2)+b(3)+b(4)+b(1)/a(1)+b(2)/a(2)+b(3)/a(3)+b(4)/ a(4);@for(r(i): b(i)< a(i));!等价于b(1)<a(1),b(2)<a(2),b(3)<a(3),b(4)<a(4);@for(r(i):@gin(b(i)));示例程序6:sets:m/1..4/:x,need,g,y;endsetsdata:need=4000 2000 3000 10000;enddatamin=30000*@sum(m(i):x(i))+30*@sum(m(i):g(i));g(1)=600+y(1)*(x(2)+x(3)+x(4))-need(1);g(2)=g(1)+y(2)*(@sum(m(i):x(i))-x(2))-need(2);! @sum(m(i):x(i))-x(2)等价于x(1)+x(3)+x(4);g(3)=g(2)+y(3)*(@sum(m(i):x(i))-x(3))-need(3);g(4)=g(3)+y(4)*(@sum(m(i):x(i))-x(4))-need(4);@gin(y(1));@for(m(i):@gin(x(i));@bnd(10,y(i),500));sets语句还可以定义矩阵m×n矩阵就是m行,n列的数.x=2 3 4 5 67 8 9 2 34 7 8 2 1;x 是一3×5的矩阵,x(1,2)调用第一行第二列的数3.下面举一定义4×5矩阵的例子Sets:r/1..4/;c/1..5/;m(r,c):x;!r,行数,c,列数,m,4×5矩阵的类型名,x, 矩阵名; endsetsdata 语句用于矩阵;data:x=2 5 6 75 6 3 18 7 9 10;enddata@sum语句用于矩阵@sum(m(i,j):x(i,j)):表示x(1,1)+x(1,2)+x(1,3)+x(2,1)+x(2,2)+x(2,3)+x(3,1)+x(3,2)+x(3 ,3);@sum(m(1,j):x(1,j))<40;!对x的第一行求和;@sum(m(i,3):x(i,3))<40; !对x的第三列求和;@for(r(i):@sum(m(i,j):x(i,j))<50);!对x的每一行求和;@for(c(j):@sum(m(i,j):x(i,j))<50); !对x的每一列求和;@for循环语句可用于矩阵,@for(m(i,j):@gin(x(i,j)));表示所有的x(i,j)为整数.示例程序7:sets:r/1..3/:s;c/1..4/:pr,pd;m(r,c):x;!定义一3×4矩阵;endsetsdata:s = 750 250 400;pr= 2 3 4 5;x= 15 10 6 21 6 10 145 8 13 9;enddatamax=@sum(c(i):pr(i) *pd(i)@for( r(i): @sum(c(j):x(i,j)*pd(j)/16) <=s(i));! @for( r(i): @sum(m(i,j):x(i,j)*pd(j)/16) <=s(i))等价于:x(1,1)*pd(1)/16+ x(1,2)*pd(2)/16+ x(1,3)*pd(3)/16+ x(1,4)*pd(4)/16<s(1);x(2,1)*pd(1)/16+ x(2,2)*pd(2)/16+ x(2,3)*pd(3)/16+ x(2,4)*pd(4)/16<s(2);x(3,1)*pd(1)/16+ x(3,2)*pd(2)/16+ x(3,3)*pd(3)/16+ x(3,4)*pd(4)/16<s(3);x(4,1)*pd(1)/16+ x(4,2)*pd(2)/16+ x(4,3)*pd(3)/16+ x(4,4)*pd(4)/16<s(4);示例程序8:sets:l/1..4/;m(l,l):a,x;endsetsdata:a=54 54 51 5351 57 52 5250 53 54 5656 54 55 53;enddatamin=@sum(m(i,j):a(i,j)*x(i,j));@for(l(i):@sum(l(j):x(i,j))=1;@sum(l(j):x(j,i))=1);! @sum(l(j):x(i,j))=1,每一行的和为1; @sum(l(j):x(j,i))=1,每一列的和为1;@for(m(i,j):@bin(x(i,j)));(OVER)Lingo源程序Model lingo-LP1:sets:mat/1..4/:x;!x,果仁巧克力,冰淇淋,可乐,奶酪的数量;endsetsmin=50*x(1)+20*x(2)+30*x(3)+80*x(4);!50 30 20 80---单价; 400*x(1)+200*x(2)+150*x(3)+500*x(4)>=500;!保证卡路里需求;3*x(1)+2*x(2)>=6;!保证巧克力的需求;2*x(1)+2*x(2)+4*x(3)+4*x(4)>=10;!保证糖的需求;2*x(1)+4*x(2)+x(3)+5*x(4)>=8;!保证脂肪的需求;Model lingo-LP1-1:sets:mat/1..2/:x;!x(1),硬糖产量,x(2),硬糖产量;endsetsmax=25*x(1)+20*x(2);!25 20 单价;x(1)+x(2)<=(100+20+30);!总产量限制;0.2*x(1)+0.1*x(2)<=20;!坚果限制;0.1*x(2)<=30;!巧克力限制;Model lingo-LP1-2:sets:mat/1..3/:x;!x(1),x(2),x(3)分别表示A, B, C 的产量; endsetsmax=10*x(1)+56*x(2)+100*x(3);!10 56 100 售价;x(1)+(2*x(2)+2*x(2))+(3*x(3)+4*x(3))<=40;!劳力限制; @for(mat(i):@gin(x(i))); !x(1),x(2),x(3)须为整数;Model lingo-LP2:sets:m/1..4/:x,g,need,y;!x(1),x(2),x(3),x(4)分别为各季度休假的员工数;!g(1),g(2),g(3),g(4)分别为各季度的存储量;!need 为各季度的需求,y为各季度的每个员工的实际生产量; data:need=4000 2000 3000 10000;enddatag(1)=600+y(1)*(x(2)+x(3)+x(4))-need(1);@for(m(i)|i#ge#2:g(i)=g(i-1)+y(i)*(@sum(m:x)-x(i))-need(i)) ;min=30000*@sum(m:x)+30*@sum(m:g);!30000,年薪,30 单位存储费;@for(m(i):@gin(x(i));@bnd(0,y(i),500));!x为整数数组,y的元素须介于0和500之间;Model lingo-LP2-1:sets:r/1..2/;c/1..3/:g,f,need; !g,各季度的产量,f,各季度合格产品存储量,need,各季度的需求;m(r,c):x;!x,矩阵,x(1,j)表示;第j季度正常生产量,x(2,j)表示;第j季度加班生产量;endsetsdata:need=30 20 40;enddata@for(c(i):g(i)=@sum(r(j):x(j,i)));f(1)=(20+g(1)*0.8-30)*0.9;!0.8 合格率,0.9,完好率;@for(c(i)|i#ge#2:f(i)=(f(i-1)+g(i)*0.8-need(i))*0.9);min=40*@sum(c(i):x(1,i))+60*@sum(c(i):x(2,i))+15*@sum(c:f); !40 60,单位生产成本,15,单位存储费;@for(c(i):x(1,i)<=27);!每季度正常产量的限制;Model lingo-LP3(1):sets:m/1..7/:x,g,g0;!x,星期一开始上班(休假结束),星期二开始上班,...星期日上班,对应人数;!g,每天实际上班人数;!g0,每天需求人数;endsetsdata:g0=17 13 15 19 14 16 11;enddatamin=@sum(m:x);@for(m(i):g(i)=@sum(m:x)-x(@wrap(i+1,7))-x(@wrap(i+2,7))); !wrap 的用法可查帮助文件help;@for(m(i): g(i)>=g0(i));!满足邮递员需求;@for(m(i):@gin(x(i)));!x,必为整数;Model lingo-LP3(2):sets:r/1..2/;c/1..7/:g,g0;m(r,c):x;!,x表每天上班邮递员数,分为两种,一种是休假2天(连续工作5天),x(1,j),另一种是休假1天(连续工作6天),x(2,j);endsetsdata:g0=17 13 15 19 14 16 11;enddatamin=250*@sum(c(i):x(1,i))+312*@sum(c(i):x(2,i));!250,工作5天的薪水,312, 工作6天的薪水;@for(c(i):g(i)=@sum(c(j):x(1,j))-x(1,@wrap(i+1,7))-x(1,@wra p(i+2,7))+@sum(c(j):x(2,j))-x(2,@wrap(i+1,7)));@for(c(i):[constaint2]g(i)>=g0(i));@for(m(i,j):@gin(x(i,j)));Model lingo-LP3-1:sets:l/1..8/:x;!全职信贷员分两种,x(1), 11:00-12:00吃中餐,x(2), 12:00-13:00吃中餐;! 兼职信贷员,按上班时段分为6种,x(3),9-12,x(4),10-13,…x(8),14-17;c/1..8/:g;!每个时段冗余人数,确保足够的信贷员;endsetsmin=64*@sum(l(i)|i#LE#2:x(i))+15*@sum(l(i)|i#GE#3:x(i));! #LE#;逻辑运算符,可查help;g(1)=x(1)+x(2)+x(3)-4;g(2)=x(1)+x(2)+x(3)+x(4)-3;g(3)=x(1)+x(2)+x(3)+x(4)+x(5)-4;g(4)=x(1)+x(4)+x(5)+x(6)-6;g(5)=x(2)+x(5)+x(6)+x(7)-5;g(6)=x(1)+x(2)+x(6)+x(7)+x(8)-6;g(7)=x(1)+x(2)+x(7)+x(8)-8;g(8)=x(1)+x(2)+x(8)-8;@sum(l(i)|i#GE#3:x(i))<5;!兼职信贷员总数不超过5个;@for(l(i):@gin(x(i)));endModel lingo-LP4:sets:xr/1..2/;xc/1..4/;gr/1..3/;gc/1..4/:buy,sell;!buy,每月初买进谷子的价格,sell,每月末卖出谷子的价格;x0(xr,xc):x;!x,谷子买卖矩阵,x(1,i),第i月初买进谷子数,x(2,i) 第i月末卖出谷子数;g0(gr,gc):g;!g(1,i),每月买谷子后剩下的钱;!g(2,i),每月买谷子后仓库的容量剩余;!g(3,i),每月卖谷子后仓库的谷子库存;endsetsdata:buy=300 350 400 500;sell=350 450 350 550;enddatag(1,1)=10000-300*x(1,1);g(2,1)=100-(50+x(1,1));g(3,1)=50+x(1,1)-x(2,1);@for(xc(i)|i#ge#2:g(1,i)=g(1,i-1)+sell(i-1)*x(2,i-1)-buy(i)*x(1,i);g(2,i)=100-(g(3,i-1)+x(1,i));g(3,i)=g(3,i-1)+x(1,i)-x(2,i));max=g(1,4)+550*x(2,4);!最后现金最多;Model lingo-LP5:max=a*b*c;!设a,b,c分别是长方体的长,宽,高;2*a+b<120;a+c<45;!or!max=a*b*c;!2*a+b<90;!a+c<60;Model lingo-LP5-1:!r(x,y),P(0,10),Q(6,8);min=@abs(y)+(x^2+(y-10)^2)^(1/2)+((x-6)^2+(y-8)^2)^(1/2);Model lingo-LP6:max=3*x+5*y; !x,产品I的产量,y, 品II的产量;3*x+4*y<36;! 设备的限制;2*y<12; ! 原材料A的限制;x<8; ! 原材料B的限制;Model lingo-LP7:sets:l/1..4/;m(l,l):a,x;!x,指派矩阵,a,游泳成绩表;endsetsdata:a=54 54 51 5351 57 52 5250 53 54 5656 54 55 53;enddatamin=@sum(m(i,j):a(i,j)*x(i,j));@for(l(i): @sum(l(j):x(i,j))=1; @sum(l(j):x(j,i))=1); @for(m(i,j):@bin(x(i,j)));!每个元素只能是1或0;Model lingo-LP8:sets:r/1..5/;c/1..4/;m(r,c):a,x; !x,指派矩阵,a,工作耗时表; endsetsdata:a=22 18 30 1818 1000 27 2226 20 28 2816 22 1000 1421 1000 25 28;enddatamin=@sum(m(i,j):a(i,j)*x(i,j));@for(r(i): @sum(c(j):x(i,j))<=1);@for(c(i): @sum(r(j):x(j,i))=1);@for(m(i,j): @bin(x(i,j)));!每个元素只能是1或0Model lingo-LP9:sets:l/1..6/:x,g,p,y;!x,6类高度树木的面积;!g, 6类高度树木的生长率;!p, 6类高度树木的经济价值;!y, 6类高度树木的砍伐面积;endsetsdata:g=0.28 0.32 0.25 0.23 0.37 0;p=0 50 100 150 200 250;enddatamax=@sum(l:p*y);@sum(l:x)=1;x(1)=(1-g(1))*(x(1)-y(1)+@sum(l:y));x(2)=(1-g(2))*(x(2)-y(2))+g(1)*(x(1)-y(1)+@sum(l:y));@for(l(i)|i#ge#3:x(i)=(1-g(i))*(x(i)-y(i))+g(i-1)*(x(i-1)-y (i-1)));@for(l(i):y(i)<x(i));!每类砍伐面积不能超过该类树木面积;Model lingo-LP10a:sets:l/1..4/;m(l,l):a,x;!x,招标矩阵,a,竞标价格矩阵;endsetsdata:a=4 5 100 100100 4 100 43 100 2 100100 100 4 5;!100,很大数字表不招标,不竞标;enddatamin=1000*@sum(m(i,j):a(i,j)*x(i,j));@for(l(i): @sum(l(j):x(i,j))=1; @sum(l(j):x(j,i))=1); @for(m(i,j):@bin(x(i,j)));!招标为1,放弃为0;Model lingo-LP10b:sets:l/1..4/;m(l,l):a,x;endsetsdata:a=4 5 100 100100 4 100 43 100 2 100100 100 4 5;enddatamin=1000*@sum(m(i,j):a(i,j)*x(i,j));@for(l(i): @sum(l(j):x(i,j))<=2;!每家公司至多可分配到2条线路;@sum(l(j):x(j,i))=1);@for(m(i,j):@bin(x(i,j)));Model lingo-LP11:sets:l/1..5/:g; !5个地点的输入与输入差;m(l,l):c,x;!x,运输方案,c,运输成本;endsetsdata:c=0 140 100 90 225145 0 111 110 119105 115 0 113 7889 109 121 0 1000000210 117 82 1000000 0;!很大的数1000000表示禁止运输发生;enddatamin=@sum(m(i,j):c(i,j)*x(i,j));@for(l(i):@free(g(i));g(i)=@sum(l(j):x(j,i))-@sum(l(j):x(i, j))g(1)+1100>=0;!L.A.的纯输出(-g(1))应小于1100(产量);g(2)+2900>=0; !Detroit的纯输出(-g(2))应小于2900(产量);g(3)=0;! Atlanta输入输出平衡;g(4)=2400;! HOUSTON的纯输入应等于需求;g(5)=1500; ! Tampa的纯输入应等于需求;Model lingo-LP12:sets:r/1..3/:pd;!A,B,C 3个化肥厂的产量;c/1..4/:mnn,mxn;!mnn,I,II,III,IV的最低需求, mxn,I,II,III,IV 的最高需求;m(r,c):x,a;!x,运输方案,a,运输成本;endsetsdata:pd=50 60 50;mnn=30 70 0 10;mxn=50 70 30 60;a=16 13 22 1714 13 19 1519 20 23 1000;enddatamin=@sum(m:a*x);@for(c(j):@sum(r(i):x(i,j))>mnn(j);@sum(r(i):x(i,j))<mxn(j));@for(r(i):@sum(c(j):x(i,j))=pd(i));Model lingo-LP13:!本模型主要解决C,D,F到E,A,B的空船运输问题;sets:l/1..3/:bn,bs;!bn,A,B,E,对空船的需求量;bs,C,D,F,空船的数量; m(l,l):a,x;!a,距离矩阵,x,运输方案;endsetsdata:bn=1 1 3;bs=2 2 1;a=2 3 514 13 177 8 3;enddatamin=@sum(m:a*x);@for(l(i):@sum(l(j):x(i,j))=bs(i);@sum(l(j):x(j,i))=bn(i));Model lingo-LP14:sets:r/1..3/;c/1..6/;m(r,c):p,x;!p,收益矩阵,x,航班安排矩阵,例x(1,3)=1,表示NEW YOUK 飞3个航班;endsetsdata:p= 80 150 210 250 270 280100 195 275 325 300 25090 180 265 310 350 320;enddatamax=@sum(m(i,j):p(i,j)*x(i,j));@for(m:@bin(x));!选择变量只能为1或0;@for(r(i):@sum(m(i,j):x(i,j))<1);!任何目的地要么有航班,要么没有;@sum(m(i,j):x(i,j)*j)=6;!航班总次数为6;Model lingo-LP15:sets:l/1..5/:x,y;!x,每年高负荷运行的机器数,y, 每年低负荷运行的机器数;endsetsmax=@sum(l:8*x+5*y);x(1)+y(1)=1000;@for(l(i)|i#ge#2:x(i)+y(i)=0.7*x(i-1)+0.9*y(i-1));!第i年的机器是第i-1年剩下的;@for(l:@gin(x);@gin(y));!机器数是整数;Model lingo-LP16:sets:l/1..4/:x,d,inv,y;!x,生产判断变量,d,每个时期的需求,inv,每个时期末的存储;!y,产量数组;endsetsdata:d=2 3 2 4;enddatainv(1)=x(1)*y(1)-d(1);@for(l(i)|i#gt#1:inv(i)=x(i)*y(i)+inv(i-1)-d(i));inv(4)=0;min=0.5*@sum(l:inv)+@sum(l:d)*1+3*@sum(l:x); !1,单位产品生产成本;@for(l:y<6;@gin(y);@bin(x));Model lingo-LP17:sets:l/1..6/;m(l,l)/1,2 1,3 2,4 2,3 3,5 4,3 4,6 5,6/:x,f;!x(i,j):节点i到节点j的单位时间流量;!f(i,j): 节点i到节点j的带宽;endsetsdata:f=6 2 3 1 7 3 2 7;enddata@for(l(i)|i#ge#2#and#i#le#@size(l)-1:@sum(m(i,j):x(i,j))=@s um(m(j,i):x(j,i)));!中间节点的输入等于输出;@for(m(i,j):@gin(x(i,j));x(i,j)<f(i,j));!带宽限制;max=@sum(m(i,j)|j#eq#@size(l):x(i,j));!节点6的输入;Model lingo-LP18:sets:l/1..5/;m(l,l)/1,2 1,3 2,4 2,5 3,2 3,4 4,5/:x,f,c;!x(i,j):节点i到节点j的单位时间流量;!f(i,j): 节点i到节点j的带宽;!c(i,j):单位成本;endsetsdata:f=10 8 2 7 5 10 4;c=4 1 6 1 2 3 2;enddata@for(l(i)|i#ge#2#and#i#le#@size(l)-1:@sum(m(i,j):x(i,j))=@s um(m(j,i):x(j,i)));!中间节点的输入等于输出;@for(m(i,j):@gin(x(i,j));x(i,j)<f(i,j)); !带宽限制;@sum(m(i,j)|j#eq#@size(l):x(i,j))=11;!11,由Model lingo-LP24 算出最大流;min=@sum(m:c*x);Model lingo-LP19(1):sets:l/1..8/:t;!各节点记时器的记录;m(l,l)/ 1,2 2,3 2,6 2,5 2,7 3,6 3,4 4,5 5,8 6,5 7,5/:a;!a,正常情况下,各工序完工所需时间;endsetsdata:a=60 20 40 45 10 0 30 25 35 15 18;!工序(3,6)是虚拟工序,所以完工时间为0;enddatamin=t(8);t(1)=0;!开始时间为0;@for(m(i,j):t(j)-t(i)>a(i,j));Model lingo-LP19(2):sets:l/1..8/:t;m(l,l)/1,2 2,3 2,6 2,5 2,7 3,6 3,4 4,5 5,8 6,5 7,5/:ao,a,cc,c,y; !ao, 正常情况下,各工序完工所需时间;!a,极限情况下,各工序完工所需时间;!cc, 缩短一天工期代价;!c,工序直接费用;!y,各工序实际所花时间;endsetsdata:ao=60 20 40 45 10 0 30 25 35 15 18;a=60 10 35 30 5 0 20 15 35 10 10;cc=1000000 400 500 120 300 0 350 290 1000000 400 230;! 工序(3,6)是虚拟工序,所以完工时间,费用等均为0;enddatat(8)=140;! 由模型Model lingo-LP26(1)算出的最短工期;t(1)=0;@for(m(i,j):@gin(y(i,j));y(i,j)<ao(i,j);y(i,j)>a(i,j);t(j)-t(i)>y(i,j));min=@sum(m(i,j):(ao(i,j)-y(i,j))*cc(i,j)+c(i,j));Model lingo-LP19(3):sets:l/1..8/:t;m(l,l)/1,2 2,3 2,6 2,5 2,7 3,6 3,4 4,5 5,8 6,5 7,5/:ao,a,cc,c,y; !ao, 正常情况下,各工序完工所需时间;!a,极限情况下,各工序完工所需时间;!cc, 缩短一天工期代价;!c,工序直接费用;!y,各工序实际所花时间;endsetsdata:ao=60 20 40 45 10 0 30 25 35 15 18;a=60 10 35 30 5 0 20 15 35 10 10;cc=1000000 400 500 120 300 0 350 290 1000000 400 230;! 工序(3,6)是虚拟工序,所以完工时间,费用等均为0;enddatat(1)=0;@for(m(i,j):@gin(y(i,j));y(i,j)<ao(i,j);y(i,j)>a(i,j);t(j)-t(i)>y(i,j));min=@sum(m(i,j):(ao(i,j)-y(i,j))*cc(i,j)+c(i,j))+400*t(8);Model lingo-LP20:sets:l/1..9/;m(l,l)/1,8 8,1 8,7 7,8 1,2 2,1 2,9 9,2 8,9 9,8 9,6 6,9 6,7 7,6 3,2 2,3 3,4 4,3 4,9 9,4 4,5 5,4 5,6 6,5/:a,x;!x:每条弄堂经过的次数;!a: 每条弄堂的长度;endsetsdata:a=2 2 4 4 5 5 6 6 3 3 4 4 3 3 5 5 9 9 4 4 4 4 4 4;enddata@for(m:@gin(x));@for(m(i,j):x(i,j)+x(j,i)>1);!保证每条弄堂至少经过一遍;@for(l(i):@sum(m(i,j):x(i,j))=@sum(m(j,i):x(j,i)));!每个节点的进出次数应该相等;min=@sum(m:a*x);Model lingo-LP20-1:sets:l/1..7/;m(l,l)/6,1 1,3 1,2 2,3 3,4 3,5 5,4 6,4 7,6 4,7 7,5/:b,c;!b: 每条街道经过的次数;!c: 街道的长度;endsetsdata:c=2 3 1 4 3 2 5 4 2 1 2;enddatamin=@sum(m:b*c);@for(l(i):@sum(m(i,j):b(i,j))=@sum(m(j,i):b(j,i))); !每个节点的进出次数应该相等;@for(m(i,j):@gin(b(i,j));b(i,j)>1); !保证每条街道至少经过一遍;Model lingo-LP21:l/1..7/:cl,nl;!cl,飞离CHICAGO的时刻表,nl,飞离 NEW YORK的时刻表;endsetsdata:cl=6 9 12 15 17 19 20;nl=7 8 10 12 14 16 18;enddatasets:m(l,l)|cl(&1)+5#le#nl(&2):x;!x,飞离CHICAGO的空姐可能的配备,x(i,j),表示飞第i个CHICAGO到NEW YORK航班,第j个NEW YORK到CHICAGO航班;n(l,l)|nl(&1)+3#le#cl(&2):y;!y,飞离NEW YORK的空姐可能的配备,y(i,j),表示飞第i个NEW YORK 到CHICAGO航班,第j个CHICAGO到NEW YORK航班;endsets[目标]min=@sum(m(i,j):x(i,j)*(nl(j)-cl(i)-4))+@sum(n(i,j):y(i,j)*(cl(j)-nl(i)-2));!(nl(j)-cl(i)-4),在NEW YORK的滞留时间;!(cl(j)-nl(i)-2), 在CHICAGO的滞留时间;@for(l(i):@sum(m(i,j):x(i,j))+@sum(n(j,i):y(j,i))=1);!飞离CHICAG的航班须配备空姐;@for(l(j):@sum(m(i,j):x(i,j))+@sum(n(j,i):y(j,i))=1);!飞离NEW YORK的航班须配备空姐;@for(m(i,j):@bin(x(i,j)));!配备用1表示,不配用0表示;@for(n(i,j):@bin(y(i,j)));Model lingo-LP22:sets:r/1..3/;c/1..5/;m(r,c):p,x;!x(i,j), 表部门j 迁至城市 i,p(i,j),相应收益;q(c,c)/1,3 1,4 2,3 2,4 3,5 4,5/:qq;!qq,部门间的通信量;cu(r,r):cc;!cc,城市间的通信单价;endsetsdata:qq=1.0 1.5 1.4 1.2 2.0 0.7;cc=5 14 13 14 5 9 13 9 10;p=10 15 10 20 510 20 15 15 150 0 0 0 0;enddatamax=@sum(m:p*x)-@sum(cu(k,l):@sum(q(i,j):qq(i,j)*x(k,i)*x(l ,j)*cc(k,l)));@for(m:@bin(x));@for(r(i):@sum(m(i,j):x(i,j))<3);!每个城市中部门数量限制;@for(c(j):@sum(m(i,j):x(i,j))=1);! 每个部门都须安置;Model lingo-LP23:sets:r/1..3/;c/1..10/:t;!t,各工序耗时1-A 2-B 3-C 4-G 5-I 6-D 7-E 8-F 9-H 10-J;mp(c,c)/1,2 2,3 2,4 3,5 4,5 5,10 6,7 7,8 8,5 9,5 7,9/;! 各工序前后承接关系;m(r,c):b;!b,工序安排矩阵;endsetsdata:t=45 11 9 12 12 50 15 12 12 8;enddatamin=ct;!ct, 流水线的最小循环时间;@for(c(i):@sum(m(j,i):b(j,i))=1);!每个工序须安排1工作台;@for(mp(i,j):@sum(r(k):k*b(k,i))<@sum(r(k):k*b(k,j)));! 承前工序所在工作台号不能小于乘后工序所在工作台号;@for( r(i):@sum(m(i,j):b(i,j)*t(j))<ct);! 每个工作台耗时不超过流水线的最小循环时间; @for(m:@bin(b));。
LINGO的基本运算和函数
@ACOSH( X)
反双曲余弦
@ASIN( X)
反正弦
@ASINH( X)
反双曲正弦
@ATAN( X)
反正切
@ATAN2( Y, X) Y/X 的反正切
@ATANH( X)
反双曲正切
@COS( X)
余弦
@COSH( X)
反余弦
@EXP( X)
e 的 X 此方
@FLOOR( X)
取整
@LGM( X)为整数
在默认情况下,LINGO 规定变量是非负的,也就是说下界为 0,上界为+∞。
@free 取消了默认的下界为 0 的限制,使变量也可以取负值。@bnd 用于设定一个
变量的上下界,它也可以取消默认下界为 0 的约束。
集操作函数
@size(set_name) 该函数返回集 set_name 的成员个数。在模型中明确给出集大小时最好使用 该函数。它的使用使模型更加数据中立,集大小改变时也更易维护。
集循环函数
@function(setname[(set_index_list)[|conditional_qualifier]]:expressio n_list);
@function 相应于下面罗列的四个集循环函数之一;setname 是要遍历的集; set_ index_list 是集索引列表;conditional_qualifier 是用来限制集循环函 数 的 范 围 , 当 集 循 环 函 数 遍 历 集 的 每 个 成 员 时 , LINGO 都 要 对 conditional_qualifier 进行评价,若结果为真,则对该成员执行@function 操 作,否则跳过,继续执行下一次循环。expression_list 是被应用到每个集成员 的表达式列表,当用的是@for 函数时,expression_list 可以包含多个表达式, 其间用逗号隔开。这些表达式将被作为约束加到模型中。当使用其余的三个集循 环函数时,expression_list 只能有一个表达式。如果省略 set_index_list,那 么在 expression_list 中引用的所有属性的类型都是 setname 集。
Lingo基本用法总结
Lingo基本⽤法总结Lingo基本⽤法总结(除集函数部分)LINGO是⽤来求解线性和⾮线性优化问题的简易⼯具。
Lingo免费版可以⽀持30个未知数,lingo破解版可以⽀持⼏万个未知数、⼏万个约束条件。
当你在windows下开始运⾏LINGO系统时,会得到类似下⾯的⼀个窗⼝:外层是主框架窗⼝,包含了所有菜单命令和⼯具条,其它所有的窗⼝将被包含在主窗⼝之下。
在主窗⼝内的标题为LINGO Model – LINGO1的窗⼝是LINGO的默认模型窗⼝,建⽴的模型都都要在该窗⼝内编码实现。
下⾯举两个例⼦。
例1.1 如何在LINGO中求解如下的LP问题:在模型窗⼝中输⼊如下代码:min=2*x1+3*x2;x1+x2>=350;x1>=100;2*x1+x2<=600;然后点击⼯具条上的按钮即可。
得到如下结果:所以当x1为250,x2为100时⽬标函数得到最⼤值。
算术运算符Lingo中变量不区分⼤⼩写,以字母开头不超过32个字符算术运算符是针对数值进⾏操作的。
LINGO提供了5种⼆元运算符:^乘⽅﹡乘/除﹢加﹣减LINGO唯⼀的⼀元算术运算符是取反函数“﹣”。
这些运算符的优先级由⾼到底为:⾼﹣(取反)^﹡/低﹢﹣运算符的运算次序为从左到右按优先级⾼低来执⾏。
运算的次序可以⽤圆括号“()”来改变。
例:在x1+x2>=350,x1>=100,2*x1+x2<=600的条件下求2*x1+3*x2的最⼩值在代码窗⼝中编写 min =2*x1+3*x2; x1+x2>=350; x1>=100;2*x1+x2<=600;然后单击上⾯菜单lingo 菜单下solve 键即可。
数学函数标准数学函数:@abs(x) 返回x 的绝对值@sin(x) 返回x 的正弦值,x 采⽤弧度制 @cos(x) 返回x 的余弦值 @tan(x) 返回x 的正切值 @exp(x) 返回常数e 的x 次⽅@log(x) 返回x 的⾃然对数@lgm(x) 返回x 的gamma 函数的⾃然对数 @sign(x) 如果x<0返回-1;否则,返回1@floor(x) 返回x 的整数部分。
lingo的常用函数
l i n g o的常用函数This model paper was revised by the Standardization Office on December 10, 2020Lingo基本用法总结(除集函数部分)LINGO是用来求解线性和非线性优化问题的简易工具。
Lingo免费版可以支持30个未知数,lingo破解版可以支持几万个未知数、几万个约束条件。
当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model –LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。
下面举两个例子。
例如何在LINGO中求解如下的LP问题:在模型窗口中输入如下代码:min=2*x1+3*x2;x1+x2>=350;x1>=100;2*x1+x2<=600;然后点击工具条上的按钮即可。
得到如下结果:所以当x1为250,x2为100时目标函数得到最大值。
算术运算符Lingo中变量不区分大小写,以字母开头不超过32个字符算术运算符是针对数值进行操作的。
LINGO提供了5种二元运算符:^乘方﹡乘/除﹢加﹣减LINGO唯一的一元算术运算符是取反函数“﹣”。
这些运算符的优先级由高到底为:高﹣(取反)^﹡/低﹢﹣运算符的运算次序为从左到右按优先级高低来执行。
运算的次序可以用圆括号“()”来改变。
例:在x1+x2>=350,x1>=100,2*x1+x2<=600的条件下求2*x1+3*x2的最小值在代码窗口中编写min=2*x1+3*x2;x1+x2>=350;x1>=100;2*x1+x2<=600;然后单击上面菜单lingo菜单下solve键即可。
数学函数标准数学函数:@abs(x) 返回x的绝对值@sin(x) 返回x的正弦值,x采用弧度制@cos(x) 返回x的余弦值@tan(x) 返回x的正切值@exp(x) 返回常数e的x次方@log(x) 返回x的自然对数@lgm(x) 返回x的gamma函数的自然对数@sign(x) 如果x<0返回-1;否则,返回1@floor(x) 返回x的整数部分。
LINGO基本用法与运算函数
例如,目标函数中有求和表达式ΣCijXij(i从1 到10,j从1到20),若用直接输入的方式,将有 200个系数与200个变量相乘再相加,需要输入 长长一大串,既不便于输入,又不便于修改, 别人看不懂,可读性较差.
LINGO提供了建模语言,能够用较少语 句描述目标函数和约束条件,为建立大规 模数学规划模型提供了方便.我们以一个 运输规划模型为例说明其用法。
办法是用现成软件求解.LINGO是专门
用来求解各种规划问题的软件包,其功
能十分强大,是解决最优化问题的最佳
选择。
LINGO的基本用法和运算 函数
§1.1 LINGO 入门
LINGO的基本用法和运算 函数
一、概况
LINGO 是 美 国 LINDO 系 统 公 司 ( Lindo SystemInc)开发的求解数学规划系列软件中的一 个(其它软件为LINDO,GINO,What’s Best等 等),的主要功能是求解大型线性、非线性和整数 规 划 , 目 前 的 版 本 是 11.0 . 可 以 从 Internet 网 址 http://下载该软件的安装文件lingo11.exe,执行该 文件即可在计算机内安装LINGO 软件系统,首次 运行该软件时,要求用户输入密码,如果输入了正 确的密码,则该软件就成了正式版,如果密码不对 或不输入密码,则该软件就成为演示版.
1.目标函数(求某个数学表达式的最大值或最 小值);
2. 决策变量,即目标函数值取决于哪些变量;
3. 约束条件,即对变量附加一些条件限制(等 式或不等式).
LINGO的基本用法和运算 函数
例1:某工厂有两条生产线,分别用来生产 M和P两种型号的产品,利润分别为200元/个 和300元/个,生产线的最大生产能力分别为 每日100和120,生产线每生产一个M产品需 要1个劳动日进行调试、检测等工作,而每个 P产品需要2个劳动日,该厂每天只有160个 劳动日可用,假如原材料等其它条件不受限 制,问应如何安排生产计划,使获得的利润 最大?
LINGO 函数
4.3 金融函数 目前LINGO提供了两个金融函数。 1.@fpa(I,n) 返回如下情形的净现值:单位时段利率为I,连续n个时段支付,每 个时段支付单位费用。若每个时段支付x单位的费用,则净现值可 用x乘以@fpa(I,n)算得。计算公式:
∑
k =1
n
1
(1 + I )
k
=
1 − (1 + I ) I
8.@ppl(a,x):Poisson分布的线性损失函数,即返回max(0,z-x)的期望值 @ppl(a,x): ,其中随机变量z服从均值为a的Poisson分布。 9.@pps(a,x):均值为a的Poisson分布的分布函数。x不是整数时,采用 @pps(a,x): 线性插值进行计算。 10.@psl(x): 10.@psl(x):单位正态线性损失函数,即返回max(0,z-x)的期望值,随 机变量z服从标准正态分布。 11.@psn(x):标准正态分布的分布函数。 11.@psn(x): 12.@ptd(n,x): 12.@ptd(n,x):自由度为n的t分布的分布函数。 13.@qrand(seed): 13.@qrand(seed):产生服从(0,1)区间的拟随机数。 @qrand只允许在模型的数据部分使用,它将用拟随机数填满集属性。通 常,声明一个m×n的二维表,m表示运行实验的次数,n表示每次实验所 需的随机数的个数。在行内,随机数是独立分布的;在行间,随机数是 非常均匀的。这些随机数是用“分层取样”的方法产生的。
2.@fpl(I,n) 返回如下情形净现值:单位时段利率为I,第n个时段支付单位费用 计算公式:
(1 + I )
−n
两个函数间的关系:
@ fpa ( I , n ) = ∑ @ fpl ( I , k )
LINGO的使用方法说明大全
LINGO的使用简介LINGO软件是美国的LINGO系统公司开发的一套专门用于求解最优化问题的软件包.LINGO除了能够用于求解线性规划和二次规划外,还可以用于非线性规划求解、以及一些线性和非线性方程(组)的求解等.LINGO软件的最大特色在于它允许优化模型中的决策变量为整数,即可以求解整数规划,而且执行速度快.LINGO是用来求解线性和非线性优化问题的简易工具.LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果.在这里仅简单介绍LINGO的使用方法.LINGO(Linear INteractive and General Optimizer )的基本含义是交互式的线性和通过优化求解器.它是美国芝加哥大学的 Linus Schrage 教授于1980年开发了一套用于求解最优化问题的工具包,后来经过完善成何扩充,并成立了LINDO系统公司.这套软件主要产品有:LINDO,LINGO,LINDO API和What’sBest.它们在求解最优化问题上,与同类软件相比有着绝对的优势.软件有演示版和正式版.正式版包括:求解包(solver suite)、高级版(super)、超级版(hyper)、工业版(industrial)、扩展版(extended).不同版本的LINGO对求解问题的规模有限制,如附表3-1所示.附表3-1 不同版本LINGO对求解规模的限制版本类型总变量数整数变量数非线性变量数约束数演示版 300 30 30 150求解包 500 50 50 250高级版 2000 200 200 1000超级版 8000 800 800 4000工业版 32000 3200 32000 16000扩展版无限无限无限无限3.1 LINGO程序框架LINGO可以求解线性规划、二次规划、非线性规划、整数规划、图论及网络最优化问题和最大最小求解问题,以及排队论模型中最优化等问题.一个LINGO程序一般会包括以下几个部分:(1) 集合段:集部分是LINGO模型的一个可选部分.在LINGO模型中使用集之前,必须在集部分事先定义.集部分以关键字“sets:”开始,以“endsets”结束.一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分.一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须先定义.(2) 数据段:在处理模型的数据时,需要为集部分定义的某些元素在LINGO求解模型之前为其指定值.数据部分以关键字“data:”开始,以关键字“enddata”结束.(3) 目标和约束段:这部分用来定义目标函数和约束条件等.该部分没有开始和结束的标记.主要是要用到LINGO的内部函数,尤其是与集合有关的求和与循环函数等.(4)初始段:这个部分要以关键字“INIT:”开始,以关键字“ENDINIT”结束,它的作用是对集合的属性定义一个初值.在一般的迭代算法中,如果可以给一个接近最优解的初始值,会大大减少程序运行的时间.(5) 数据预处理段:这一部分是以关键字“CALC:”开始,以关键字“ENDCALC”结束.它的作用是把原始数据处理成程序模型需要的数据,它的处理是在数据段输入完以后、开始正式求解模型之前进行的,程序语句是按顺序执行的.3.2 LINGO中集合的概念在对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等.LINGO允许把这些相联系的对象聚合成集(sets).一旦把对象聚合成集,就可以利用集来最大限度地发挥LINGO建模语言的优势.现在将深入介绍如何创建集,并用数据初始化集的属性.3.2.1集的构成集是LINGO建模语言的基础,是程序设计最强有力的基本构件.借助于集能够用一个单一的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型.集是一群相联系的对象,这些对象也称为集的元素.一个集可能是一系列产品、卡车或雇员.每个集的元素可能有一个或多个与之有关联的特征,把这些特征称为属性.属性值可以预先给定,也可以是未知的,有待于LINGO求解的.LINGO有两种类型的集:原始集(primitive set)和派生集(derived set).一个原始集是由一些最基本的对象组成的.一个派生集是用一个或多个其它集来定义的,也就是说,它的元素来自于其它已存在的集.3.2.2模型的集部分集部分在程序中又称为集合段,它是LINGO模型的一个可选部分.在LINGO模型中使用集之前,必须在集部分事先定义.集部分以关键字“sets:”开始,以“endsets”结束.一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分.一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须先定义.(1)原始集的定义为了定义一个原始集,必须详细说明集的名字,而集的元素和相应的属性是可选的.定义一个原始集,用下面的语法:setname[/member_list/][:attribute_list];注意:用“[]”表示该部分内容是可选的(下同).Setname是用来标记集的名字,最好具有较强的可读性.集名字必须严格符合标准命名规则:以拉丁字母或下划线为首字符,其后由拉丁字母、下划线、阿拉伯数字组成的总长度不超过32个字符的字符串,且不区分大小写.注意:该命名规则同样适用于集元素名和属性名等的命名.Member_list是集元素的列表.如果集元素放在集定义中,那么对它们可采取显式和隐式罗列两种方式.如果集元素不放在集定义中,那么可以在随后的数据部分定义.①当显式罗列元素时,必须为每个元素输入一个不同的名字,中间用空格或逗号隔开,允许混合使用.例3.1 定义一个名为friends的原始集,它具有元素John,Jill,Rose和Mike,其属性有sex和age:sets:friends/John Jill, Rose Mike/: sex, age;endsets②当隐式罗列元素时,不必罗列出每个集元素.可采用如下语法:setname/member1..member N/[: attribute_list];这里的member1是集的第一个元素名,member N是集的最后一个元素名.LINGO将自动产生中间的所有元素名.LINGO也接受一些特定的首元素名和末元素名,用于创建一些特殊的集.③集元素不放在集定义中,而在随后的数据部分来定义.例3.2!集部分;sets:friends:sex,age;endsets!数据部分;data:friends,sex,age=John,1,16 Jill,0,14 Rose,0,17 Mike,1,13;enddata注意:开头用感叹号(!),末尾用分号(;)表示注释,可跨多行.在集部分只定义了一个集friends,并未指定元素.在数据部分罗列了集元素John,Jill,Rose和Mike,并对属性sex和age分别给出了值.集元素无论用何种字符标记,它的索引都是从1开始连续计数.在attribute_ list可以指定一个或多个集元素的属性,属性之间必须用逗号隔开.LINGO内置的建模语言是一种描述性语言,用它可以描述现实世界中的一些问题,然后再借助于LINGO 求解器求解.因此,集属性的值一旦在模型中被确定,就不可能再更改.只有在初始部分中给出的集属性值在以后的求解中可更改.这与前面并不矛盾,初始部分是LINGO求解器的需要,并不是描述问题所必须的.(2) 定义派生集为了定义一个派生集,必须详细说明集的名字和父集的名字,而集元素和属性是可选的.可用下面的语法定义一个派生集:setname(parent_set_list)[/member_list/][:attribute_list];setname是集的名字.parent_set_list是已定义的集的列表,多个时要用逗号隔开.如果没有指定成员列表,那么LINGO会自动创建父集元素的所有组合作为派生集的元素.派生集的父集既可以是原始集,也可以是其它的派生集.例3.3sets:product/A,B/;machine/M,N/;week/1..2/;allowed(product,machine,week):x;endsetsLINGO生成了三个父集的所有组合共八组作为allowed集的元素,列表如下:编号元素1 (A,M,1)2 (A,M,2)3 (A,N,1)4 (A,N,2)5 (B,M,1)6 (B,M,2)7 (B,N,1)8 (B,N,2)元素列表被忽略时,派生集成员由父集成员所有的组合构成,这样的派生集成为稠密集.如果限制派生集的成员,使它成为父集成员所有组合构成的集合的一个子集,这样的派生集成为稀疏集.同原始集一样,派生集元素的说明也可以放在数据部分.一个派生集的元素列表有两种方式生成:①显式罗列;②设置元素选择的过滤器.当采用方式①时,必须显式罗列出所有要包含在派生集中的元素,并且罗列的每个元素要属于稠密集.使用前面的例子,显式罗列派生集的元素,如:allowed(product,machine,week)/A M 1,A N 2,B N 1/;如果需要生成一个大的、稀疏的集,那么显式罗列就十分麻烦.但是许多稀疏集的元素都满足一些条件,可以把这些逻辑条件看作过滤器,在LINGO生成派生集的元素时把使逻辑条件为假的元素从稠密集中过滤掉.例3.4sets:!学生集:性别属性sex,1表示男性,0表示女性;年龄属性age;students/John,Jill,Rose,Mike/:sex,age;!男学生和女学生的联系集:友好程度属性friend![0,1]之间的数;linkmf(students,students)|sex(&1)#eq#1#and#sex(&2)#eq#0: friend;!男学生和女学生的友好程度大于0.5的集;linkmf2(linkmf) | friend(&1,&2) #ge# 0.5 : x;data:sex,age =1 16,0 14,0 17,0 13;friend =0.3,0.5,0.6;enddata用竖线(|)来标记一个元素过滤器的开始.#eq#是逻辑运算符,用来判断是否“相等”. &1可看作派生集的第1个原始父集的索引,它取遍该原始父集的所有元素;&2可看作派生集的第2 个原始父集的索引,它取遍该原始父集的所有元素;&3,&4,…,依此类推.注意如果派生集B的父集是另外的派生集A,那么上面所说的原始父集是集A向前回溯到最终的原始集,其顺序保持不变,并且派生集A的过滤器对派生集B仍然有效.因此,派生集的索引个数是最终原始父集的个数,索引的取值是从原始父集到当前派生集所作限制的总和.3.3 LINGO数据部分和初始部分在处理模型的数据时,需要为集指定一些元素并且在LINGO求解模型之前为集的某些属性指定数值.为此,LINGO为用户提供了两个可选部分:输入集元素数值的数据部分(Data Section)和为决策变量设置初始值的初始部分(Init Section).3.3.1数据部分(1) 数据部分入门数据部分以关键字“data:”开始,“enddata”结束.在这里,可以指定集元素和集的属性.其语法如下:object_list = value_list;对象列(object_list)包含要指定值的属性名、要设置集元素的集名,用逗号或空格隔开.一个对象列中只能有一个集名,而属性名可以有任意多个.如果对象列中有多个属性名,那么它们的类型必须一致.数值列(value_list)包含要分配给对象列中对象的值,用逗号或空格隔开.注意属性值的个数必须等于集元素的个数.例3.5sets:SET0/A,B,C/: X,Y;endsetsdata:X=1,2,3;Y=4,5,6;enddata在集SET0中定义了两个属性X和Y.X的三个值是1,2,3,Y的三个值是4,5,6.也可采用如下例子中的复合数据说明(data statement)实现同样的功能.sets:SET0/A,B,C/: X,Y;endsetsdata:X,Y=1 4 2,5 3 6;enddata如果对象列中有n个对象,LINGO在为对象指定值时,首先在n个对象的第1个索引处依次分配数值列中的前n个对象,然后在n个对象的第2个索引处依次分配数值列中紧接着的n个对象,…,依此类推.(2) 参数输入在数据部分也可以指定一些标量变量(scalar variables).当一个标量变量在数据部分确定时,称之为参数.例如,假设模型中用利率9%作为一个参数,就可以输入一个利率作为参数.例3.7data:interest_rate = .09;enddata实际中也可以同时指定多个参数.如:data:interest_rate,inflation_rate = .09, .025;enddata(3) 实时数据处理在某些情况下,模型中的某些数据并不是定值.譬如模型中有一个参数在2%至6%范围内,对不同的值求解模型,观察模型的结果对参数依赖的程度,那么把这种情况称为实时数据处理.处理方法是在该语句的数值后面输入一个问号(?).例3.8data:interest_rate,inflation_rate = .09 ?;enddata在每一次求解模型时,LINGO都会提示为参数inflation_rate输入一个值.在WINDOWS操作系统下,将会看到一个如下面的对话框:直接输入一个值再点击OK按钮,LINGO就会把输入的值指定赋给inflation_rate,然后继续求解模型.除了参数之外,也可以实时输入集的属性值,但不允许实时输入集元素名.(4) 指定属性为一个值可以在数据定义的右边输入一个值来把所有的元素的该属性指定为一个值.如下面的例子.sets:days /MO,TU,WE,TH,FR,SA,SU/:needs;endsetsdata:needs = 40;enddataLINGO将用40指定days集的所有元素的needs属性.对于多个属性的情形如下:sets:days /MO,TU,WE,TH,FR,SA,SU/:needs,cost;endsetsdata:needs cost = 40 90;enddata(5) 数据部分的未知数值表示法有时候只需为一个集的部分元素的某个属性指定数值,而让其余元素的该属性是未知的,以便让LINGO 去求出它们的最优值.在数据定义中输入两个相连的逗号表示该位置对应元素的属性值未知,两个逗号间可以有空格.例3.10sets:years/1..6/: capacity;endsetsdata:capacity = ,24,40,,,;enddata属性capacity的第2个和第3个值分别为24和40,其余的未知.3.3.2初始部分初始部分是LINGO提供的另一个可选内容.在初始部分中,与数据部分中的数据定义相同,可以输入初始定义(initialization statement).在对实际问题的建模时,初始部分并不起到描述模型的作用,初始部分输入的值仅被LINGO求解器当作初始值来使用,并且仅仅对非线性模型有用.这与数据部分指定变量的值不同,LINGO求解器可以自由改变初始部分初始化变量的数值.一个初始部分以关键字“init:”开始,以关键字“endinit”结束.初始部分的初始定义规则和数据部分的数据定义规则相同.也就是说,可以在定义的左边同时初始化多个集属性,即可以把集属性初始化为一个数值,也可以用问号定义为实时数据,还可以用逗号指定为未知数值.例3.11X,Y = 1,0;endinitY=@log(X);X^2+Y^2<=1;3.4 LINGO函数3.4.1运算符及其优先级LINGO 中的运算符可以分为三类:算数运算符、逻辑运算符和关系运算符.(1) 算数运算符算数运算符分为5种: (加法), (减法), (乘法), (除法), (求幂).(2) 逻辑运算符逻辑运算符分为两类:#AND#(与),#OR#(或),#NOT#(非):这3个运算符是参与逻辑值之间的运算,其结果还是逻辑值.运算符#EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于)是用于“数与数之间”的比较,其结果是实逻辑值.(3) 关系运算符LINGO中有3种关系运算符:<(小于等于),>(大于等于),=(等于).注意LINGO中优化模型的约束一般没有严格大于、严格小于,要和逻辑运算符区分开.运算符的优先等级如附表3-2所示.附表3-2 运算符的优先级优先级运算符高级#NOT# ,-(负号)^* ,/+,-#EQ#,#NE#,#GT#,#GE#,#LT#,#LE#, #AND#,#OR#最低< ,+ ,>3.4.2 LINGO数学函数(1) 基本数学函数LINGO中有相当丰富的数学函数,这些函数的用法简单.下面列表对各个函数的用法做简单的介绍,具体情况如附表3-3所示.(2) 集合循环函数集合循环是指对集合上的元素(下标)进行循环操作的函数,它的一般用法如下:@function(setname[(set_index_list)[|condition]]:expression_list);其中function是集合函数名,是FOR,MAX,MIN,PROD,SUM五种之一.setname是集合名;set_index_list 是集合索引列表(可以省略);condition是实用逻辑表达式描述的过滤条件(通常含有索引,可以省略);expression_list是一个表达式(对@FOR可以是一组表达式).下面对具体的集合函数作如下解释:@FOR(集合元素的循环函数):对集合setname的每个元素独立生成表达式,表达式由expression_list 描述.@MAX(集合属性的最大值):返回集合setname上的表达式的最大值.@MIN(集合属性的最小值) :返回集合setname上的表达式的最小值.@PROD(集合元素的乘积函数):返回集合setname上的表达式的积.@SUM(集合元素的求和函数) :返回集合setname上的表达式的和.表附3-3 基本数学函数函数调用格式含义@ABS(X) 返回X的绝对值@COS(X) 返回X的余弦值(X单位是弧度)@SIN(X) 返回X的正弦值(X单位是弧度)@FLOOR(X) 返回X的整数部分@LGM(X) 返回X的伽马(Gamma)函数的自然对数值@LOG(X) 返回X的自然对数值@MOD(X,Y) 返回X对Y取模的结果@POW(X,Y) 返回X Y的值@SIGN(X) 返回X的符号值@EXP(X) 返回e X的值@SMAX(LIST) 返回一列数的最大值@SMIN(LIST) 返回一列数的最小值@SQR(X) 返回X的平方@SQRT(X) 返回X的正的平方根值@TAN(X) 返回X的正切值(3) 集合操作函数集合操作函数是对集合进行操作的函数,主要有4种,下面分别介绍它们的一般用法.1)@INDEX([set_name,]primitive_set_element)这个函数给出元素primitive_set_element在集合set_name中的索引值(即按定义集合时元素出现顺序的位置编号).如果省略编号set_name,LINGO按模型中定义的集合顺序找到第一个含有元素primitive_set_element的集合,并返回索引值.通过下面例子解释函数的使用方法.例如,假设定义一个女孩的姓名集合和一个男孩的姓名集合:SETS:GIRLS/DEBBLE,SUE,ALICE/;BOYS/BOB,JOE,SUE,FRED/;ENDSETS注意到女孩集和男孩集中都有一个为SUE的元素,如果要调用此函数@INDEX(SUE),则得到返回索引值是2.因为集合GIRLS在集合BOYS之前,则索引函数只对集合GIRLS检索.如果想查找男孩集中的SUE,则应该使用@INDEX(BOYS,SUE),则此时得到的索引值是3.2)@IN(set_name,primitive_index_1[,primitive_index_2 …])这个函数用于判断一个集合中是否含有某个索引值.它的返回值是1(逻辑值“真”),或是0(逻辑值“假”).例3.12全集为I,B是I的一个子集,C是B的补集.sets:I/x1..x4/;B(I)/x2/;C(I)|#not#@in(B,&1):;endsets3)@wrap(index,limit)该函数返回j=index-k*limit,其中k是一个整数,取适当值保证j落在区间[1,limit]内.该函数相当于index模limit再加1.该函数在循环、多阶段计划编制中特别有用.4)@size(set_name)该函数返回集set_name的元素个数.在LINGO模型中,如果没有明确给出集的大小,则使用该函数能够使模型中的数据变化和集的大小改变更加方便.(4) 变量定界函数变量界定函数能够实现对变量取值范围的附加限制,共4种:1)@bin(x)表示限制就是x为0或1;2)@bnd(L,x,U)表示限制变量x满足;3)@free(x)表示取消对变量x的默认下界为0的限制,即x可以取任意实数;4)@gin(x)表示限制变量x为整数.在默认情况下,LINGO规定变量是非负的,即下界值为0,上界为+∞.@free取消了默认的下界为0的限制,使变量也可以取负值.@bnd用于设定一个变量的上下界,它也可以取消默认下界为0的约束.(5) 概率论中相关函数1)@pbn(p,n,x)二项分布的分布函数,当n和(或)x不是整数时,用线性插值法进行计算.2)@pcx(n,x)自由度为n的χ2分布的分布函数在x点的取值.3)@peb(load,x)当到达负荷(平均服务强度)为load,服务系统有x个服务台,且系统容量无限时的Erlang繁忙概率,多用于解决排队问题.4)@pel(load,x)当到达负荷(平均服务强度)为load,服务系统有x个服务台,系统容量为有限时的Erlang繁忙概率,多用于解决排队问题.5)@pfd(n,d,x)自由度为n和d的F分布的分布函数在x点的取值.6)@pfs(load,x,c)当负荷上限为load,顾客数为c,平行服务台数量为x时,顾客源有限的Poisson服务系统的等待或有返回顾客数的期望值.load是顾客数乘以平均服务时间,再除以平均返回时间.当c和(或)x不是整数时,采用线性插值进行计算.7)@phg(pop,g,n,x)超几何(Hypergeometric)分布的分布函数.pop表示产品总数,g是正品数.从所有产品中任意取出n(n≤pop)件.pop,g,n和x都可以是非整数,这时采用线性插值进行计算.8)@ppl(a,x)Poisson分布的线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从均值为a的Poisson 分布.9)@pps(a,x)均值为a的Poisson分布的分布函数在x点的取值.当x不是整数时,采用线性插值进行计算.10)@psl(x)单位正态线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从标准正态分布.11)@psn(x)标准正态分布的分布函数在x点的取值.12)@ptd(n,x)自由度为n的t分布的分布函数在x点的取值.13)@qrand(seed)产生(0,1)区间的拟随机数.@qrand只允许在模型的数据部分使用,它将用拟随机数填满集属性.通常定义一个m×n的二维表,m表示运行实验的次数,n表示每次实验所需的随机数的个数.在行内,随机数是独立分布的;在行间,随机数是非均匀的.这些随机数是用“分层取样”的方法产生的.目前LINGO提供了两个金融函数.1)@fpa(I,n)返回如下情形的净现值:单位时段利率为I,连续n个时段支付,每个时段支付单位费用.若每个时段支付x单位的费用,则净现值可用x乘以@fpa(I,n)得到.@fpa的计算公式为.净现值就是在一定时期内为了获得一定收益,在该时期初所支付的实际费用.2)@fpl(I,n)返回如下情形的净现值:单位时段利率为I,第n个时段支付单位费用.@fpl(I,n)的计算公式为.这两个函数间的关系:.(7)输入和输出函数输入和输出函数可以把模型与外部数据(如文本文件、数据库和电子表格等)连接起来.1)@file函数该函数用于从外部数据文件中输入数据,它可以放在模型中任何地方.该函数的语法格式为@file(’filename’).这里filename是文件名,可以采用相对路径和绝对路径两种表示方式.记录结束标记(~)之间的数据文件部分称为记录.如果数据文件中没有记录结束标记,那么整个文件被看作单个记录.除了记录结束标记外,从模型外部调用的文本和数据同在模型里是一样的.下面介绍一下在数据文件中的记录结束标记连同模型中@file函数调用是如何工作的.当在模型中第一次调用@file函数时,LINGO打开数据文件,然后读取第一个记录;第二次调用@file 函数时,LINGO读取第二个记录等等.文件的最后一条记录可以没有记录结束标记,当遇到文件结束标记时,LINGO会读取最后一条记录,然后关闭文件.如果最后一条记录也有记录结束标记,那么直到LINGO 求解完成模型后关闭该文件.注意,如果有多个文件同时保持打开状态,可能就会导致一些问题,LINGO允许同时打开文件的上限数是16.在LINGO中不允许嵌套调用@file函数.2)@text函数该函数被用在数据部分,用来把求解结果输出至文本文件中.它可以输出集元素和集属性值.其语法为@text([’filename’])这里filename是文件名,可以采用相对路径和绝对路径两种表示方式.如果忽略filename,那么数据就被输出到标准输出设备(大多数情形都是屏幕).@text函数仅能出现在模型数据部分的一条语句的左边,右边是集名(用来输出该集的所有元素名)或集属性名(用来输出该集属性的值).用接口函数产生输出的数据定义称为输出操作.输出操作仅当求解器求解完模型后才执行,执行次序取决于其在模型中出现的先后.@OLE是从EXCEL中引入或输出数据的接口函数,它是基于传输的OLE技术.OLE传输直接在内存中传输数据,并不借助于中间文件.当使用@OLE时,LINGO先装载EXCEL,再通知EXCEL装载指定的电子数据表,最后从电子数据表中获得Ranges.为了使用@OLE函数,必须有EXCEL5及其以上版本.@OLE函数可在数据部分和初始部分引入数据.@OLE可以同时读集元素和集属性,集元素最好使用文本格式,集属性最好使用数值格式.原始集每个集元素需要一个单元(cell),而对于n元的派生集每个集元素需要n个单元,这里第一行的n个单元对应派生集的第一个集元素,第二行的n个单元对应派生集的第二个集元素,依此类推.4)@ranged(variable_or_row_name)为了保持最优基不变,变量的费用系数或约束行的右端项允许减少的量.5)@rangeu(variable_or_row_name)为了保持最优基不变,变量的费用系数或约束行的右端项允许增加的量.6)@status()返回LINGO求解模型后的结束状态:0 --- Global Optimum(全局最优);1 --- Infeasible(不可行);2 --- Unbounded(无界);3 --- Undetermined(不确定);4 --- Feasible(可行);5 --- Infeasible or Unbounded(通常需要关闭“预处理”选项后重新求解模型,以确定模型究竟是不可行还是无界)6 --- Local Optimum(局部最优);7 --- Locally Infeasible(局部不可行,尽管可行解可能存在,但是LINGO并没有找到一个);8 --- Cutoff(目标函数的截断值被达到);9 --- Numeric Error(求解器因在某约束中遇到无定义的算术运算而停止).通常,如果返回值不是0,4或6时,那么解将不可信,几乎不能用.该函数仅被用在模型的数据部分来输出数据.7)@dual(variable_or_row_name)返回变量的判别数(检验数)或约束行的对偶(影子)价格(dual prices).(8) 辅助函数1)@if(logical_condition,true_result,false_result)@if函数将评价一个逻辑表达式logical_condition是否为真,如果为真,返回true_ result,否则返回false_result.2)@warn(’text’,logical_condition)如果逻辑条件logical_condition为真,则产生一个内容为’text’的信息框.。
LINGO函数
LINGO函数2009-08-11 17:314.1 基本运算符这些运算符是非常基本的,甚至可以不认为它们是一类函数。
事实上,在LINGO中它们是非常重要的。
4.1.1 算术运算符算术运算符是针对数值进行操作的。
LINGO提供了5种二元运算符:^乘方﹡乘/除﹢加﹣减LINGO唯一的一元算术运算符是取反函数“﹣”。
这些运算符的优先级由高到底为:高﹣(取反)^﹡/低﹢﹣4.1.2 逻辑运算符在LINGO中,逻辑运算符主要用于集循环函数的条件表达式中,来控制在函数中哪些集成员被包含,哪些被排斥。
在创建稀疏集时用在成员资格过滤器中。
LINGO具有9种逻辑运算符:#not# 否定该操作数的逻辑值,#not#是一个一元运算符#eq# 若两个运算数相等,则为true;否则为flase#ne# 若两个运算符不相等,则为true;否则为flase#gt# 若左边的运算符严格大于右边的运算符,则为true;否则为flase #ge# 若左边的运算符大于或等于右边的运算符,则为true;否则为flase #lt# 若左边的运算符严格小于右边的运算符,则为true;否则为flase #le# 若左边的运算符小于或等于右边的运算符,则为true;否则为flase #and# 仅当两个参数都为true时,结果为true;否则为flase#or# 仅当两个参数都为false时,结果为false;否则为true这些运算符的优先级由高到低为:高 #not##eq# #ne# #gt# #ge# #lt# #le#低 #and# #or#4.2 数学函数LINGO提供了大量的标准数学函数:@abs(x) 返回x的绝对值@sin(x) 返回x的正弦值,x采用弧度制@cos(x) 返回x的余弦值@tan(x) 返回x的正切值@exp(x) 返回常数e的x次方@log(x) 返回x的自然对数@lgm(x) 返回x的gamma函数的自然对数@sign(x) 如果x<0返回-1;否则,返回1@floor(x) 返回x的整数部分。
lingo函数
六、集操作函数
• 2.@index([set_name,] primitive_set_element) 该函数 返回在集set_name中原始集成员primitive_set_element的 索引。如果set_name被忽略,那么LINGO将返回与 primitive_set_element匹配的第一个原始集成员的索引。 如果找不到,则产生一个错误。 • 例8 如何确定集成员(B,Y)属于派生集S3。 • sets: • S1/A B C/; • S2/X Y Z/; • S3(S1,S2)/A X, A Z, B Y, C X/; • endsets • X=@in(S3,@index(S1,B),@index(S2,Y)); • 看下面的例子,表明有时为@index指定集是必要的。
三、金融函数
• 目前LINGO提供了两个金融函数。 • 1.@fpa(I,n) • 返回如下情形的净现值:单位时段利率为I, 连续n个时段支付,每个时段支付单位费用。 若每个时段支付x单位的费用,则净现值可 用x乘以@fpa(I,n)算得。@fpa的计算公式 为 • 净现值就是在一定时期内为了获得一定收 益在该时期初所支付的实际费用。
二、数学函数
• @lgm(x) 返回x的gamma函数的自然对数 • @sign(x) 如果x<0返回-1;否则,返回1 • @floor(x) 返回x的整数部分。当x>=0时, 返回不超过x的最大整数;当x<0时,返回 不低于x的最大整数。 • @smax(x1,x2,…,xn) 返回x1,x2,…,xn 中的最大值 • @smin(x1,x2,…,xn) 返回x1,x2,…,xn 中的最小值
四、概率函数
• 10.@psl(x) 单位正态线性损失函数,即返回 max(0,z-x)的期望值,其中随机变量z服从标准正态分 布。 • 11.@psn(x) 标准正态分布的累积分布函数。 • 12.@ptd(n,x) 自由度为n的t分布的累积分布函数。 • 13.@qrand(seed) 产生服从(0,1)区间的拟随机数。 @qrand只允许在模型的数据部分使用,它将用拟随机 数填满集属性。通常,声明一个m×n的二维表,m表 示运行实验的次数,n表示每次实验所需的随机数的个 数。在行内,随机数是独立分布的;在行间,随机数 是非常均匀的。这些随机数是用“分层取样”的方法 产生的。
lingo用法
Lingo 是一种专门用于线性规划和整数规划的建模和求解语言。
它提供了一种简洁的方式来描述数学模型,并使用线性规划算法求解这些模型。
下面是Lingo 的一些基本用法示例:
1. 变量定义:
- 定义实数变量:`X = 0.5;`
- 定义整数变量:`INT_VAR Y;`
2. 目标函数定义:
- 最小化目标函数:`MIN = 2*X + 3*Y;`
- 最大化目标函数:`MAX = -X + 4*Y;`
3. 约束条件定义:
- 等式约束:`EQUATION C1: X + Y = 10;`
- 不等式约束:`INEQUATION C2: X >= 5;`
- 范围约束:`5 <= Y <= 20;`
4. 求解模型:
- 使用默认求解器求解:`SOLVE;`
- 指定求解器和参数:`SOLVE WITH LP_METHOD=3;` 以上是Lingo 的一些基本用法示例,实际上,Lingo 还提供了更多的功能和语法,用于描述更复杂的数学模型和问题。
它可以处理
线性规划、整数规划、混合整数规划等多种类型的问题,并提供了丰富的优化算法和工具来求解这些问题。
lingo
LINGO具有9种逻辑运算符:#not# 否定该操作数的逻辑值,#not#是一个一元运算符#eq# 若两个运算数相等,则为true;否则为flase#ne# 若两个运算符不相等,则为true;否则为flase#gt# 若左边的运算符严格大于右边的运算符,则为true;否则为flase#ge# 若左边的运算符大于或等于右边的运算符,则为true;否则为flase#lt# 若左边的运算符严格小于右边的运算符,则为true;否则为flase#le# 若左边的运算符小于或等于右边的运算符,则为true;否则为flase#and# 仅当两个参数都为true时,结果为true;否则为flase #or# 仅当两个参数都为false时,结果为false;否则为true 这些运算符的优先级由高到低为:高 #not##eq# #ne# #gt# #ge# #lt# #le#低 #and# #or#下面给出以上三类操作符的优先级:高#not# ﹣(取反)^﹡/﹢﹣#eq# #ne# #gt# #ge# #lt# #le##and# #or#低 <= = >=LINGO提供了大量的标准数学函数:@abs(x) 返回x的绝对值@sin(x) 返回x的正弦值,x采用弧度制@cos(x) 返回x的余弦值@tan(x) 返回x的正切值@exp(x) 返回常数e的x次方@log(x) 返回x的自然对数@lgm(x)返回x的gamma函数的自然对数@sign(x) 如果x<0返回-1;否则,返回1@floor(x) 返回x的整数部分。
当x>=0时,返回不超过x的最大整数;当x<0时,返回不低于x的最大整数。
@smax(x1,x2,…,xn) 返回x1,x2,…,xn中的最大值@smin(x1,x2,…,xn) 返回x1,x2,…,xn中的最小值4.4 概率函数1.@pbn(p,n,x)二项分布的累积分布函数。
lingo函数命令
算术运算符 加、减、乘、除、乘方等数学运算(即数与数之 间的运算,运算结果也是数)。
LINGO中的算术运算符有以下5种:
+(加法), —(减法或负号), *(乘法), /(除法), ^ (求幂)。
逻辑运算符
运算结果只有“真”(TRUE)和“假”(FALSE)两个值(称为 “逻辑值”),LINGO中用数字1代表TRUE,其他值(典型的 值是0)都是FALSE。 在LINGO中,逻辑运算(表达式)通常作为过滤条件使用,逻辑 运算符有9种,可以分成两类: #AND#(与),#OR#(或),#NOT#(非):逻辑值之间的运算,也 是逻辑值。 #EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等 于),#LT#(小于),#LE#(小于等于):是“数与数之间”的比较, 也就是它们操作的对象本身必须是两个数, 计算得到的结果 是逻辑值。
集合操作函数
@WRAP(I,N) 此函数对N<1无定义 当I位于区间[1, N]内时直接返回I;一般地,返回 J = I - K *N , 其中J位于区间[1, N ], K为整数。即 @WRAP(I,N)= @MOD(I,N)。 但当@MOD(I,N)=0时@WRAP(I,N)=N. 此函数可以用来防止集合的索引值越界。 用户在编写LINGO程序时,应注意避免LINGO模 型求解时出现集合的索引值越界的错误。 @SIZE (set_name) 返回数据集set_name中包含元素的个数。
@SMAX(list):最大值函数,返回一列数(list)的最大值。 @SMIN(list):最小值函数,返回一列数(list)的最小值。
@SQR(X):平方函数,返回X的平方(即X*X)的值。
@SQRT(X):开平方函数,返回X的正的平方根的值。 @TAN(X):正切函数,返回X的正切值(X的单位是弧度)。
Lingo基本用法总结(除集函数部分)
Lingo基本用法总结(除集函数部分)LINGO是用来求解线性和非线性优化问题的简易工具。
Lingo免费版可以支持30个未知数,lingo破解版可以支持几万个未知数、几万个约束条件。
当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。
下面举两个例子。
例1.1 如何在LINGO中求解如下的LP问题:在模型窗口中输入如下代码:min=2*x1+3*x2;x1+x2>=350;x1>=100;2*x1+x2<=600;然后点击工具条上的按钮即可。
得到如下结果:所以当x1为250,x2为100时目标函数得到最大值。
算术运算符Lingo 中变量不区分大小写,以字母开头不超过32个字符算术运算符是针对数值进行操作的。
LINGO 提供了5种二元运算符: ^ 乘方 ﹡ 乘 / 除 ﹢ 加 ﹣ 减 LINGO 唯一的一元算术运算符是取反函数“﹣”。
这些运算符的优先级由高到底为:高 ﹣(取反) ^ ﹡/ 低 ﹢﹣运算符的运算次序为从左到右按优先级高低来执行。
运算的次序可以用圆括号“()”来改变。
例:在x1+x2>=350,x1>=100,2*x1+x2<=600的条件下求2*x1+3*x2的最小值 在代码窗口中编写 min =2*x1+3*x2; x1+x2>=350; x1>=100;2*x1+x2<=600;然后单击上面菜单lingo 菜单下solve 键即可。
数学函数标准数学函数:@abs(x) 返回x 的绝对值@sin(x) 返回x 的正弦值,x 采用弧度制 @cos(x) 返回x 的余弦值 @tan(x) 返回x 的正切值 @exp(x) 返回常数e 的x 次方 @log(x) 返回x 的自然对数@lgm(x) 返回x 的gamma 函数的自然对数 @sign(x) 如果x<0返回-1;否则,返回1@floor(x) 返回x 的整数部分。
Lingo简介
Lingo软件一、变量定界函数(Variable Domain Functions )(1)取整变量:@GIN( variable_name);Example 1: @GIN( X); 使X为整数变量;Example 2: @GIN( PRODUCE( 5)); 使PRODUCE( 5)为整数变量;Example 3: @FOR( DAYS( I): @GIN( START( I)));使START( I),I DAYS∈全部为整数变量。
1.2 0,1变量:@BIN( variable_name);Example 1: @BIN( X); 使X取值为0或1;Example 2: @BIN( INCLUDE( 4)); 使变量INCLUDE( 4)取值为0或1;Example 3: @FOR( ITEMS: @BIN( INCLUDE));使INCLUDE(i),i t i m e s∈全部变量为0,1变量。
1.3 自由变量:@FREE( variable_name);Example 1: @FREE( X); 使X为自由变量;Example 2: @FREE( QUANTITY( 4)); 含义同上Example 3: @FOR( ITEMS: @FREE( QUANTITY)); 含义同上1.4 约束变量:@BND( lower_bound, variable_name, upper_bound); Example 1: @BND( -1, X, 1); [1,1]X∈-Example 2: @BND( 100, QUANTITY( 4), 200); 含义同上;Example 3: @FOR( ITEMS: @BND( 10, Q, 20)); 含义同上;Example 4: @FOR( ITEMS: @BND( QL, Q, QU)); 含义同上。
二、常见运算符2.1 代数运算符: +,-, *,/,^;2.2 逻辑运算符:(1)逻辑表达式运算 #AND#(与),#OR#(或) #NOT#(非)(2)数值表达式运算 #EQ#(等于), #NE#(不等于),#GT#(>) #GE#(≥) #LT#(<) #LE#(≤)(3)数值关系运算符:=,>=,<=。
Lingo软件在求解数学优化问题的使用技巧范文
Lingo软件在求解数学优化问题的使用技巧LINGO是一种专门用于求解数学规划问题的软件包。
由于LINGO执行速度快,易于方便地输入、求解和分析数学规划问题,因此在教学、科研和工业界得到广泛应用。
LINGO 主要用于求解线性规划、非线性规划、二次规划和整数规划等问题,也可以用于求解一些线性和非线性方程组及代数方程求根等。
LINGO的最新版本为LINGO7.0,但解密版通常为4.0和5.0版本,本书就以LINGO5.0为参照而编写。
1.LINGO编写格式LINGO模型以MODEL开始,以END结束。
中间为语句,分为四大部分(SECTION):(1)集合部分(SETS):这部分以“SETS:”开始,以“ENDSETS”结束。
这部分的作用在于定义必要的变量,便于后面进行编程进行大规模计算,就象C语言在在程序的第一部分定义变量和数组一样。
在LINGO中称为集合(SET)及其元素(MEMBER或ELEMENT,类似于数组的下标)和属性(A TTRIBUTE,类似于数组)。
LINGO中的集合有两类:一类是原始集合(PRIMITIVE SETS),其定义的格式为:SETNAME/member list(or 1..n)/:attribute,attribute,etc。
另一类是是导出集合(DERIVED SETS),即引用其它集合定义的集合,其定义的格式为:SETNAME(set1,set2,etc。
):attribute,attribute,etc。
如果要在程序中使用数组,就必须在该部分进行定义,否则可不需要该部分。
(2)目标与约束:这部分定义了目标函数、约束条件等。
一般要用到LINGO的内部函数,可在后面的具体应用中体会其功能与用法。
求解优化问题时,该部分是必须的。
(3)数据部分(DATA):这部分以“DATA:”开始,以“END DA TA”结束。
其作用在于对集合的属性(数组)输入必要的数值。
格式为:attribut=value_list。
lingo中的常用函数
lingo中的常用函数一、数学函数LINGO提供了大量的标准数学函数:@abs(x) 返回x的绝对值@sin(x) 返回x的正弦值,x采用弧度制@cos(x) 返回x的余弦值@tan(x) 返回x的正切值@exp(x) 返回常数e的x次方@log(x) 返回x的自然对数@lgm(x) 返回x的gamma函数的自然对数(当x为整数时lgm(x)=log(x-1)!;当x不为整数时,采用线性插值得到结果)。
@sign(x) 如果x<0返回-1;否则,返回1@floor(x) 返回x的整数部分。
当x>=0时,返回不超过x的最大整数;当x<0时,返回不低于x的最大整数。
@pow(x,y)指数函数,返回x的y次方的值。
@sqr(x) 平方函数,返回x的平方(既x*x)的值。
@sqrt(x) 平方根函数,返回x的正的平方根的值。
@sign(x) 符号函数,返回x的符号值(x<0时返回-1,x>=0时返回+1)。
@mod(x,y) 模函数,返回x对y取模的结果,既x除以y的余数,这里x和y应该是整数@smax(x1,x2,…,xn) 返回x1,x2,…,xn中的最大值@smin(x1,x2,…,xn) 返回x1,x2,…,xn中的最小值二、变量定界函数@BND(L,X,U)限制L<=X<=U。
注意LINGO中没有与LINDO命令SLB, SUB类似的函数@SLB和@SUB@BIN(X)限制X为0或1。
@FREE(X)取消对X的符号限制(即可取负数、0或正数)。
@GIN(X)限制X为正数。
三、概率函数1.@pbn(p,n,x)二项分布的累积分布函数。
当n和(或)x不是整数时,用线性插值法进行计算。
2.@pcx(n,x)自由度为n的χ2分布的累积分布函数。
3.@peb(a,x)当到达负荷为a,服务系统有x个服务器且允许无穷排队时的Erlang繁忙概率。
4.@pel(a,x)当到达负荷为a,服务系统有x个服务器且不允许排队时的Erlang繁忙概率。
lingo用法总结
lingo用法总结ji例程1、model:sets:quarters/1..4/:dem,rp,op,inv;endsetsmin=@sum(quarters:400*rp+450*op+20*inv); @for(quarters(i):rp<=40);@for(quarters(i)|i#gt#1:inv(i)=inv(i-1)+rp(i)+op(i)-dem(i););inv(1)=10+rp(1)+op(1)-dem(1);data:dem=40 60 75 25;enddataend例程2、model:sets:quarters/1..4/:dem,rp,op,inv;endsetsmin=@sum(quarters:400*rp+450*op+20*inv); @for(quarters(i):rp<=40);@for(quarters(i)|i#gt#1:inv(i)=inv(i-1)+rp(i)+op(i)-dem(i););inv(1)=a+rp(1)+op(1)-dem(1);data:dem=40 60 75 25;a=?enddataendLINGO总是根据“MAX=”或“MIN=”寻找目标函数,而除注释语句和TITLE语句外的其他语句都是约束条件,因此语句的顺序并不重要。
LINGO中函数一律需要以“@”开头Lingo中的每个语句都以分号结尾用LINGO解优化模型时已假定所有变量非负(除非用限定变量取值范围的函数@free或@sub或@slb另行说明)。
以感叹号开始的是说明语句(说明语句也需要以分号结束))理解LINGO建模语言最重要的是理解集合(Set)及其属性(Attribute)的概念。
一般来说,LINGO中建立的优化模型可以由5个部分组成,或称为5“段”(SECTION):(1)集合段(SETS):以“ SETS:” 开始,“ENDSETS”结束,定义必要的集合变量(SET)及其元素(MEMBER,含义类似于数组的下标)和属性(ATTRIBUTE,含义类似于数组)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
@bin(x) 限制x为0或1
@bnd(L,x,U) 限制L≤x≤U
@free(x) 取消对变量x的默认下界为0的限制,即x可以取任意实数
@gin(x) 限制x为整数
LINGO提供了大量的标准数学函数:
@abs(x) 返回x的绝对值
@sin(x) 返回x的正弦值,x采用弧度制
@cos(x) 返回x的余弦值
@tan(x) 返回x的正切值
@exp(x) 返回常数e的x次方
@log(x) 返回x的自然对数
@lgm(x) 返回x的gamma函数的自然对数
@sign(x) 如果x<0返回-1;否则,返回1
@floor(x) 返回x的整数部分。
当x>=0时,返回不超过x的最大整数;当x<0
时,返回不低于x的最大整数。
@smax(x1,x2,…,xn) 返回x1,x2,…,xn中的最大值
@smin(x1,x2,…,xn) 返回x1,x2,…,xn中的最小值
LINGO具有9种逻辑运算符:
#not# 否定该操作数的逻辑值,#not#是一个一元运算符
#eq# 若两个运算数相等,则为true;否则为flase
#ne# 若两个运算符不相等,则为true;否则为flase
#gt# 若左边的运算符严格大于右边的运算符,则为true;否则为flase
#ge# 若左边的运算符大于或等于右边的运算符,则为true;否则为flase
#lt# 若左边的运算符严格小于右边的运算符,则为true;否则为flase
#le# 若左边的运算符小于或等于右边的运算符,则为true;否则为flase
#and# 仅当两个参数都为true时,结果为true;否则为flase
#or# 仅当两个参数都为false时,结果为false;否则为true
^乘方
﹡乘
/除
﹢加
﹣减
LINGO唯一的一元算术运算符是取反函数“﹣”。
这些运算符的优先级由高到底为:
高﹣(取反)
^
﹡/
低﹢﹣
运算符的运算次序为从左到右按优先级高低来执行。
运算的次序可以用圆括号“()”来改变。
@file函数
该函数用从外部文件中输入数据,可以放在模型中任何地方。
该函数的语法格式为@file(’filename’)。
这里filename是文件名,可以采用相对路径和绝对路径两种表示方式。
@file函数对同一文件的两种表示方式的处理和对两个不同的文件处理是一样的,这一点必须注意。
注意:
1.软件中已经假设所以的变量是非负的,所以非负约束不必输入;
2.可以用FREE 变量来取消变量的非负限制;
3.不区分大小写;
4.约束条件“<=”、“>=”可以用“<”、“>”代替;
5.变量名不能超过8个字符;
6.变量与系数间可以有空格,但不能有任何运算符号(如*等);
7.不允许变量出现在一个约束条件的右端;
8.输入中不能有“()”和“,”;比如4(x1+x2)应写成4x1+4x2等;
9.在一个式中同一变量不能出现一次以上,比如2x1+3x2-x1应简化为x1+3x2;
10.int 变量变量为0/1整数变量
@FOR(集合名:约束表达式) 对集合的每个元素独立按约束表达式生成约束
关系运算符:
自我认识:
1、先要思考自己的方法,才试图用软件本身的语言来描述啊!。