如何在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
相关产品推荐
相关产品推荐

