有没有办法让一个 dvar 中的索引依赖于 Cplex 中的另一个 dvar?
Is there a way to make an index in a dvar dependent on another dvar in Cplex?
我需要在我的 Cplex 转运问题中包含一个时间方面。这是我的代码的一部分,其中 x 是一个二进制变量,如果订单在时间 t 通过这条腿从终端 i 发送到终端 j,则该变量等于 1。我有 3 个终端,其中终端 1 是起点,终端 2 是中间枢纽,终端 3 是网关。
每个订单都需要在 pickuptime[n] 时在 1 号航站楼被取货,并且它在 leg x 上行驶几个等于 leadtime[1,2] 的时间段。然后,它需要在时间 t+leadtime[1,2] 从终端 2 继续到终端 3。但是,出于我的模型中所述的合并原因,也有可能在时间 t 使用终端 2 到 3 的 x,该时间晚于 t+leadtime[1,2] 并且最大值等于 T:
dvar int+ x[terminal, terminal, order, time] in 0..1;
forall(n in order) x[1,2,n,pickuptime[n]] == 1;
forall(n in order) x[1,2,n,t] <= x[2,3,n,t+leadtime[1,2]] + x[2,3,n,t+leadtime[1,2]+1] + ... + x[2,3,n,t+leadtime[1,2]+T];
x[2,3,n,t+leadtime[1,2]] + x[2,3,n,t+leadtime[1,2]+1] + ... + x[2,3,n,t+leadtime[1,2]+T]<= 1;
这个 T 取决于每个订单,例如订单 1:
x[1,2,1,t] <= x[2,3,1,t+leadtime[1,2]] + x[2,3,1,t+leadtime[1,2]+1] + x[2,3,n,t+leadtime[1,2]+2];
x[2,3,1,t+leadtime[1,2]] + x[2,3,1,t+leadtime[1,2]+1] + x[2,3,1,t+leadtime[1,2]+2]<= 1;
希望订单 2:
x[1,2,2,t] <= x[2,3,2,t+leadtime[1,2]] + x[2,3,2,t+leadtime[1,2]+1] + x[2,3,2,t+leadtime[1,2]+2] + x[2,3,2,t+leadtime[1,2]+3];
x[2,3,2,t+leadtime[1,2]] + x[2,3,2,t+leadtime[1,2]+1] + x[2,3,2,t+leadtime[1,2]+2] + x[2,3,2,t+leadtime[1,2]+3] <= 1;
有没有办法对此进行不同的编码,以便每个订单都如此?
range T=1..10;
range Term=1..5;
int leadtime[i in Term][j in Term]=rand(10);
int t=1;
int n[1..2]=[2,3];
dvar boolean x[Term][Term][Term][T];
subject to
{
forall(a in 1..2)
{
x[a,a+1,1,t] <= sum(i in 0..n[a]) x[a+1,a+2,1,t+leadtime[1,2]+i];
sum(i in 0..n[a]) x[a+1,a+2,1,t+leadtime[1,2]+i] <= 1;
}
}
我需要在我的 Cplex 转运问题中包含一个时间方面。这是我的代码的一部分,其中 x 是一个二进制变量,如果订单在时间 t 通过这条腿从终端 i 发送到终端 j,则该变量等于 1。我有 3 个终端,其中终端 1 是起点,终端 2 是中间枢纽,终端 3 是网关。 每个订单都需要在 pickuptime[n] 时在 1 号航站楼被取货,并且它在 leg x 上行驶几个等于 leadtime[1,2] 的时间段。然后,它需要在时间 t+leadtime[1,2] 从终端 2 继续到终端 3。但是,出于我的模型中所述的合并原因,也有可能在时间 t 使用终端 2 到 3 的 x,该时间晚于 t+leadtime[1,2] 并且最大值等于 T:
dvar int+ x[terminal, terminal, order, time] in 0..1;
forall(n in order) x[1,2,n,pickuptime[n]] == 1;
forall(n in order) x[1,2,n,t] <= x[2,3,n,t+leadtime[1,2]] + x[2,3,n,t+leadtime[1,2]+1] + ... + x[2,3,n,t+leadtime[1,2]+T];
x[2,3,n,t+leadtime[1,2]] + x[2,3,n,t+leadtime[1,2]+1] + ... + x[2,3,n,t+leadtime[1,2]+T]<= 1;
这个 T 取决于每个订单,例如订单 1:
x[1,2,1,t] <= x[2,3,1,t+leadtime[1,2]] + x[2,3,1,t+leadtime[1,2]+1] + x[2,3,n,t+leadtime[1,2]+2];
x[2,3,1,t+leadtime[1,2]] + x[2,3,1,t+leadtime[1,2]+1] + x[2,3,1,t+leadtime[1,2]+2]<= 1;
希望订单 2:
x[1,2,2,t] <= x[2,3,2,t+leadtime[1,2]] + x[2,3,2,t+leadtime[1,2]+1] + x[2,3,2,t+leadtime[1,2]+2] + x[2,3,2,t+leadtime[1,2]+3];
x[2,3,2,t+leadtime[1,2]] + x[2,3,2,t+leadtime[1,2]+1] + x[2,3,2,t+leadtime[1,2]+2] + x[2,3,2,t+leadtime[1,2]+3] <= 1;
有没有办法对此进行不同的编码,以便每个订单都如此?
range T=1..10;
range Term=1..5;
int leadtime[i in Term][j in Term]=rand(10);
int t=1;
int n[1..2]=[2,3];
dvar boolean x[Term][Term][Term][T];
subject to
{
forall(a in 1..2)
{
x[a,a+1,1,t] <= sum(i in 0..n[a]) x[a+1,a+2,1,t+leadtime[1,2]+i];
sum(i in 0..n[a]) x[a+1,a+2,1,t+leadtime[1,2]+i] <= 1;
}
}