Cplex如何使用变量在约束中建立索引

时间:2019-12-11 14:08:45

标签: cplex

我正在尝试使用决策变量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];
}

1 个答案:

答案 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是布尔值或具有相对较小域的整数时有用。