LINGO教程.docx

上传人:b****6 文档编号:6706355 上传时间:2023-01-09 格式:DOCX 页数:24 大小:23.46KB
下载 相关 举报
LINGO教程.docx_第1页
第1页 / 共24页
LINGO教程.docx_第2页
第2页 / 共24页
LINGO教程.docx_第3页
第3页 / 共24页
LINGO教程.docx_第4页
第4页 / 共24页
LINGO教程.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

LINGO教程.docx

《LINGO教程.docx》由会员分享,可在线阅读,更多相关《LINGO教程.docx(24页珍藏版)》请在冰豆网上搜索。

LINGO教程.docx

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(变量名)

允许该变量为负数.

@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数组名;

endsets

min=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)的系数400200150500;

此时,可用data语句;例:

sets:

l/1..4/:

a,x;

endsets

data:

a=7239;

enddata

data语句是以data开头,enddata结尾.

这样就定义了数组a,其中a

(1)=7,a

(2)=2,a(3)=3,a(4)=9.

范例程序3:

sets:

l/1..4/:

x,a;

endsets

data:

a=7239;!

a

(1)=7,a

(2)=2,a(3)=3,a(4)=9;

enddata

max=x

(1)*a(3)+x

(2)*a

(1)+x(3)*a(4)+x(4)*a

(2);

x

(1)+x(4)-x

(2)-x(3)

(1);

x(4)+2*x

(2)

x

(1)+x(3)

(1);

Lingo含有一些针对数组的命令,方便了数组的使用

@for循环语句:

@for(数组类型名(i):

循环的语句);

范例程序4:

sets:

r/1..5/:

a,b;

endsets

data:

a=3.34.62.77.110.3;

enddata

max=a

(1)*b

(1)-a

(2)*b

(2)+a(3)*b(3)-a(4)*b(4);

@for(r(i):

b(i)

!

等价于b

(1)

(1),b

(2)

(2),b(3)

@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;

endsets

data:

a=3.34.62.77.110.3;

enddata

max=@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)

!

等价于b

(1)

(1),b

(2)

(2),b(3)

@for(r(i):

@gin(b(i)));

示例程序6:

sets:

m/1..4/:

x,need,g,y;

endsets

data:

need=40002000300010000;

enddata

min=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=23456

78923

47821;

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,矩阵名;

endsets

data语句用于矩阵;

data:

x=2567

5631

87910;

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矩阵;

endsets

data:

s=750250400;

pr=2345;

x=151062

161014

58139;

enddata

max=@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

(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

(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

x(4,1)*pd

(1)/16+x(4,2)*pd

(2)/16+x(4,3)*pd(3)/16+x(4,4)*pd(4)/16

示例程序8:

sets:

l/1..4/;

m(l,l):

a,x;

endsets

data:

a=54545153

51575252

50535456

56545553;

enddata

min=@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源程序

Modellingo-LP1:

sets:

mat/1..4/:

x;!

x,果仁巧克力,冰淇淋,可乐,奶酪的数量;

endsets

min=50*x

(1)+20*x

(2)+30*x(3)+80*x(4);!

50302080---单价;

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;!

保证脂肪的需求;

Modellingo-LP1-1:

sets:

mat/1..2/:

x;!

x

(1),硬糖产量,x

(2),硬糖产量;

endsets

max=25*x

(1)+20*x

(2);!

2520单价;

x

(1)+x

(2)<=(100+20+30);!

总产量限制;

0.2*x

(1)+0.1*x

(2)<=20;!

坚果限制;

0.1*x

(2)<=30;!

巧克力限制;

Modellingo-LP1-2:

sets:

mat/1..3/:

x;!

x

(1),x

(2),x(3)分别表示A,B,C的产量;

endsets

max=10*x

(1)+56*x

(2)+100*x(3);!

1056100售价;

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)须为整数;

 

Modellingo-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=40002000300010000;

enddata

g

(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之间;

Modellingo-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季度加班生产量;

endsets

data:

need=302040;

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);

!

4060,单位生产成本,15,单位存储费;

@for(c(i):

x(1,i)<=27);!

每季度正常产量的限制;

Modellingo-LP3

(1):

sets:

m/1..7/:

x,g,g0;

!

x,星期一开始上班(休假结束),星期二开始上班,...星期日上班,对应人数;

!

g,每天实际上班人数;

!

g0,每天需求人数;

endsets

data:

g0=17131519141611;

enddata

min=@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,必为整数;

Modellingo-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);

endsets

data:

g0=17131519141611;

enddata

min=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,@wrap(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)));

Modellingo-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;!

每个时段冗余人数,确保足够的信贷员;

endsets

min=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)));

end

Modellingo-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),每月卖谷子后仓库的谷子库存;

endsets

data:

buy=300350400500;

sell=350450350550;

enddata

g(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);!

最后现金最多;

Modellingo-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;

Modellingo-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);

Modellingo-LP6:

max=3*x+5*y;!

x,产品I的产量,y,品II的产量;

3*x+4*y<36;!

设备的限制;

2*y<12;!

原材料A的限制;

x<8;!

原材料B的限制;

Modellingo-LP7:

sets:

l/1..4/;

m(l,l):

a,x;!

x,指派矩阵,a,游泳成绩表;

endsets

data:

a=54545153

51575252

50535456

56545553;

enddata

min=@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;

Modellingo-LP8:

sets:

r/1..5/;

c/1..4/;

m(r,c):

a,x;!

x,指派矩阵,a,工作耗时表;

endsets

data:

a=22183018

1810002722

26202828

1622100014

2110002528;

enddata

min=@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或0

Modellingo-LP9:

sets:

l/1..6/:

x,g,p,y;

!

x,6类高度树木的面积;

!

g,6类高度树木的生长率;

!

p,6类高度树木的经济价值;

!

y,6类高度树木的砍伐面积;

endsets

data:

g=0.280.320.250.230.370;

p=050100150200250;

enddata

max=@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)

每类砍伐面积不能超过该类树木面积;

Modellingo-LP10a:

sets:

l/1..4/;

m(l,l):

a,x;!

x,招标矩阵,a,竞标价格矩阵;

endsets

data:

a=45100100

10041004

31002100

10010045;!

100,很大数字表不招标,不竞标;

enddata

min=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;

Modellingo-LP10b:

sets:

l/1..4/;

m(l,l):

a,x;

endsets

data:

a=45100100

10041004

31002100

10010045;

enddata

min=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)));

 

Modellingo-LP11:

sets:

l/1..5/:

g;!

5个地点的输入与输入差;

m(l,l):

c,x;!

x,运输方案,c,运输成本;

endsets

data:

c=014010090225

1450111110119

105115011378

8910912101000000

2101178210000000;

!

很大的数1000000表示禁止运输发生;

enddata

min=@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的纯输入应等于需求;

Modellingo-LP12:

sets:

r/1..3/:

pd;!

A,B,C3个化肥厂的产量;

c/1..4/:

mnn,mxn;!

mnn,I,II,III,IV的最低需求,mxn,I,II,III,IV的最高需求;

m(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 卡通动漫

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1