You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多可选机器场景下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:39:01