我正在尝试使用决策变量Y更新约束中决策变量X的索引。但是,它似乎在Cplex中不起作用。感谢您的帮助,在此先感谢您。这是我的代码:
// Parameters
int Tmax = ...;
int u[i][r][m] = ...;
int b[i][r][m][a] = ...;
float t[i][r][j][s] = ...;
// Variables
dvar boolean X[i][r][m][j][s][n][k];
dvar boolean Y[i][r][m][k];
// Objective Function
dexpr float TotalDuration = sum(ci in i, cr in r, cm in m, cj in j, cs in s, cn in n, ck in k) t[ci][cr][cj][cs]*X[ci][cr][cm][cj][cs][cn][ck] + sum(ci in i, cr in r, cm in m, ck in k) u[ci][cr][cm]*Y[ci][cr][cm][ck];
minimize TotalDuration;
subject to {
forall(ci in i, cr in r, cm in m, cj in j, cs in s, cn in n, ck in k)
TimeConservative:
X[ci][cr][cm][cj][cs][cn][ck] == X[ci][cr][cm][cj][cs][cm+u[ci][cr][cm]*Y[ci][cr][cm][ck] + t[ci][cr][cj][cs]][ck];
}
答案 0 :(得分:1)
使用CPLEX时,不能将决策变量用作索引。使用CP,这是可能的。由于只有布尔决策变量,因此可以尝试使用CP解决问题。为此,您必须在using CP;
文件的顶部添加.mod
。
如果您需要/想要坚持使用CPLEX,解决此限制的一种常见方法是使用逻辑“隐含”约束来明确说明Y的两种情况:
(Y[ci][cr][cm][ck] == 0) => (/* here comes the constraint that must be satisfied if Y==0);
(Y[ci][cr][cm][ck] == 1) => (/* here comes the constraint that must be satisfied if Y==1);
这当然仅在Y
是布尔值或具有相对较小域的整数时有用。