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

JuMP+Gurobi求解LP问题遇不可行/无界时能否返回非可行变量?

问题

我在Julia中使用JuMP和Gurobi实现了如下线性规划(LP)子问题:

using JuMP
using Gurobi
using MAT
using LinearAlgebra

#p_max,p_min, z, W ,b ,D are given matrix and can guarantee the correctness 

#introduce u W D b
file_u = matopen(raw"C:\Users\minboli\Desktop\matlab data\Xincode\Xincode\u.mat")
z = read(file_u,"u")

file_W = matopen(raw"C:\Users\minboli\Desktop\matlab data\Xincode\Xincode\W.mat")
W = read(file_W,"W")

file_b = matopen(raw"C:\Users\minboli\Desktop\matlab data\Xincode\Xincode\b.mat")
b = read(file_b,"b")

file_D = matopen(raw"C:\Users\minboli\Desktop\matlab data\Xincode\Xincode\sparse_matrix_D.mat")
D = read(file_D,"D")

n = length(z)
m = length(b)

function sub_problem(p_max, p_min, n, m, z, b, W, D) 
    model = Model(Gurobi.Optimizer)

    @variable(model, lambda[1:n] >= 0)
    @variable(model, mu[1:m])
    @variable(model, delta[1:m], Bin)  
    @variable(model, p[1:m])

    M = 1e5 

    @objective(model, Min, dot(lambda, z) + dot(mu, p - b))

    @constraint(model, W' * lambda + D' * mu .== 0)

  
    @constraint(model, p .<= p_max .- (1 .- delta) * M)
    @constraint(model, p .>= p_min .+ delta * M)
    @constraint(model, mu .<= M * delta)
    @constraint(model, mu .>= -M * (1 .- delta))

    optimize!(model)
    status = termination_status(model)
    if status != MOI.OPTIMAL
        error("The model did not solve correctly, status: $(status)")
    end

    return value.(lambda), value.(mu)
end

p_max_revised = reshape(p_max,:,1)
p_min_revised = reshape(p_min,:,1)

print(sub_problem(p_max_revised, p_min_revised, n, m, z, b, W, D))

运行后Gurobi返回结果:

Model is infeasible or unbounded
Best objective -, best bound -, gap -

User-callback calls 43, time in user-callback 0.00 sec
ERROR: The model did not solve correctly, status: INFEASIBLE_OR_UNBOUNDED

已知该优化问题可能出现不可行或无界情况,想咨询:当优化失败(状态为INFEASIBLE_OR_UNBOUNDED)时,Gurobi是否可以返回不满足约束的变量?已检查代码,确认目标函数与约束的编写无误。

解答
  • Gurobi不会直接返回“不满足约束的变量”,但可以通过以下步骤定位问题根源:
    1. 明确问题类型:先设置Gurobi参数DualReductions=0,强制求解器区分模型是不可行还是无界,替换模糊的INFEASIBLE_OR_UNBOUNDED状态。修改模型初始化代码:
      model = Model(Gurobi.Optimizer)
      set_optimizer_attribute(model, "DualReductions", 0)
      
    2. 排查不可行问题:若状态变为INFEASIBLE,启用ComputeIIS=1参数生成不可行性证明(IIS),定位冲突约束:
      set_optimizer_attribute(model, "ComputeIIS", 1)
      
      求解后,可通过gurobi_get_iis(model)获取IIS信息,或调用write(model, "model.ilp")导出到文件,从冲突约束反推关联变量。
    3. 排查无界问题:若状态变为UNBOUNDED,调用get_unbounded_ray(model)获取无界射线,分析射线中变量的取值趋势,找到导致目标函数无限优化的变量或约束组合。
  • 注意:你的模型包含二进制变量delta,属于混合整数规划(MIP),而非纯LP。MIP的IIS生成精度略低于纯LP,但仍能提供有效参考。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:20:21