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

在Gurobi中对二元变量与连续变量乘积执行分支的实现方法

在Gurobi中自定义二元变量分支的实现方法

核心思路澄清

你的推测方向是对的:分支本质就是通过收紧变量域来枚举解空间。对于二元变量X,分支操作就是分别强制X=0和X=1,生成两个子问题求解,直到找到最优解或证明无解。

具体实现步骤(基于Gurobi回调)

Gurobi允许通过Callback类自定义分支逻辑,针对二元变量X的关键操作如下:

1. 识别需分支的节点

在回调函数中,先判断当前节点是否需要分支:

  • 获取节点的松弛解,检查X的取值是否为分数(即不在{0,1}范围内)
  • 仅当X为分数解时,触发自定义分支

2. 生成两个子问题

确定分支后,创建两个子节点:

  • 子节点1:添加约束X == 0,将X的域收紧到0
  • 子节点2:添加约束X == 1,将X的域收紧到1
  • 使用Gurobi的cbBranch方法直接创建子节点(适配多数版本)

3. 示例代码片段(Python)

import gurobipy as gp
from gurobipy import GRB

def custom_branch_callback(model, where):
    if where == GRB.Callback.MIPNODE:
        node_status = model.cbGet(GRB.Callback.MIPNODE_STATUS)
        if node_status == GRB.OPTIMAL:
            x_relax_val = model.cbGetNodeRel(model._x_var)
            # 用容差规避浮点精度问题,判断X是否为分数解
            if abs(x_relax_val - round(x_relax_val)) > 1e-6:
                # 分支为X=0的子节点
                model.cbBranch(model._x_var, GRB.LESS_EQUAL, 0.0)
                # 分支为X=1的子节点
                model.cbBranch(model._x_var, GRB.GREATER_EQUAL, 1.0)

# 构建已线性化的模型
model = gp.Model("custom_branch_model")
x = model.addVar(vtype=GRB.BINARY, name="X")
y = model.addVar(vtype=GRB.CONTINUOUS, name="Y")
# 添加线性化约束与目标函数...

# 将X变量传递给回调函数
model._x_var = x
# 绑定自定义回调
model.Params.Callback = custom_branch_callback
# 启动求解
model.optimize()

注意事项

  • 确保原线性化模型逻辑正确,自定义分支不会破坏模型可行性
  • 必须用容差判断分数解,避免因浮点精度误判
  • Gurobi默认分支策略已做优化,仅在有特定业务优先级需求时,才需要自定义分支,否则建议使用默认逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:40:30