多可选机器场景下Cplex二元决策变量约束实现问题
CPLEX 实现工序固定分配与可选机器单选约束的方法
你定义的*二元0-1决策变量Y(ijm)*完全可以满足需求,两类约束分别按如下方式实现即可:
1. 固定分配约束
对于必须分配给指定机器的工序,直接给对应变量添加等值为1的约束,强制变量固定取值。你举的示例对应约束如下:
- 作业1的工序1固定分配给机器4:
Y(1,1,4) == 1 - 作业1的工序2固定分配给机器2:
Y(2,1,2) == 1
如果有批量固定分配规则,可提前将所有需要固定分配的(i,j,m)三元组存入单独的集合,遍历集合批量添加约束即可,无需逐条手动编写。
2. 可选机器单选约束
对于同一作业的同一道工序,把所有可选机器对应的Y变量求和,设置求和结果等于1,就能保证刚好选中唯一一台机器。你举的作业1工序3可选机器2/3的场景对应约束如下:
Y(3,1,2) + Y(3,1,3) == 1
批量处理时,可提前为每个(i,j)工序-作业对维护可选机器集合M_ij,对所有(i,j)统一添加约束:sum(m in M_ij) Y(i,j,m) == 1
3. OPL语法示例代码
// 变量定义 dvar boolean Y[工序集][作业集][机器集]; subject to { // 逐条写固定分配约束 Y[1][1][4] == 1; Y[2][1][2] == 1; // 逐条写可选分配约束 Y[3][1][2] + Y[3][1][3] == 1; // 批量写法(推荐) // 提前定义fixedAssign:存储所有固定分配的<i,j,m>三元组集合 forall(<i,j,m> in fixedAssign) { Y[i][j][m] == 1; } // 提前定义optionalM[i][j]:存储工序i、作业j对应的所有可选机器集合 forall(i in 工序集, j in 作业集) { sum(m in optionalM[i][j]) Y[i][j][m] == 1; } }
补充说明
如果你使用Python/Java/C++等语言调用CPLEX API,约束逻辑完全一致,仅语法需要适配对应语言的API规则即可,无需修改约束逻辑本身。
内容的提问来源于stack exchange,提问作者Francesca
相关产品推荐
相关产品推荐

