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