在 Julia 中使用 JuMP 和 gurobi 的 LP 问题

问题描述 投票:0回答:1
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是否可以返回不满足约束的变量?

我尝试检查我的代码,它可以实现目标函数和主题。

julia linear-programming gurobi julia-jump
1个回答
0
投票

我将在这里解决给定的问题“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
值,您将发现需要解除哪些约束才能使问题可行。

© www.soinside.com 2019 - 2024. All rights reserved.