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

如何在Google OR-Tools的mathopt中添加indicator与SOS约束

使用Google OR-Tools MathOpt原生实现Indicator与SOS约束

问题背景

使用Google OR-Tools的mathopt库时,无法直接调用官方文档支持的indicator约束与SOS约束,目前只能通过手动线性化方式实现,希望借助原生API简化代码逻辑。

原生API实现示例

以下是替换手动线性化逻辑,使用mathopt原生方法添加Indicator和SOS1约束的代码:

from ortools.math_opt.python import mathopt

model = mathopt.Model(name="MIP_model")
x_int = model.add_integer_variable(lb=0, ub=10, name="x_int")
y_int = model.add_integer_variable(lb=0, ub=10, name="y_int")
z_ind_bool = model.add_binary_variable(name="z_ind_bool")

# 基础线性约束
model.add_linear_constraint(x_int + y_int <= 15)

# 原生Indicator约束:当z_ind_bool=1时,x_int <=5
model.add_indicator_constraint(z_ind_bool, x_int <= 5)
# 强制z_ind_bool=1(与原测试代码逻辑一致)
model.add_linear_constraint(z_ind_bool == 1)

# 原生SOS1约束:x_int和y_int中最多有一个非零
model.add_sos1_constraint([x_int, y_int], name="sos1_x_y")

model.maximize(x_int + y_int)

params = mathopt.SolveParameters(enable_output=True)
result = mathopt.solve(model, mathopt.SolverType.GSCIP, params=params)

print("x:", result.variable_values()[x_int])  # 输出:x: 0.0
print("y:", result.variable_values()[y_int])  # 输出:y: 10.0

关键API说明

  • Indicator约束:调用model.add_indicator_constraint(binary_var, linear_constraint),第一个参数为触发约束的二进制变量,第二个参数是需要被触发的线性约束(如x_int <=5),无需手动设置Big-M参数,避免数值稳定性问题。
  • SOS1约束:调用model.add_sos1_constraint(variables, name=None),传入需组成SOS1集合的变量列表即可,mathopt会自动处理变量间的互斥关系,无需额外添加二进制变量和线性约束。

内容的提问来源于stack exchange,提问作者Bhartendu Awasthi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:17:42