CPLEX:在约束中使用决策变量

问题描述 投票:0回答:1
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””。图片中有方程式,请帮我纠正错误。谢谢你。

equation

cplex vehicle-routing
1个回答
0
投票

您的模型存在许多问题。

第一个范围数组不起作用:

//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;
}
}
© www.soinside.com 2019 - 2024. All rights reserved.