这是我第一次使用AMPL解决问题。谁能告诉我为什么这个程序给我Invalide Subcript x [2,1,1]吗?
谢谢 !
param K; #number of customers
param T; #number of orders
param J; #number of fabs
param I; #number if items
param A {i in 1..I, t in 1..T}; #quantity of item i requested in order t
param P { t in 1..T}; # price of order t if fully fulfilled
param C {i in 1..I, j in 1..J}; #number of items i that can be produced by fab j per hour
param Cap {j in 1..J}; #capacity hours for fab j
set list {j in 1..J}= {i in 1..I: C[i,j] <>0}; #set of items that can be produced by firm j
set nonlist {j in 1..J}= {i in 1..I: C[i,j] =0}; #set of items that cannot be produced by firm j
var x {i in 1..I, j in 1..J, t in i..T}; #optimal quantity of item i produced by fab j for order t
maximize profit:
#sum {i in 1..I, j in 1..J, t in 1..T} (P[t]*(x[i,j,t] / (sum{ i in 1..I} A[i,t]))); #written like that doesn't work?!
sum{t in 1..T} (P[t]*((sum{i in 1..I, j in 1..J} x[i,j,t])/(sum {i in 1..I} A[i,t])));
subject to limit {i in 1..I, t in 1..T}: sum {j in 1..J} x[i,j,t] <= A[i,t] ; #cannot produce more than ordered for each item i in each order t
subject to capacity {j in 1..J} : sum { t in 1..T, i in list[j]} (x [i,j,t] / C[i,j]) <= Cap [j]; #cannot produce more than maximum capacity for each fab j
subject to realistic {j in 1..J, i in nonlist[j], t in 1..T}: x[i,j,t] =0; # firm j cannot produce item i if C[i,j]=0
subject to nonnegativity {i in 1..I, j in 1..J, t in 1..T}: x[i,j,t] >= 0;
数据文件是
param T := 10;
param J:= 8;
param I:= 12;
param A:
1 2 3 4 5 6 7 8 9 10 :=
1 0 1000 0 0 5000 0 0 2000 1500 0
2 0 2000 0 4000 0 1000 1000 2000 0 0
3 0 0 1500 0 0 3500 500 0 3000 0
4 2000 0 0 0 0 1500 0 500 4000 2000
5 3000 0 0 5000 1500 0 0 1000 500 0
6 0 1000 0 0 2500 0 5000 0 1000 0
7 0 0 5000 0 0 0 0 1000 3000 0
8 0 0 4000 0 0 3000 0 0 2000 2000
9 0 0 6000 8000 2500 0 0 0 500 0
10 5000 0 0 0 0 0 0 2000 3000 3000
11 0 3000 0 2000 0 1500 0 3000 500 0
12 0 0 2000 3000 0 0 500 1000 1500 4000 ;
param P :=
1 5500
2 4300
3 9300
4 8600
5 8000
6 6700
7 4700
8 7000
9 9600
10 7200 ;
param Cap :=
1 840
2 750
3 610
4 470
5 560
6 240
7 1250
8 930;
param C:
1 2 3 4 5 6 7 8 :=
1 10 5 0 25 20 40 0 0
2 5 0 20 0 15 0 5 10
3 10 15 30 0 20 40 0 0
4 10 0 5 20 0 50 15 15
5 5 0 0 25 0 50 15 15
6 0 5 10 40 15 0 5 0
7 20 10 0 5 30 0 10 0
8 50 15 10 0 0 30 5 0
9 40 20 30 0 0 0 10 20
10 0 25 15 0 15 45 5 0
11 0 20 0 30 0 20 15 5
12 0 0 30 15 20 0 10 20;
正在运行的命令将给出结果Invalide Subcript x [2,1,1]:
该变量x[2,1,1]
不存在,因为x
已被索引{i in 1..I, j in 1..J, t in i..T}
,因此当i
为2时,t
从2变为T
。您应该将的声明更改为x
类似
var x {i in 1..I, j in 1..J, t in 1..T};
或更改声明中的索引,profit
并可能将约束与的索引保持一致x
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句