Julia 朱莉娅:如何为带跳跃的混合整数优化问题引入二进制整数?
问题描述 我试图用Julia中的Jump对一个“机组组合”问题进行混合整数优化。但是JuMP希望我引入的单位激活变量,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])
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])