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

Julia Jump技术问询:如何获取MIP的全部可行解而非仅最优解

获取混合整数规划(MIP)所有可行/次优解的方法

一、有没有自动枚举所有可行解的库工具?

目前主流MIP求解器(Gurobi、CPLEX、Cbc)及Julia JuMP生态中,没有一键获取所有可行解的自动工具——因为MIP的可行解数量可能是指数级,完全枚举在多数实际场景中不现实。

你之前的代码无效是因为逻辑顺序错误,正确的单可行解获取代码应该是先求解再判断状态:

optimize!(m)
if termination_status(m) == MOI.FEASIBLE_POINT
    println(value.(x))
end

但这也只能拿到求解器找到的第一个可行解(通常是最优解),无法自动枚举全部。

如果是求前k个次优解(而非所有可行解),部分商业求解器支持最优解池功能,比如Gurobi可以通过设置求解器属性实现:

using JuMP, Gurobi

# 初始化模型后设置参数
set_optimizer_attribute(m, "PoolSolutions", 10)  # 指定要获取的次优解数量
set_optimizer_attribute(m, "PoolSearchMode", 2)  # 开启最优解池搜索模式
optimize!(m)

# 提取所有池中的解
solutions = []
for i in 1:result_count(m)
    current_sol = round.(Int, value.(x; result=i))
    push!(solutions, current_sol)
end

注:该方法仅适用于获取最优解附近的次优解,且需要求解器支持(Gurobi、CPLEX支持,Cbc不支持)。

二、手动枚举所有可行解的最简方法

你原来的“禁单个变量取值”思路存在缺陷:会漏掉包含该变量原取值的其他可行解,且无法回溯约束。正确的核心思路是添加“排除当前解”的约束,强制求解器不再找到完全相同的解,循环执行直到无可行解:

实现步骤(Julia JuMP示例)

using JuMP, Gurobi  # 也可替换为其他支持MIP的求解器

# 假设已定义模型m和二进制决策变量x(如果是整数变量,需调整约束逻辑)
all_solutions = []

while true
    optimize!(m)
    # 判断是否还有可行解
    if termination_status(m) != MOI.FEASIBLE_POINT
        break
    end
    # 记录当前解(二进制变量取整,整数变量可根据需求处理)
    current_sol = round.(Int, value.(x))
    push!(all_solutions, current_sol)
    
    # 添加排除当前解的约束:禁止所有变量与当前解完全一致
    n_vars = length(x)
    @constraint(m, 
        sum(x[i] for i in 1:n_vars if current_sol[i] == 1) + 
        sum(1 - x[i] for i in 1:n_vars if current_sol[i] == 0) 
        ≤ n_vars - 1
    )
end

println("所有可行解:", all_solutions)

原思路的问题说明

  • 仅约束单个变量为0,会错误排除其他包含该变量原取值的可行解,比如存在解[1,0]和[1,1],约束x1=0后,第二个解也会被排除
  • 没有约束回溯机制,添加的约束会永久缩小求解范围,导致后续无法找到本应存在的解

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:20:38