mirror of
https://github.com/ANL-CEEESA/UnitCommitment.jl.git
synced 2025-12-06 08:18:51 -06:00
65 lines
2.0 KiB
Julia
65 lines
2.0 KiB
Julia
# UnitCommitment.jl: Optimization Package for Security-Constrained Unit Commitment
|
|
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
|
# Released under the modified BSD license. See COPYING.md for more details.
|
|
|
|
using JuMP, MathOptInterface, DataStructures
|
|
import JuMP: value, fix, set_name
|
|
|
|
"""
|
|
function build_model(;
|
|
instance::UnitCommitmentInstance,
|
|
optimizer = nothing,
|
|
variable_names::Bool = false,
|
|
)::JuMP.Model
|
|
|
|
Build the JuMP model corresponding to the given unit commitment instance.
|
|
|
|
Arguments
|
|
=========
|
|
- `instance`:
|
|
the instance.
|
|
- `optimizer`:
|
|
the optimizer factory that should be attached to this model (e.g. Cbc.Optimizer).
|
|
If not provided, no optimizer will be attached.
|
|
- `variable_names`:
|
|
If true, set variable and constraint names. Important if the model is going
|
|
to be exported to an MPS file. For large models, this can take significant
|
|
time, so it's disabled by default.
|
|
"""
|
|
function build_model(;
|
|
instance::UnitCommitmentInstance,
|
|
optimizer = nothing,
|
|
formulation = Formulation(),
|
|
variable_names::Bool = false,
|
|
)::JuMP.Model
|
|
@info "Building model..."
|
|
time_model = @elapsed begin
|
|
model = Model()
|
|
if optimizer !== nothing
|
|
set_optimizer(model, optimizer)
|
|
end
|
|
model[:obj] = AffExpr()
|
|
model[:instance] = instance
|
|
_setup_transmission(model, formulation.transmission)
|
|
for l in instance.lines
|
|
_add_transmission_line!(model, l, formulation.transmission)
|
|
end
|
|
for b in instance.buses
|
|
_add_bus!(model, b)
|
|
end
|
|
for g in instance.units
|
|
_add_unit!(model, g, formulation)
|
|
end
|
|
for ps in instance.price_sensitive_loads
|
|
_add_price_sensitive_load!(model, ps)
|
|
end
|
|
_add_system_wide_eqs!(model)
|
|
@objective(model, Min, model[:obj])
|
|
end
|
|
@info @sprintf("Built model in %.2f seconds", time_model)
|
|
if variable_names
|
|
_set_names!(model)
|
|
end
|
|
return model
|
|
end
|