CPLEX批量数量约束编写:生产及外包量整除条件如何实现
CPLEX 整数倍约束正确实现方案
约束1:自制冰淇淋按60单位分批次生产
你原有代码无法生效有两个核心原因:
- 下标参数写错:循环变量是
t,但公式里用了未定义的下标d - OPL 中
%模运算符仅支持整型操作数,直接对决策变量写模运算约束兼容性差,容易触发求解错误
最佳实现方式(推荐)
引入辅助整数变量记录批次数量,通过乘法约束保证生产数量是60的整数倍,求解器处理效率更高:
// 先定义辅助决策变量:每个口味每日生产的批次数量,非负整数 dvar int batch_count[f in flavour][t in time] >= 0; // 写入约束 forall(f in flavour, t in time) { quantity[f][t] == 60 * batch_count[f][t]; }
如果你的quantity本身已经定义为非负整数变量,也可以修正下标后直接用模运算写法:
forall(f in flavour, t in time) quantity[f][t] % 60 == 0;
约束2:外包采购量为5的整数倍
和上述逻辑一致,假设每日外包总采购量为outsource_total[t],实现方式如下:
// 定义辅助决策变量:每日采购的批次数量,非负整数 dvar int purchase_batch[t in time] >= 0; // 写入约束 forall(t in time) { outsource_total[t] == 5 * purchase_batch[t]; }
如果外包总采购量是多变量求和得到的,直接替换约束左侧即可,示例:
forall(t in time) { sum(f in flavour) outsource_q[f][t] == 5 * purchase_batch[t]; }
内容的提问来源于stack exchange,提问作者BST
相关产品推荐
相关产品推荐

