CPLEX中关联工序可选机器集的二元决策变量定义问题
CPLEX柔性工序分配场景下按工序可选机器集定义二元决策变量的解决方案
核心问题说明
原来的全局M维度定义会生成大量不属于对应工序可选机器范围的无效变量,不符合柔性作业车间每道工序可选机器独立配置的需求,可通过CPLEX内置的依赖集合、稀疏索引特性解决。
具体实现步骤
步骤1:修正基础参数定义
先定义全局参数与工序级可选机器集合:int num_job = ...; range J = 1..num_job; // 作业索引范围 int max_op_per_job = ...; range I = 1..max_op_per_job; // 工序索引范围,取所有作业的最大工序数 int num_machine_total = ...; range M_all = 1..num_machine_total; // 全局机器索引范围 // 核心:定义每道工序O(ij)对应的可选机器集合,无对应工序的位置设为空集 {int} allowed_machine[I][J] = ...;步骤2:定义有效决策变量的索引空间
通过元组过滤所有合法的「工序-作业-机器」组合,避免无效维度:tuple YIndex { int op_id; // 工序i int job_id; // 作业j int machine_id; // 可选机器m } // 自动过滤所有符合工序可选机器要求的组合 {YIndex} valid_y_indices = {<i,j,m> | i in I, j in J, m in allowed_machine[i][j]};步骤3:定义二元决策变量
基于过滤后的有效索引定义稀疏变量,无任何多余无效变量生成:dvar boolean y[valid_y_indices];步骤4:约束与目标函数的调用示例
引用变量时直接传入元组索引即可,比如工序分配唯一约束的写法:// 每道存在的工序仅分配给一台可选机器 forall(i in I, j in J: allowed_machine[i][j] != {}) sum(<i,j,m> in valid_y_indices) y[<i,j,m>] == 1;
可选简化写法
如果偏好三维数组的调用形式,可直接在变量定义时绑定依赖范围,无需额外定义索引元组:
dvar boolean y[i in I][j in J][m in allowed_machine[i][j]];
该写法调用更直观,直接通过y[i][j][m]即可访问变量,适合可选机器组合数量不大的场景。
内容的提问来源于stack exchange,提问作者Francesca
相关产品推荐
相关产品推荐

