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
不可行或无界是可以接受的,我的优化也遇到过这种情况,我想知道如果优化失败,Gurobi是否可以返回不满足约束的变量?
我尝试检查我的代码,它可以实现目标函数和主题。
我将在这里解决给定的问题“Gurobi 能否返回不满足约束的变量”,这是我相信你的要点
考虑以下优化问题:
x - 2y -> Max
3x >= 9
2y >= 8
x + y <= 6
x, y >= 0
您认为哪个变量违反了约束?
您可以立即发现,查看约束而不是变量通常更有意义。然而,显然,约束作为一组是矛盾的,而不是作为单个约束。
现在无论你想查看约束还是变量,都可以通过向模型引入人工变量来找出“违反了哪一个”。它不能自动完成,因为您作为模型作者需要决定要考虑哪种类型的违规。
对于上述模型的示例,您可以这样做:
@variable(model, x >= 0)
@variable(model, y >= 0)
@variable(model, s[1:3] >= 0)
@constraint(model, 3x + s[1] >= 9)
@constraint(model, 2y + s[2] >= 8)
@constraint(model, x + y - s[3] <= 6)
现在你有一个人工变量来描述模型被违反的程度(这里是继续,有时你可能想要一个二进制变量乘以
M
- 这是要做出的众多决策之一,因此该过程不能自动)。
您现在需要做的就是将此人工变量包含在目标中:
@objective(model, Max, x - 2y - sum(M .* s))
查看最佳解决方案中的非零
s
值,您将发现需要解除哪些约束才能使问题可行。