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

