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

如何在GNU MathProg中为变量添加整除约束

问题原因

GNU MathProg(又称GMPL)中的mod是编译期求值运算符,仅支持作用于常量、提前完成赋值的已知参数,无法直接作用于待求解的决策变量,因此直接编写x1 mod 10 = 0形式的约束会触发operand preceding mod has invalid type报错。

解决方法

不需要使用mod运算符,将整除要求转化为标准混合整数线性约束即可实现需求:
如果要求决策变量可被某一正整数d整除,本质上一定存在某个整数k,使得原决策变量的值恰好等于d与k的乘积。你只需要新增一个整数类型的辅助变量k,添加对应的线性等式约束就能实现整除限制。

代码示例

以要求x1可被10整除的场景为例:

  1. 定义辅助整数变量,根据原变量x1的取值范围给k设置合理上下界(例如此处x1取值范围为0到1000,对应k的范围就是0到100):
var x1 integer >= 0, <= 1000; /* 原决策变量,保持原有定义即可 */
var k integer >= 0, <= 100;   /* 新增的辅助整数变量 */
  1. 替换原有错误的mod约束,编写线性等式约束:
s.t. c1: x1 = 10 * k;

通用规则

如果要求决策变量x可被任意正整数d整除:

  • 新增整数类型辅助变量k
  • 根据x的上下界推导k的上下界:k的下界 = ceil(x的下界 / d),k的上界 = floor(x的上界 / d)
  • 添加约束s.t. divisible_cons: x = d * k;

注意事项

  • 必须给辅助变量k设置明确的上下界,否则求解器会在极大的整数范围内搜索,大幅拖慢求解速度,甚至引发数值稳定性问题。
  • 该写法属于纯线性约束,完全兼容MathProg支持的所有混合整数线性规划求解器,求解效率远高于尝试用非线性运算符构造的特殊写法。

内容的提问来源于stack exchange,提问作者Kshitiz Sinha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:31:17