Julia 朱莉娅:如何为带跳跃的混合整数优化问题引入二进制整数?

Julia 朱莉娅:如何为带跳跃的混合整数优化问题引入二进制整数?,julia,mathematical-optimization,julia-jump,Julia,Mathematical Optimization,Julia Jump,问题描述 我试图用Julia中的Jump对一个“机组组合”问题进行混合整数优化。但是JuMP希望我引入的单位激活变量,x[1:N],是一个数字,而不是一个变量。然而,对于优化问题,单元激活是一个二进制整数决策变量,因此我很难将该变量包含到优化问题中 我做错了什么 我的方法是: 方法1:将x[1:N]作为p\u G的@变量宏的一部分 这会导致:LoadError:[..]@constraint(m,$(Expr(:escape,:(p_C[i,1]))*$(Expr(:escape,:(x[i])

问题描述

我试图用Julia中的Jump对一个“机组组合”问题进行混合整数优化。但是JuMP希望我引入的单位激活变量,
x[1:N]
,是一个数字,而不是一个变量。然而,对于优化问题,单元激活是一个二进制整数决策变量,因此我很难将该变量包含到优化问题中

我做错了什么

我的方法是:

方法1:将
x[1:N]
作为
p\u G
@变量
宏的一部分


这会导致:
LoadError:[..]@constraint(m,$(Expr(:escape,:(p_C[i,1]))*$(Expr(:escape,:(x[i]))变量边界不能包含其他变量。是否:

m = Model(Cbc.Optimizer)
@variable(m, x[1:N], Bin)
@variable(m, P_G[i=1:N,1:T])
@constraint(m, [i=1:N, t=1:T], P_C[i, 1] * x[i] <= P_G[i, t])
@constraint(m, [i=1:N, t=1:T], P_G[i, t] <= P_C[I, 2] * x[i])
m=模型(Cbc.Optimizer)
@变量(m,x[1:N],Bin)
@变量(m,P_G[i=1:N,1:T])

@约束(m[i=1:N,t=1:t],P_[i,1]*x[i]试着把这写成两个不同的约束条件。谢谢,@ErwinKalvelagen!这有助于将这两个不等式分成两个约束条件。一个离题的小问题:你是否有机会推荐一个免费软件来解决跳跃中的混合整数问题。
Pajarito
似乎过时了,而且
Pavito
调用
CPLEX
(据我所知)。幸运的是,我是一名学生,可以免费使用
CPLEX
,但知道一些替代方案会很好。最好的。Gurobi将是另一个值得尝试的好解决方案。
m = Model(Cbc.Optimizer)                                        # Model
@variable(m, x[1:N])                                            # Unit activation
@variable(m, P_G[i=1:N,1:T] )                                   # Unit generation limit
for i in 1:T                                                    # Load balance
        @constraint(m, sum(P_G[:,i]) == P_D[i])
end
for i in 1:N                                                    # Unit generation limit
        for j in 1:T
                @constraint(m, P_C[i,1]*x[i] <= P_G[i,j] <= P_C[i,2]*x[i])
        end
end
@objective(m,Min,sum(P_G[:,1:T].*F[1:N]*x[1:N]))                # Objective function
optimize!(m)                                                    # Solve
using JuMP, Cbc                 # Optimization and modelling
using Plots, LaTeXStrings       # Plotting

# DATA
P_C  = [50 200;                                         # Power capacity [:, (min, max)]
        25 200;
        100 200;
        120 500;
        10 500;
        20 500;
        200 800;
        200 800;
        100 800;
        200 1000;]
P_D = LinRange(sum(P_C[:,1]), sum(P_C[:,2]), 100)       # Power demand
F = rand(100:500,10)                                    # Random prod. prices
T = length(P_D)                                         # Number of time steps
N = length(P_C[:,1])                                    # Number of generators

# MODEL
m = Model(Cbc.Optimizer)                                # Model

@variable(m, x[1:N], Bin)                               # Unit activation
@variable(m, P_C[i,1] <= P_G[i=1:N,1:T] <= P_C[i,2])    # Unit generation limit
for i in 1:T                                            # Load balance
    @constraint(m, sum(P_G[:,i]) == P_D[i])
end
@objective(m,Min,sum(P_G[:,1:T].*F[1:N]))               # Objective function
optimize!(m)                                            # Solve

# PLOT
plt = plot(P_D[:],value.(P_G[:,1:T])', xlab = L"P_{load} [MW]", ylab = L"P_{unit} [MW]")
@show plt
m = Model(Cbc.Optimizer)
@variable(m, x[1:N], Bin)
@variable(m, P_G[i=1:N,1:T])
@constraint(m, [i=1:N, t=1:T], P_C[i, 1] * x[i] <= P_G[i, t])
@constraint(m, [i=1:N, t=1:T], P_G[i, t] <= P_C[I, 2] * x[i])