int n = ...;
int vmax = ...;
range Nc = 1..n;
range Nn = 0..(n-1);
range V = 1..vmax;
tuple Item {
int i; // customer i
int k; // item k
}
setof (Item) Ji= ...;
int h[Nc][Ji] = ...;
int l[Nc][Ji] = ...;
int w[Nc][Ji] = ...;
float D[V] = ...;
int H[V] = ...;
int L[V] = ...;
// Subsets for the individual items Iik
range Xik[i in Nc][k in Ji][v in V] = 0..(L[v] - minl(l[i][k], w[i][k]));
range Yik[i in Nc][k in Ji][v in V] = 0..(W[v] - minl(l[i][k], w[i][k]));
range Zik[i in Nc][k in Ji][v in V] = 0..(H[v] - h[i][k]);
// If item Iik of customer i who is visited in stage t by vehicle v
// is placed with its back-left-bottom corner at position (a, b, c)
dvar boolean pi[i in Nc][k in Ji][t in Nn][v in V][Xik[i][k][v]][Yik[i][k][v]][Zik[i][k][v]];
// If the item lik is not rotated, e.g. the length lik is parallel to the x-axis
dvar boolean o[Nc][Ji];
// Dimension of item Iik that is parallel to the x-axis
dexpr float llik[i in Nc][k in Ji] = o[i][k] * l[i][k] + (1 - o[i][k]) * w[i][k];
// Dimension of Iik that is parallel to the y-axis
dexpr float wwik[i in Nc][k in Ji] = (1 - o[i][k]) * l[i][k] + o[i][k] * w[i][k];
dexpr float aik[i in Nc][k in Ji] =
sum(t in Nn, v in V, a in Xik[i][k][v], b in Yik[i][k][v], c in Zik[i][k][v])
a * pi[i][k][t][v][a][b][c];
dexpr float bik[i in Nc][k in Ji] =
sum(t in Nn, v in V, a in Xik[i][k][v], b in Yik[i][k][v], c in Zik[i][k][v])
b * pi[i][k][t][v][a][b][c];
dexpr float cik[i in Nc][k in Ji] =
sum(t in Nn, v in V, a in Xik[i][k][v], b in Yik[i][k][v], c in Zik[i][k][v])
c * pi[i][k][t][v][a][b][c];
subject to{
forall (i in Nc, k in Ji, t in Nn, v in V, c in Zik[i][k][v]){
sum(a in Xik[i][k][v]:a > L[v] - llik[i][k], b in Yik[i][k][v]) pi[i][k][t][v][a][b][c]
+ sum(a in Xik[i][k][v], b in Yik[i][k][v]:b > W[v] - wwik[i][k]) pi[i][k][t][v][a][b][c] == 0;
}
}
我对约束部分中的 llik[i][k] 和 wwik[i][k] 部分有问题。错误是“不允许决策变量(或表达式)“llik””。图片中有方程式,请帮我纠正错误。谢谢你。
您的模型存在许多问题。
第一个范围数组不起作用:
//range c[i in 1..10]=1..i; does not work
{int} c[i in 1..10]=asSet(1..i); // works
dvar int x in first(c[1])..last(c[1]);
subject to
{
x<=2;
}
第二,当你使用切片时,所有数据都应该被绑定。所以
sum(a in Xik[i][k][v]:a > L[v] - llik[i][k]
无法工作
subject to{
forall (i in Nc, k in Ji, t in Nn, v in V, c in Zik[i][k][v]){
sum(a in Xik[i][k][v]: a in Yik[i][k][v]) (a-1 >= L[v] - llik[i][k])*pi[i][k][t][v][a][a][c]
+ sum(a in Xik[i][k][v], b in Yik[i][k][v]) (b-1 >= W[v] - wwik[i][k])*pi[i][k][t][v][a][b][c] == 0;
}
}
工作于
int n = 4;
int vmax = 2;
range Nc = 1..n;
range Nn = 0..(n-1);
range V = 1..vmax;
tuple Item {
int i; // customer i
int k; // item k
}
setof (Item) Ji;
int h[Nc][Ji] ;
int l[Nc][Ji] ;
int w[Nc][Ji] ;
float D[V];
int H[V];
int L[V] ;
int W[1..100];
// Subsets for the individual items Iik
{int} Xik[i in Nc][k in Ji][v in V] = asSet(0..(L[v] - minl(l[i][k], w[i][k])));
{int} Yik[i in Nc][k in Ji][v in V] = asSet(0..(W[v] - minl(l[i][k], w[i][k])));
{int} Zik[i in Nc][k in Ji][v in V] = asSet(0..5); //0..(H[v] - h[i][k]);
// If item Iik of customer i who is visited in stage t by vehicle v
// is placed with its back-left-bottom corner at position (a, b, c)
dvar boolean pi[i in Nc][k in Ji][t in Nn][v in V][1..10][1..10][1..10];
// If the item lik is not rotated, e.g. the length lik is parallel to the x-axis
dvar boolean o[Nc][Ji];
// Dimension of item Iik that is parallel to the x-axis
dexpr float llik[i in Nc][k in Ji] = o[i][k] * l[i][k] + (1 - o[i][k]) * w[i][k];
// Dimension of Iik that is parallel to the y-axis
dexpr float wwik[i in Nc][k in Ji] = (1 - o[i][k]) * l[i][k] + o[i][k] * w[i][k];
dexpr float aik[i in Nc][k in Ji] =
sum(t in Nn, v in V, a in Xik[i][k][v], b in Yik[i][k][v], c in Zik[i][k][v])
a * pi[i][k][t][v][a][b][c];
dexpr float bik[i in Nc][k in Ji] =
sum(t in Nn, v in V, a in Xik[i][k][v], b in Yik[i][k][v], c in Zik[i][k][v])
b * pi[i][k][t][v][a][b][c];
dexpr float cik[i in Nc][k in Ji] =
sum(t in Nn, v in V, a in Xik[i][k][v], b in Yik[i][k][v], c in Zik[i][k][v])
c * pi[i][k][t][v][a][b][c];
subject to{
forall (i in Nc, k in Ji, t in Nn, v in V, c in Zik[i][k][v]){
sum(a in Xik[i][k][v]: a in Yik[i][k][v]) (a-1 >= L[v] - llik[i][k])*pi[i][k][t][v][a][a][c]
+ sum(a in Xik[i][k][v], b in Yik[i][k][v]) (b-1 >= W[v] - wwik[i][k])*pi[i][k][t][v][a][b][c] == 0;
}
}