【问题标题】:CPLEX dvar as conditionCPLEX dvar 作为条件
【发布时间】:2017-06-02 14:42:16
【问题描述】:
我在尝试寻找资源约束调度问题的解决方案时遇到了这个问题。每当我将 dvar 作为 forall 循环中的条件或 if 条件时,我都会遇到错误,指出“不允许决策变量(或表达式)“S”。
range activity = 1..16;
dvar float+ S[activity];
dvar float+ rd[jobs];
forall (i in activity)
forall (t in T:S[i]<=t<=S[i]+D[i]) //boolean b
b[i][t]==1;
forall (t in T)
forall (k in R)
sum (i in activity)b[i][t]*V[i][k]<=Rk[k];//human resources constraint
forall (j in jobs)
forall (t in T:rd[j]<=t<=S[maxact[j]])//boolean y
y[j][t]==1;
【问题讨论】:
标签:
linear-programming
cplex
mixed-integer-programming
【解决方案1】:
这是一个非常常见的错误。您正在编写的代码是构建 cplex 的模型。您(dvars,如您的 S)中的 cplex 变量通常在模型求解之前没有值,因此您不能在模型构建过程中使用它们的值。您需要重构您的问题,并且您可能需要在模型中使用额外的 bool 或 int 变量或指示符约束。
【解决方案2】:
range activity = 1..16;
dvar float+ S[activity];
range jobs=1..3;
range T=1..3;
range R=1..4;
dvar boolean b[activity][T];
dvar boolean y[jobs][T];
int D[activity];
int Rk[R]; int V[activity][R]; int maxact[j in jobs]=1;
dvar float+ rd[jobs];
subject to {
forall (i in activity)
forall (t in T) //boolean b
((S[i]<=t) &&(t<=S[i]+D[i])) => (b[i][t]==1);
forall (t in T) forall (k in R)
sum (i in activity)b[i][t]*V[i][k]<=Rk[k];//human resources constraint
forall (j in jobs) forall (t in T)//boolean y
((rd[j]<=t) &&
(t<=S[maxact[j]])) => (y[j][t]==1);
}
会起作用
问候