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

如何在Julia中设置Gurobi当目标值达阈值后停止运行?

在Julia中使用Gurobi实现MIP解低于阈值时停止求解

要实现当Gurobi找到目标值低于设定阈值的MIP解时立即停止求解,核心是利用Gurobi的自定义回调函数,在求解过程中实时检查新找到的可行解,满足条件就触发终止。以下是具体实现步骤和代码示例:

实现思路

Gurobi允许用户注册回调函数,在求解的关键节点(比如找到新的可行解时)触发自定义逻辑。我们可以在回调中捕获每次找到的MIP可行解的目标值,与设定阈值对比,一旦满足条件就终止求解器。

代码示例

using JuMP, Gurobi

# 1. 初始化模型与求解器
model = Model(Gurobi.Optimizer)
# 可选:设置超时时间作为兜底,防止无限运行
set_optimizer_attribute(model, "TimeLimit", 3600)
# 设定目标阈值(根据你的需求修改)
target_threshold = 50.0

# 2. 定义你的MIP模型(变量、约束、目标函数)
@variable(model, x[1:5], Bin)
@objective(model, Min, sum(x))
@constraint(model, sum(x) >= 2)

# 3. 定义回调函数
function threshold_callback(cb_data)
    # 仅在找到新的MIP可行解时触发逻辑
    if Gurobi.cbget(cb_data, Gurobi.GRB_CB_MIPSOL) == 1
        # 获取当前可行解的目标值
        current_objective = Gurobi.cbget(cb_data, Gurobi.GRB_CB_MIPSOL_OBJ)
        # 检查是否满足阈值条件
        if current_objective <= target_threshold
            println("找到满足阈值的解,当前目标值:", current_objective)
            # 终止求解器
            Gurobi.cbstop(cb_data)
        end
    end
end

# 4. 将回调函数绑定到模型
add_callback(model, threshold_callback)

# 5. 启动求解
optimize!(model)

# 6. 处理求解结果
termination_state = termination_status(model)
if termination_state == MOI.OPTIMAL || termination_state == MOI.INTERRUPTED
    println("最终求解状态:", termination_state)
    println("最终目标值:", objective_value(model))
    println("变量取值:", value.(x))
else
    println("求解未找到可行解或异常终止,状态:", termination_state)
end

关键细节说明

  • 回调触发时机:GRB_CB_MIPSOL是Gurobi定义的回调类型,代表找到新的MIP可行解时触发,确保我们只在有新解时检查阈值。
  • 终止求解:调用Gurobi.cbstop(cb_data)会立即终止求解器,无需等待后续迭代。
  • 状态判断:求解终止后,状态可能是INTERRUPTED(因为主动终止)或OPTIMAL(刚好在找到最优解时满足阈值),需要同时处理这两种情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:45:24