
2.然后我开始帮你解答这个题目:
【所有代码都是原创的,大概花了我一个上午才帮你解出来的。这个题目虽然不是太难,但是数据有些繁琐。集合声明比较多,维度不一。希望能够帮上你的忙。】
程序部分:
MODEL:
SETS:
program/1..4/!定义四个项目
factory/1,2/:totaltime!定义两个车间,注意:本程序中,我们约定q开头代表数量,c开头代表成本
warehouse/1,2,3/!定义三个仓库
steel/A,B,C,D/!定义四种钢材(集合中第四种钢材为塑钢门窗)
component/1,2/!定义两种构件
linka(steel,warehouse):qlinka!表2.1==仓库存钢量
linkb(component,steel):qlinkb!表2.2==单位构件需钢材量
linkc(factory,component):time,cost,qlinkc!表2.3 2.4==车间生产成本(&耗时)
linkd(program,component):cpdemand!表2.5,cpdemand stands for "component demand"构件需求量
linke(program,steel):stdemand!表2.5,stdemand for "steel demand"钢材需求量
linkf(factory,steel):qlinkf
deepa(factory,program,component):qdeepa!2*4*2=16个量
deepb(warehouse,program,steel):qdeepb!3*4*4=48个量
deepc(steel,warehouse,factory):qdeepc!4*3*2=24
!deepd(factory,component,steel):qdeepd!2*2*4=16
transa(factory,program):qtransa,ctransa!本集合和下面两个集合,仓库,车间,项目之间的运输。表2.6
transb(warehouse,program):qtransb,ctransb
transc(warehouse,factory):qtransc,ctransc
ENDSETS
DATA:
qlinka=
4000 4000 6000
3000 3500 2500
3000 5000 5000
200 250 100
qlinkb=
15 10 20 0
20 10 15 0
totaltime= 35000 60000
time=100 200
200 100
cost=6600 7800
6500 7300
cpdemand=
50 100
30 60
100 200
50 80
stdemand=
100 70 0 100
50 80 0 120
30 90 0 80
70 60 0 200
ctransa=
100 150 80 70
50 60 80 90
ctransb=
40 20 30 50
60 40 80 100
50 60 75 85
ctransc=
40 80
100 20
80 40
ENDDATA
MIN=@sum(linkc:cost*qlinkc)+@sum(transa:qtransa*ctransa)+@sum(transb:qtransb*ctransb)+@sum(transc:qtransc*ctransc)
!1.构件需求约束
@for(linkd(i,j):@sum(factory(k):qdeepa(k,i,j))=cpdemand(i,j))
!2.钢材需求约束
@for(linke(i,j):@sum(warehouse(k):qdeepb(k,i,j))=stdemand(i,j))
!3.车间工时约束
@for(factory(i):@sum(component(j):time(i,j)*qlinkc(i,j))<=totaltime(i))
!4.库存钢材数量平衡
@for(linka(i,j):@sum(program(k):qdeepb(j,k,i))+@sum(factory(m):qdeepc(i,j,m))<=qlinka(i,j))
!5.生产运出平衡
@for(linkc(i,j):@sum(program(k):qdeepa(i,k,j))=qlinkc(i,j))
!6.单位构件需钢材量约束
@for(linkf(i,k):qlinkf(i,k)=@sum(component(j):qlinkc(i,j)*qlinkb(j,k)))
!7.运输量的约束
@for(transa(i,j):qtransa=@sum(component(k):qdeepa(i,j,k)))
@for(transb(i,j):qtransb=@sum(steel(k):qdeepb(i,j,k)))
@for(transc(i,j):qtransc=@sum(steel(k):qdeepc(k,i,j)))
@for(linkf(i,j):qlinkf(i,j)=@sum(warehouse(k):qdeepc(j,k,i)))
END
部分结果:
Global optimal solution found at iteration:80
Objective value: 5770900.
Variable ValueReduced Cost
TOTALTIME( 1)35000.000.000000
TOTALTIME( 2)60000.000.000000
QLINKA( A, 1)4000.0000.000000
QLINKA( A, 2)4000.0000.000000
QLINKA( A, 3)6000.0000.000000
QLINKA( B, 1)3000.0000.000000
QLINKA( B, 2)3500.0000.000000
QLINKA( B, 3)2500.0000.000000
QLINKA( C, 1)3000.0000.000000
QLINKA( C, 2)5000.0000.000000
QLINKA( C, 3)5000.0000.000000
QLINKA( D, 1)200.00000.000000
QLINKA( D, 2)250.00000.000000
QLINKA( D, 3)100.00000.000000
QLINKB( 1, A)15.000000.000000
QLINKB( 1, B)10.000000.000000
QLINKB( 1, C)20.000000.000000
QLINKB( 1, D)0.0000000.000000
QLINKB( 2, A)20.000000.000000
QLINKB( 2, B)10.000000.000000
QLINKB( 2, C)15.000000.000000
QLINKB( 2, D)0.0000000.000000
TIME( 1, 1)100.00000.000000
TIME( 1, 2)200.00000.000000
TIME( 2, 1)200.00000.000000
TIME( 2, 2)100.00000.000000
COST( 1, 1)6600.0000.000000
COST( 1, 2)7800.0000.000000
COST( 2, 1)6500.0000.000000
COST( 2, 2)7300.0000.000000
QLINKC( 1, 1)150.00000.000000
QLINKC( 1, 2)0.00000017.50000
QLINKC( 2, 1)80.000000.000000
QLINKC( 2, 2)440.00000.000000
CPDEMAND( 1, 1)50.000000.000000
CPDEMAND( 1, 2)100.00000.000000
CPDEMAND( 2, 1)30.000000.000000
CPDEMAND( 2, 2)60.000000.000000
CPDEMAND( 3, 1)100.00000.000000
CPDEMAND( 3, 2)200.00000.000000
CPDEMAND( 4, 1)50.000000.000000
CPDEMAND( 4, 2)80.000000.000000
STDEMAND( 1, A)100.00000.000000
STDEMAND( 1, B)70.000000.000000
STDEMAND( 1, C)0.0000000.000000
STDEMAND( 1, D)100.00000.000000
STDEMAND( 2, A)50.000000.000000
STDEMAND( 2, B)80.000000.000000
STDEMAND( 2, C)0.0000000.000000
STDEMAND( 2, D)120.00000.000000
STDEMAND( 3, A)30.000000.000000
STDEMAND( 3, B)90.000000.000000
STDEMAND( 3, C)0.0000000.000000
STDEMAND( 3, D)80.000000.000000
STDEMAND( 4, A)70.000000.000000
STDEMAND( 4, B)60.000000.000000
STDEMAND( 4, C)0.0000000.000000
STDEMAND( 4, D)200.00000.000000
QLINKF( 1, A)2250.0000.000000
QLINKF( 1, B)1500.0000.000000
QLINKF( 1, C)3000.0000.000000
QLINKF( 1, D)0.0000000.000000
QLINKF( 2, A)10000.000.000000
QLINKF( 2, B)5200.0000.000000
QLINKF( 2, C)8200.0000.000000
QLINKF( 2, D)0.0000000.000000
QDEEPA( 1, 1, 1)0.0000000.000000
QDEEPA( 1, 1, 2)0.00000070.00000
QDEEPA( 1, 2, 1)0.00000040.00000
QDEEPA( 1, 2, 2)0.000000110.0000
QDEEPA( 1, 3, 1)100.00000.000000
QDEEPA( 1, 3, 2)0.00000020.00000
QDEEPA( 1, 4, 1)50.000000.000000
QDEEPA( 1, 4, 2)0.0000000.000000
QDEEPA( 2, 1, 1)50.000000.000000
QDEEPA( 2, 1, 2)100.00000.000000
QDEEPA( 2, 2, 1)30.000000.000000
QDEEPA( 2, 2, 2)60.000000.000000
QDEEPA( 2, 3, 1)0.00000050.00000
QDEEPA( 2, 3, 2)200.00000.000000
QDEEPA( 2, 4, 1)0.00000070.00000
QDEEPA( 2, 4, 2)80.000000.000000
QDEEPB( 1, 1, A)100.00000.000000
QDEEPB( 1, 1, B)70.000000.000000
QDEEPB( 1, 1, C)0.00000062.50000
QDEEPB( 1, 1, D)0.00000025.00000
QDEEPB( 1, 2, A)50.000000.000000
QDEEPB( 1, 2, B)80.000000.000000
QDEEPB( 1, 2, C)0.00000042.50000
QDEEPB( 1, 2, D)0.00000025.00000
QDEEPB( 1, 3, A)30.000000.000000
QDEEPB( 1, 3, B)90.000000.000000
QDEEPB( 1, 3, C)0.00000052.50000
QDEEPB( 1, 3, D)80.000000.000000
QDEEPB( 1, 4, A)70.000000.000000
QDEEPB( 1, 4, B)60.000000.000000
QDEEPB( 1, 4, C)0.00000072.50000
QDEEPB( 1, 4, D)120.00000.000000
QDEEPB( 2, 1, A)0.00000080.00000
QDEEPB( 2, 1, B)0.00000040.00000
QDEEPB( 2, 1, C)0.00000080.00000
QDEEPB( 2, 1, D)80.000000.000000
QDEEPB( 2, 2, A)0.00000080.00000
QDEEPB( 2, 2, B)0.00000040.00000
QDEEPB( 2, 2, C)0.00000060.00000
QDEEPB( 2, 2, D)120.00000.000000
QDEEPB( 2, 3, A)0.000000110.0000
QDEEPB( 2, 3, B)0.00000070.00000
QDEEPB( 2, 3, C)0.000000100.0000
QDEEPB( 2, 3, D)0.0000005.000000
QDEEPB( 2, 4, A)0.000000110.0000
QDEEPB( 2, 4, B)0.00000070.00000
QDEEPB( 2, 4, C)0.000000120.0000
QDEEPB( 2, 4, D)0.0000005.000000
QDEEPB( 3, 1, A)0.00000050.00000
QDEEPB( 3, 1, B)0.00000010.00000
QDEEPB( 3, 1, C)0.00000050.00000
QDEEPB( 3, 1, D)20.000000.000000
QDEEPB( 3, 2, A)0.00000080.00000
QDEEPB( 3, 2, B)0.00000040.00000
QDEEPB( 3, 2, C)0.00000060.00000
QDEEPB( 3, 2, D)0.00000030.00000
QDEEPB( 3, 3, A)0.00000085.00000
QDEEPB( 3, 3, B)0.00000045.00000
QDEEPB( 3, 3, C)0.00000075.00000
QDEEPB( 3, 3, D)0.00000010.00000
QDEEPB( 3, 4, A)0.00000075.00000
QDEEPB( 3, 4, B)0.00000035.00000
QDEEPB( 3, 4, C)0.00000085.00000
QDEEPB( 3, 4, D)80.000000.000000
QDEEPC( A, 1, 1)2250.0000.000000
QDEEPC( A, 1, 2)0.0000000.000000
QDEEPC( A, 2, 1)0.000000120.0000
QDEEPC( A, 2, 2)4000.0000.000000
QDEEPC( A, 3, 1)0.00000080.00000
QDEEPC( A, 3, 2)6000.0000.000000
QDEEPC( B, 1, 1)1500.0000.000000
QDEEPC( B, 1, 2)0.00000040.00000
QDEEPC( B, 2, 1)0.00000080.00000
QDEEPC( B, 2, 2)3500.0000.000000
QDEEPC( B, 3, 1)0.00000040.00000
QDEEPC( B, 3, 2)1700.0000.000000
QDEEPC( C, 1, 1)3000.0000.000000
QDEEPC( C, 1, 2)0.00000062.50000
QDEEPC( C, 2, 1)0.00000057.50000
QDEEPC( C, 2, 2)5000.0000.000000
QDEEPC( C, 3, 1)0.00000017.50000
QDEEPC( C, 3, 2)3200.0000.000000
QDEEPC( D, 1, 1)0.00000085.00000
QDEEPC( D, 1, 2)0.000000125.0000
QDEEPC( D, 2, 1)0.000000100.0000
QDEEPC( D, 2, 2)0.00000020.00000
QDEEPC( D, 3, 1)0.00000090.00000
QDEEPC( D, 3, 2)0.00000050.00000
QTRANSA( 1, 1)0.0000000.000000
QTRANSA( 1, 2)0.0000000.000000
QTRANSA( 1, 3)100.00000.000000
QTRANSA( 1, 4)50.000000.000000
QTRANSA( 2, 1)150.00000.000000
QTRANSA( 2, 2)90.000000.000000
QTRANSA( 2, 3)200.00000.000000
QTRANSA( 2, 4)80.000000.000000
CTRANSA( 1, 1)100.00000.000000
CTRANSA( 1, 2)150.00000.000000
CTRANSA( 1, 3)80.000000.000000
CTRANSA( 1, 4)70.000000.000000
CTRANSA( 2, 1)50.000000.000000
CTRANSA( 2, 2)60.000000.000000
CTRANSA( 2, 3)80.000000.000000
CTRANSA( 2, 4)90.000000.000000
QTRANSB( 1, 1)170.00000.000000
QTRANSB( 1, 2)130.00000.000000
QTRANSB( 1, 3)200.00000.000000
QTRANSB( 1, 4)250.00000.000000
QTRANSB( 2, 1)80.000000.000000
QTRANSB( 2, 2)120.00000.000000
QTRANSB( 2, 3)0.0000000.000000
QTRANSB( 2, 4)0.0000000.000000
QTRANSB( 3, 1)20.000000.000000
QTRANSB( 3, 2)0.0000000.000000
QTRANSB( 3, 3)0.0000000.000000
QTRANSB( 3, 4)80.000000.000000
CTRANSB( 1, 1)40.000000.000000
CTRANSB( 1, 2)20.000000.000000
CTRANSB( 1, 3)30.000000.000000
CTRANSB( 1, 4)50.000000.000000
CTRANSB( 2, 1)60.000000.000000
CTRANSB( 2, 2)40.000000.000000
CTRANSB( 2, 3)80.000000.000000
CTRANSB( 2, 4)100.00000.000000
CTRANSB( 3, 1)50.000000.000000
CTRANSB( 3, 2)60.000000.000000
CTRANSB( 3, 3)75.000000.000000
CTRANSB( 3, 4)85.000000.000000
QTRANSC( 1, 1)6750.0000.000000
QTRANSC( 1, 2)0.0000000.000000
QTRANSC( 2, 1)0.0000000.000000
QTRANSC( 2, 2)12500.000.000000
QTRANSC( 3, 1)0.0000000.000000
QTRANSC( 3, 2)10900.000.000000
CTRANSC( 1, 1)40.000000.000000
CTRANSC( 1, 2)80.000000.000000
CTRANSC( 2, 1)100.00000.000000
CTRANSC( 2, 2)20.000000.000000
CTRANSC( 3, 1)80.000000.000000
CTRANSC( 3, 2)40.000000.000000
最后:我对结果只是检验了一下需求量,发现满足,如果你发现有什么不对的地方,可以告诉我,我会对其进行调整。另外我的集合声明中有些如果你觉得繁琐的地方,可以进行修改。联系方式511757449@qq.com,或者直接在百度HI上留言。
sets:k/1..5/
z/1..8/:m
link(k,z):a,c,l,s
endsets
min=@sum(link:a)
@sum(z(j):a(4,j)*c(4,j))<=150
@sum(z(j):a(5,j)*c(5,j))<=400
@sum(z(j):a(1,j)*c(1,j))<=360+40*t
@sum(z(j):a(2,j)*c(2,j))<=600+30*t
@sum(z(j):a(3,j)*c(3,j))<=500+20*t
@for(z(j):@sum(k(i):a(i,j))=m(j))
t=@max(link(i,j):c(i,j)*(2*s(i,j)+2))
t<=10
data:
m=300 330 120 170 110 100 1000 700
s=3.08 2.5 2.6 5.74 4.28 6.2 2 3.86
1.16 3.14 4.12 5.06 2.36 5.52 1.96 2.96
4.48 6.64 6.74 2.9 3.28 1.86 3.34 2.04
4.8 4.5 5.4 8.1 8.2 6.55 5.74 4.32
1.84 2.58 3.92 3.74 3.84 3.98 3.82 2.36
enddata
A会报错,报错代码为70,错误原因属性的下标越界详解:for循环,i取1到4,当i=4时,s(i+1)=s(5),而根据前面集的定义知道s只有4个元素而已,不存在s(5),也就是下标越界
正确写法应该是@for(yuefen(i)|i#LT#4:s(i+1)=s(i)+x(i)-d(i))或@for(yuefen(i)|i#LE#3:s(i+1)=s(i)+x(i)-d(i))
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)