mirror of
https://github.com/ANL-CEEESA/UnitCommitment.jl.git
synced 2025-12-06 00:08:52 -06:00
Compare commits
48 Commits
add_formul
...
feature/mi
| Author | SHA1 | Date | |
|---|---|---|---|
| 6e30645084 | |||
| 678e6aa2f5 | |||
| fd25580967 | |||
| dc693896a3 | |||
| ddebcc6ddb | |||
| 3282e5bc3a | |||
| 15de1901c8 | |||
| bf2dc4ddc4 | |||
| 5c3c8f0d63 | |||
| cce6a874b9 | |||
| 1ce1cddaf3 | |||
| 46d754dbcf | |||
| b7d9083335 | |||
| 86ae1d0429 | |||
| 58a7567c16 | |||
| 2367e5a348 | |||
| 74b8a8ae2c | |||
| 3260fa29ad | |||
| 3b1d2d1845 | |||
| db106f1a38 | |||
| 16b0fec6cd | |||
| cda1e368fe | |||
| 099fb4e3cb | |||
|
|
b4bc50c865 | ||
|
|
febb4f1aad | ||
|
|
8988b00b07 | ||
|
|
0046c4ca2a | ||
| 72f659b9ff | |||
| 861284875b | |||
| 360308ef4a | |||
| 03268dd3df | |||
| ec0f9dcfcd | |||
|
|
a3a71ff5a9 | ||
| 5beff627d3 | |||
| 5ca566f147 | |||
| 5e2cdb9e0c | |||
| e41f4d11c2 | |||
| 3220650e39 | |||
| ca0d250dfa | |||
| 2bd68b49a5 | |||
| fbc4b004cd | |||
| 93d3e5987d | |||
| f235333551 | |||
| 6c566e0e79 | |||
| 5c3f7b15d3 | |||
| 7c907a6eb5 | |||
| b1498c50b3 | |||
|
|
000215e991 |
4
.github/workflows/test.yml
vendored
4
.github/workflows/test.yml
vendored
@@ -9,8 +9,8 @@ jobs:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
julia-version: ['1.3', '1.4', '1.5', '1.6']
|
||||
julia-arch: [x64, x86]
|
||||
julia-version: ['1.6', '1.7']
|
||||
julia-arch: [x64]
|
||||
os: [ubuntu-latest, windows-latest, macOS-latest]
|
||||
exclude:
|
||||
- os: macOS-latest
|
||||
|
||||
32
.gitignore
vendored
32
.gitignore
vendored
@@ -1,20 +1,38 @@
|
||||
*.bak
|
||||
*.gz
|
||||
*.lastrun
|
||||
*.so
|
||||
*.mps
|
||||
*.ipynb
|
||||
*.lastrun
|
||||
*.mps
|
||||
*.so
|
||||
*/Manifest.toml
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
.AppleDouble
|
||||
.DS_Store
|
||||
.DocumentRevisions-V100
|
||||
.LSOverride
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
._*
|
||||
.apdisk
|
||||
.com.apple.timemachine.donotpresent
|
||||
.fseventsd
|
||||
.ipy*
|
||||
.vscode
|
||||
Icon
|
||||
Manifest.toml
|
||||
Network Trash Folder
|
||||
TODO.md
|
||||
Temporary Items
|
||||
benchmark/results
|
||||
benchmark/runs
|
||||
benchmark/tables
|
||||
benchmark/tmp.json
|
||||
build
|
||||
docs/_build
|
||||
instances/**/*.json
|
||||
instances/_source
|
||||
local
|
||||
notebooks
|
||||
TODO.md
|
||||
docs/_build
|
||||
.vscode
|
||||
Manifest.toml
|
||||
|
||||
11
CHANGELOG.md
11
CHANGELOG.md
@@ -11,6 +11,17 @@ All notable changes to this project will be documented in this file.
|
||||
[semver]: https://semver.org/spec/v2.0.0.html
|
||||
[pkjjl]: https://pkgdocs.julialang.org/v1/compatibility/#compat-pre-1.0
|
||||
|
||||
## [Unreleased]
|
||||
### Added
|
||||
- Add multiple reserve products
|
||||
|
||||
### Changed
|
||||
- To support multiple reserve products, the input data format has been modified as follows:
|
||||
- In `Generators`, replace `Provides spinning reserves?` by `Reserve eligibility`
|
||||
- In `Parameters`, remove `Reserve shortfall penalty`
|
||||
- Revise `Reserves` section
|
||||
|
||||
|
||||
## [0.2.2] - 2021-07-21
|
||||
### Fixed
|
||||
- Fix small bug in validation scripts related to startup costs
|
||||
|
||||
25
Makefile
25
Makefile
@@ -2,31 +2,22 @@
|
||||
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
||||
# Released under the modified BSD license. See COPYING.md for more details.
|
||||
|
||||
JULIA := julia --color=yes --project=@.
|
||||
VERSION := 0.2
|
||||
|
||||
build/sysimage.so: src/utils/sysimage.jl Project.toml Manifest.toml
|
||||
mkdir -p build
|
||||
mkdir -p benchmark/results/test
|
||||
cd benchmark; $(JULIA) --trace-compile=../build/precompile.jl benchmark.jl test/case14
|
||||
$(JULIA) src/utils/sysimage.jl
|
||||
VERSION := 0.3
|
||||
|
||||
clean:
|
||||
rm -rf build/*
|
||||
rm -rfv build Manifest.toml test/Manifest.toml deps/formatter/build deps/formatter/Manifest.toml
|
||||
|
||||
docs:
|
||||
cd docs; make clean; make dirhtml
|
||||
rsync -avP --delete-after docs/_build/dirhtml/ ../docs/$(VERSION)/
|
||||
|
||||
test: build/sysimage.so
|
||||
@echo Running tests...
|
||||
$(JULIA) --sysimage build/sysimage.so -e 'using Pkg; Pkg.test("UnitCommitment")' | tee build/test.log
|
||||
|
||||
|
||||
format:
|
||||
julia -e 'using JuliaFormatter; format(["src", "test", "benchmark"], verbose=true);'
|
||||
cd deps/formatter; ../../juliaw format.jl
|
||||
|
||||
install-deps:
|
||||
julia -e 'using Pkg; Pkg.add(PackageSpec(name="JuliaFormatter", version="0.14.4"))'
|
||||
test: test/Manifest.toml
|
||||
./juliaw test/runtests.jl
|
||||
|
||||
test/Manifest.toml: test/Project.toml
|
||||
julia --project=test -e "using Pkg; Pkg.instantiate()"
|
||||
|
||||
.PHONY: docs test format install-deps
|
||||
|
||||
18
Project.toml
18
Project.toml
@@ -2,10 +2,11 @@ name = "UnitCommitment"
|
||||
uuid = "64606440-39ea-11e9-0f29-3303a1d3d877"
|
||||
authors = ["Santos Xavier, Alinson <axavier@anl.gov>"]
|
||||
repo = "https://github.com/ANL-CEEESA/UnitCommitment.jl"
|
||||
version = "0.2.2"
|
||||
version = "0.3.0"
|
||||
|
||||
[deps]
|
||||
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
|
||||
Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b"
|
||||
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
|
||||
GZip = "92fee26a-97fe-5a0c-ad85-20a5f3185b63"
|
||||
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
|
||||
@@ -15,23 +16,16 @@ Logging = "56ddb016-857b-54e1-b83d-db4d58db5568"
|
||||
MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee"
|
||||
PackageCompiler = "9b87118b-4619-50d2-8e1e-99f35a4d4d9d"
|
||||
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
|
||||
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
|
||||
Revise = "295af30f-e4ad-537b-8983-00126c2a3abe"
|
||||
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
|
||||
|
||||
[compat]
|
||||
Cbc = "0.7"
|
||||
DataStructures = "0.18"
|
||||
Distributions = "0.25"
|
||||
GZip = "0.5"
|
||||
JSON = "0.21"
|
||||
JuMP = "0.21"
|
||||
MathOptInterface = "0.9"
|
||||
JuMP = "1"
|
||||
MathOptInterface = "1"
|
||||
PackageCompiler = "1"
|
||||
julia = "1"
|
||||
|
||||
[extras]
|
||||
Cbc = "9961bab8-2fa3-5c5a-9d89-47fab24efd76"
|
||||
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
|
||||
Gurobi = "2e9cd046-0924-5485-92f1-d5272153d98b"
|
||||
|
||||
[targets]
|
||||
test = ["Cbc", "Test", "Gurobi"]
|
||||
|
||||
@@ -95,6 +95,7 @@ UnitCommitment.write("/tmp/output.json", solution)
|
||||
## Authors
|
||||
* **Alinson S. Xavier** (Argonne National Laboratory)
|
||||
* **Aleksandr M. Kazachkov** (University of Florida)
|
||||
* **Ogün Yurdakul** (Technische Universität Berlin)
|
||||
* **Feng Qiu** (Argonne National Laboratory)
|
||||
|
||||
## Acknowledgments
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
[deps]
|
||||
DocOpt = "968ba79b-81e4-546f-ab3a-2eecfa62a9db"
|
||||
Gurobi = "2e9cd046-0924-5485-92f1-d5272153d98b"
|
||||
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
|
||||
JuMP = "4076af6c-e467-56ae-b986-b466b2749572"
|
||||
|
||||
@@ -1,158 +0,0 @@
|
||||
# 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 Distributed
|
||||
using Pkg
|
||||
Pkg.activate(".")
|
||||
|
||||
@everywhere using Pkg
|
||||
@everywhere Pkg.activate(".")
|
||||
|
||||
@everywhere using UnitCommitment
|
||||
@everywhere using JuMP
|
||||
@everywhere using Gurobi
|
||||
@everywhere using JSON
|
||||
@everywhere using Logging
|
||||
@everywhere using Printf
|
||||
@everywhere using LinearAlgebra
|
||||
@everywhere using Random
|
||||
|
||||
@everywhere import UnitCommitment:
|
||||
ArrCon2000,
|
||||
CarArr2006,
|
||||
DamKucRajAta2016,
|
||||
Formulation,
|
||||
Gar1962,
|
||||
KnuOstWat2018,
|
||||
MorLatRam2013,
|
||||
PanGua2016,
|
||||
XavQiuWanThi2019
|
||||
|
||||
@everywhere UnitCommitment._setup_logger()
|
||||
|
||||
function main()
|
||||
cases = [
|
||||
"pglib-uc/ca/2014-09-01_reserves_0",
|
||||
"pglib-uc/ca/2014-09-01_reserves_1",
|
||||
"pglib-uc/ca/2015-03-01_reserves_0",
|
||||
"pglib-uc/ca/2015-06-01_reserves_0",
|
||||
"pglib-uc/ca/Scenario400_reserves_1",
|
||||
"pglib-uc/ferc/2015-01-01_lw",
|
||||
"pglib-uc/ferc/2015-05-01_lw",
|
||||
"pglib-uc/ferc/2015-07-01_hw",
|
||||
"pglib-uc/ferc/2015-10-01_lw",
|
||||
"pglib-uc/ferc/2015-12-01_lw",
|
||||
"pglib-uc/rts_gmlc/2020-04-03",
|
||||
"pglib-uc/rts_gmlc/2020-09-20",
|
||||
"pglib-uc/rts_gmlc/2020-10-27",
|
||||
"pglib-uc/rts_gmlc/2020-11-25",
|
||||
"pglib-uc/rts_gmlc/2020-12-23",
|
||||
"or-lib/20_0_1_w",
|
||||
"or-lib/20_0_5_w",
|
||||
"or-lib/50_0_2_w",
|
||||
"or-lib/75_0_2_w",
|
||||
"or-lib/100_0_1_w",
|
||||
"or-lib/100_0_4_w",
|
||||
"or-lib/100_0_5_w",
|
||||
"or-lib/200_0_3_w",
|
||||
"or-lib/200_0_7_w",
|
||||
"or-lib/200_0_9_w",
|
||||
"tejada19/UC_24h_290g",
|
||||
"tejada19/UC_24h_623g",
|
||||
"tejada19/UC_24h_959g",
|
||||
"tejada19/UC_24h_1577g",
|
||||
"tejada19/UC_24h_1888g",
|
||||
"tejada19/UC_168h_72g",
|
||||
"tejada19/UC_168h_86g",
|
||||
"tejada19/UC_168h_130g",
|
||||
"tejada19/UC_168h_131g",
|
||||
"tejada19/UC_168h_199g",
|
||||
]
|
||||
formulations = Dict(
|
||||
"Default" => Formulation(),
|
||||
"ArrCon2000" => Formulation(ramping = ArrCon2000.Ramping()),
|
||||
"CarArr2006" => Formulation(pwl_costs = CarArr2006.PwlCosts()),
|
||||
"DamKucRajAta2016" =>
|
||||
Formulation(ramping = DamKucRajAta2016.Ramping()),
|
||||
"Gar1962" => Formulation(pwl_costs = Gar1962.PwlCosts()),
|
||||
"KnuOstWat2018" =>
|
||||
Formulation(pwl_costs = KnuOstWat2018.PwlCosts()),
|
||||
"MorLatRam2013" => Formulation(ramping = MorLatRam2013.Ramping()),
|
||||
"PanGua2016" => Formulation(ramping = PanGua2016.Ramping()),
|
||||
)
|
||||
trials = [i for i in 1:5]
|
||||
combinations = [
|
||||
(c, f.first, f.second, t) for c in cases for f in formulations for
|
||||
t in trials
|
||||
]
|
||||
shuffle!(combinations)
|
||||
@sync @distributed for c in combinations
|
||||
_run_combination(c...)
|
||||
end
|
||||
end
|
||||
|
||||
@everywhere function _run_combination(
|
||||
case,
|
||||
formulation_name,
|
||||
formulation,
|
||||
trial,
|
||||
)
|
||||
name = "$formulation_name/$case"
|
||||
dirname = "results/$name"
|
||||
mkpath(dirname)
|
||||
if isfile("$dirname/$trial.json")
|
||||
@info @sprintf("%-4s %-16s %s", "skip", formulation_name, case)
|
||||
return
|
||||
end
|
||||
@info @sprintf("%-4s %-16s %s", "run", formulation_name, case)
|
||||
open("$dirname/$trial.log", "w") do file
|
||||
redirect_stdout(file) do
|
||||
redirect_stderr(file) do
|
||||
return _run_sample(case, formulation, "$dirname/$trial")
|
||||
end
|
||||
end
|
||||
end
|
||||
@info @sprintf("%-4s %-16s %s", "done", formulation_name, case)
|
||||
end
|
||||
|
||||
@everywhere function _run_sample(case, formulation, prefix)
|
||||
total_time = @elapsed begin
|
||||
@info "Reading: $case"
|
||||
time_read = @elapsed begin
|
||||
instance = UnitCommitment.read_benchmark(case)
|
||||
end
|
||||
@info @sprintf("Read problem in %.2f seconds", time_read)
|
||||
BLAS.set_num_threads(4)
|
||||
model = UnitCommitment.build_model(
|
||||
instance = instance,
|
||||
formulation = formulation,
|
||||
optimizer = optimizer_with_attributes(
|
||||
Gurobi.Optimizer,
|
||||
"Threads" => 4,
|
||||
"Seed" => rand(1:1000),
|
||||
),
|
||||
variable_names = true,
|
||||
)
|
||||
@info "Optimizing..."
|
||||
BLAS.set_num_threads(1)
|
||||
UnitCommitment.optimize!(
|
||||
model,
|
||||
XavQiuWanThi2019.Method(time_limit = 3600.0, gap_limit = 1e-4),
|
||||
)
|
||||
end
|
||||
@info @sprintf("Total time was %.2f seconds", total_time)
|
||||
@info "Writing solution: $prefix.json"
|
||||
solution = UnitCommitment.solution(model)
|
||||
UnitCommitment.write("$prefix.json", solution)
|
||||
@info "Verifying solution..."
|
||||
return UnitCommitment.validate(instance, solution)
|
||||
# @info "Exporting model..."
|
||||
# return JuMP.write_to_file(model, model_filename)
|
||||
end
|
||||
|
||||
if length(ARGS) > 0
|
||||
_run_sample(ARGS[1], UnitCommitment.Formulation(), "tmp")
|
||||
else
|
||||
main()
|
||||
end
|
||||
209
benchmark/run.jl
Normal file
209
benchmark/run.jl
Normal file
@@ -0,0 +1,209 @@
|
||||
# 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.
|
||||
|
||||
doc = """UnitCommitment.jl Benchmark Runner
|
||||
|
||||
Usage:
|
||||
run.jl [-s ARG]... [-m ARG]... [-c ARG]... [-f ARG]... [options]
|
||||
|
||||
Examples:
|
||||
|
||||
1. Benchmark all solvers, methods and formulations:
|
||||
|
||||
julia run.jl
|
||||
|
||||
2. Benchmark formulations "default" and "ArrCon200" using Gurobi:
|
||||
|
||||
julia run.jl -s gurobi -f default -f ArrCon2000
|
||||
|
||||
3. Benchmark a few test cases, using all solvers, methods and formulations:
|
||||
|
||||
julia run.jl -c or-lib/20_0_1_w -c matpower/case1888rte/2017-02-01
|
||||
|
||||
4. Solve 4 test cases in parallel, with 2 threads available per worker:
|
||||
|
||||
JULIA_NUM_THREADS=2 julia --procs 4 run.jl
|
||||
|
||||
Options:
|
||||
-h --help Show this screen.
|
||||
-s --solver=ARG Mixed-integer linear solver (e.g. gurobi)
|
||||
-c --case=ARG Unit commitment test case (e.g. or-lib/20_0_1_w)
|
||||
-m --method=ARG Solution method (e.g. default)
|
||||
-f --formulation=ARG Formulation (e.g. ArrCon2000)
|
||||
--time-limit=ARG Time limit in seconds [default: 3600]
|
||||
--gap=ARG Relative MIP gap tolerance [default: 0.001]
|
||||
--trials=ARG Number of trials [default: 5]
|
||||
"""
|
||||
|
||||
using Distributed
|
||||
using Pkg
|
||||
Pkg.activate(".")
|
||||
@everywhere using Pkg
|
||||
@everywhere Pkg.activate(".")
|
||||
|
||||
using DocOpt
|
||||
args = docopt(doc)
|
||||
|
||||
@everywhere using UnitCommitment
|
||||
@everywhere UnitCommitment._setup_logger()
|
||||
|
||||
using UnitCommitment
|
||||
using Gurobi
|
||||
using Logging
|
||||
using JuMP
|
||||
|
||||
import UnitCommitment:
|
||||
ArrCon2000,
|
||||
CarArr2006,
|
||||
DamKucRajAta2016,
|
||||
Formulation,
|
||||
Gar1962,
|
||||
KnuOstWat2018,
|
||||
MorLatRam2013,
|
||||
PanGua2016,
|
||||
XavQiuWanThi2019
|
||||
|
||||
# Benchmark test cases
|
||||
# -----------------------------------------------------------------------------
|
||||
cases = [
|
||||
"pglib-uc/ca/2014-09-01_reserves_0",
|
||||
"pglib-uc/ca/2014-09-01_reserves_1",
|
||||
"pglib-uc/ca/2015-03-01_reserves_0",
|
||||
"pglib-uc/ca/2015-06-01_reserves_0",
|
||||
"pglib-uc/ca/Scenario400_reserves_1",
|
||||
"pglib-uc/ferc/2015-01-01_lw",
|
||||
"pglib-uc/ferc/2015-05-01_lw",
|
||||
"pglib-uc/ferc/2015-07-01_hw",
|
||||
"pglib-uc/ferc/2015-10-01_lw",
|
||||
"pglib-uc/ferc/2015-12-01_lw",
|
||||
"pglib-uc/rts_gmlc/2020-04-03",
|
||||
"pglib-uc/rts_gmlc/2020-09-20",
|
||||
"pglib-uc/rts_gmlc/2020-10-27",
|
||||
"pglib-uc/rts_gmlc/2020-11-25",
|
||||
"pglib-uc/rts_gmlc/2020-12-23",
|
||||
"or-lib/20_0_1_w",
|
||||
"or-lib/20_0_5_w",
|
||||
"or-lib/50_0_2_w",
|
||||
"or-lib/75_0_2_w",
|
||||
"or-lib/100_0_1_w",
|
||||
"or-lib/100_0_4_w",
|
||||
"or-lib/100_0_5_w",
|
||||
"or-lib/200_0_3_w",
|
||||
"or-lib/200_0_7_w",
|
||||
"or-lib/200_0_9_w",
|
||||
"tejada19/UC_24h_290g",
|
||||
"tejada19/UC_24h_623g",
|
||||
"tejada19/UC_24h_959g",
|
||||
"tejada19/UC_24h_1577g",
|
||||
"tejada19/UC_24h_1888g",
|
||||
"tejada19/UC_168h_72g",
|
||||
"tejada19/UC_168h_86g",
|
||||
"tejada19/UC_168h_130g",
|
||||
"tejada19/UC_168h_131g",
|
||||
"tejada19/UC_168h_199g",
|
||||
"matpower/case1888rte/2017-02-01",
|
||||
"matpower/case1951rte/2017-02-01",
|
||||
"matpower/case2848rte/2017-02-01",
|
||||
"matpower/case3012wp/2017-02-01",
|
||||
"matpower/case3375wp/2017-02-01",
|
||||
"matpower/case6468rte/2017-02-01",
|
||||
"matpower/case6515rte/2017-02-01",
|
||||
]
|
||||
|
||||
# Formulations
|
||||
# -----------------------------------------------------------------------------
|
||||
formulations = Dict(
|
||||
"default" => Formulation(),
|
||||
"ArrCon2000" => Formulation(ramping = ArrCon2000.Ramping()),
|
||||
"CarArr2006" => Formulation(pwl_costs = CarArr2006.PwlCosts()),
|
||||
"DamKucRajAta2016" => Formulation(ramping = DamKucRajAta2016.Ramping()),
|
||||
"Gar1962" => Formulation(pwl_costs = Gar1962.PwlCosts()),
|
||||
"KnuOstWat2018" => Formulation(pwl_costs = KnuOstWat2018.PwlCosts()),
|
||||
"MorLatRam2013" => Formulation(ramping = MorLatRam2013.Ramping()),
|
||||
"PanGua2016" => Formulation(ramping = PanGua2016.Ramping()),
|
||||
)
|
||||
|
||||
# Solution methods
|
||||
# -----------------------------------------------------------------------------
|
||||
const gap_limit = parse(Float64, args["--gap"])
|
||||
const time_limit = parse(Float64, args["--time-limit"])
|
||||
methods = Dict(
|
||||
"default" => XavQiuWanThi2019.Method(
|
||||
time_limit = time_limit,
|
||||
gap_limit = gap_limit,
|
||||
),
|
||||
)
|
||||
|
||||
# MIP solvers
|
||||
# -----------------------------------------------------------------------------
|
||||
optimizers = Dict(
|
||||
"gurobi" => optimizer_with_attributes(
|
||||
Gurobi.Optimizer,
|
||||
"Threads" => Threads.nthreads(),
|
||||
),
|
||||
)
|
||||
|
||||
# Parse command line arguments
|
||||
# -----------------------------------------------------------------------------
|
||||
if !isempty(args["--case"])
|
||||
cases = args["--case"]
|
||||
end
|
||||
if !isempty(args["--formulation"])
|
||||
formulations = filter(p -> p.first in args["--formulation"], formulations)
|
||||
end
|
||||
if !isempty(args["--method"])
|
||||
methods = filter(p -> p.first in args["--method"], methods)
|
||||
end
|
||||
if !isempty(args["--solver"])
|
||||
optimizers = filter(p -> p.first in args["--solver"], optimizers)
|
||||
end
|
||||
const ntrials = parse(Int, args["--trials"])
|
||||
|
||||
# Print benchmark settings
|
||||
# -----------------------------------------------------------------------------
|
||||
function printlist(d::Dict)
|
||||
for key in keys(d)
|
||||
@info " - $key"
|
||||
end
|
||||
end
|
||||
|
||||
function printlist(d::Vector)
|
||||
for key in d
|
||||
@info " - $key"
|
||||
end
|
||||
end
|
||||
|
||||
@info "Computational environment:"
|
||||
@info " - CPU: $(Sys.cpu_info()[1].model)"
|
||||
@info " - Logical CPU cores: $(length(Sys.cpu_info()))"
|
||||
@info " - System memory: $(round(Sys.total_memory() / 2^30, digits=2)) GiB"
|
||||
@info " - Available workers: $(nworkers())"
|
||||
@info " - Available threads per worker: $(Threads.nthreads())"
|
||||
|
||||
@info "Parameters:"
|
||||
@info " - Number of trials: $ntrials"
|
||||
@info " - Time limit (s): $time_limit"
|
||||
@info " - Relative MIP gap tolerance: $gap_limit"
|
||||
|
||||
@info "Solvers:"
|
||||
printlist(optimizers)
|
||||
|
||||
@info "Methods:"
|
||||
printlist(methods)
|
||||
|
||||
@info "Formulations:"
|
||||
printlist(formulations)
|
||||
|
||||
@info "Cases:"
|
||||
printlist(cases)
|
||||
|
||||
# Run benchmarks
|
||||
# -----------------------------------------------------------------------------
|
||||
UnitCommitment._run_benchmarks(
|
||||
cases = cases,
|
||||
formulations = formulations,
|
||||
methods = methods,
|
||||
optimizers = optimizers,
|
||||
trials = 1:ntrials,
|
||||
)
|
||||
5
deps/formatter/Project.toml
vendored
Normal file
5
deps/formatter/Project.toml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
[deps]
|
||||
JuliaFormatter = "98e50ef6-434e-11e9-1051-2b60c6c9e899"
|
||||
|
||||
[compat]
|
||||
JuliaFormatter = "0.14.4"
|
||||
9
deps/formatter/format.jl
vendored
Normal file
9
deps/formatter/format.jl
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
using JuliaFormatter
|
||||
format(
|
||||
[
|
||||
"../../src",
|
||||
"../../test",
|
||||
"../../benchmark/run.jl",
|
||||
],
|
||||
verbose=true,
|
||||
)
|
||||
@@ -1,7 +1,7 @@
|
||||
project = "UnitCommitment.jl"
|
||||
copyright = "2020-2021, UChicago Argonne, LLC"
|
||||
copyright = "2020-2022, UChicago Argonne, LLC"
|
||||
author = ""
|
||||
release = "0.2"
|
||||
release = "0.3"
|
||||
extensions = ["myst_parser"]
|
||||
templates_path = ["_templates"]
|
||||
exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
|
||||
@@ -10,7 +10,7 @@ html_static_path = ["_static"]
|
||||
html_css_files = ["custom.css"]
|
||||
html_theme_options = {
|
||||
"repository_url": "https://github.com/ANL-CEEESA/UnitCommitment.jl/",
|
||||
"use_repository_button": True,
|
||||
"use_repository_button": False,
|
||||
"extra_navbar": "",
|
||||
}
|
||||
html_title = f"UnitCommitment.jl<br/><small>{release}</small>"
|
||||
|
||||
@@ -24,15 +24,17 @@ Instances are specified by JSON files containing the following main sections:
|
||||
* Reserves
|
||||
* Contingencies
|
||||
|
||||
Each section is described in detail below. For a complete example, see [case14](https://github.com/ANL-CEEESA/UnitCommitment.jl/tree/dev/instances/matpower/case14).
|
||||
Each section is described in detail below. See [case118/2017-01-01.json.gz][example] for a complete example.
|
||||
|
||||
[example]: https://axavier.org/UnitCommitment.jl/0.3/instances/matpower/case118/2017-01-01.json.gz
|
||||
|
||||
### Parameters
|
||||
|
||||
This section describes system-wide parameters, such as power balance penalties, optimization parameters, such as the length of the planning horizon and the time.
|
||||
This section describes system-wide parameters, such as power balance penalty, and optimization parameters, such as the length of the planning horizon and the time.
|
||||
|
||||
| Key | Description | Default | Time series?
|
||||
| :----------------------------- | :------------------------------------------------ | :------: | :------------:
|
||||
| `Time horizon (h)` | Length of the planning horizon (in hours). | Required | N
|
||||
| `Time horizon (h)` | Length of the planning horizon (in hours). | Required | N
|
||||
| `Time step (min)` | Length of each time step (in minutes). Must be a divisor of 60 (e.g. 60, 30, 20, 15, etc). | `60` | N
|
||||
| `Power balance penalty ($/MW)` | Penalty for system-wide shortage or surplus in production (in $/MW). This is charged per time step. For example, if there is a shortage of 1 MW for three time steps, three times this amount will be charged. | `1000.0` | Y
|
||||
|
||||
@@ -42,7 +44,7 @@ This section describes system-wide parameters, such as power balance penalties,
|
||||
{
|
||||
"Parameters": {
|
||||
"Time horizon (h)": 4,
|
||||
"Power balance penalty ($/MW)": 1000.0
|
||||
"Power balance penalty ($/MW)": 1000.0,
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -94,7 +96,7 @@ This section describes all generators in the system, including thermal units, re
|
||||
| `Initial status (h)` | If set to a positive number, indicates the amount of time (in hours) the generator has been on at the beginning of the simulation, and if set to a negative number, the amount of time the generator has been off. For example, if `Initial status (h)` is `-2`, this means that the generator was off since `-02:00` (h:min). The simulation starts at time `00:00`. If `Initial status (h)` is `3`, this means that the generator was on since `-03:00`. A value of zero is not acceptable. | Required | N
|
||||
| `Initial power (MW)` | Amount of power the generator at time step `-1`, immediately before the planning horizon starts. | Required | N
|
||||
| `Must run?` | If `true`, the generator should be committed, even if that is not economical (Boolean). | `false` | Y
|
||||
| `Provides spinning reserves?` | If `true`, this generator may provide spinning reserves (Boolean). | `true` | Y
|
||||
| `Reserve eligibility` | List of reserve products this generator is eligibe to provide. By default, the generator is not eligible to provide any reserves. | `[]` | N
|
||||
|
||||
#### Production costs and limits
|
||||
|
||||
@@ -133,13 +135,13 @@ Note that this curve also specifies the production limits. Specifically, the fir
|
||||
"Minimum uptime (h)": 4,
|
||||
"Initial status (h)": 12,
|
||||
"Must run?": false,
|
||||
"Provides spinning reserves?": true,
|
||||
"Reserve eligibility": ["r1"],
|
||||
},
|
||||
"gen2": {
|
||||
"Bus": "b5",
|
||||
"Production cost curve (MW)": [0.0, [10.0, 8.0, 0.0, 3.0]],
|
||||
"Production cost curve ($)": [0.0, 0.0],
|
||||
"Provides spinning reserves?": true,
|
||||
"Reserve eligibility": ["r1", "r2"],
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -204,24 +206,39 @@ This section describes the characteristics of transmission system, such as its t
|
||||
|
||||
### Reserves
|
||||
|
||||
This section describes the hourly amount of operating reserves required.
|
||||
This section describes the hourly amount of reserves required.
|
||||
|
||||
|
||||
| Key | Description | Default | Time series?
|
||||
| :-------------------- | :------------------------------------------------- | --------- | :----:
|
||||
| `Spinning (MW)` | Minimum amount of system-wide spinning reserves (in MW). Only generators which are online may provide this reserve. | `0.0` | Y
|
||||
| `Type` | Type of reserve product. Must be either "spinning" or "flexiramp". | Required | N
|
||||
| `Amount (MW)` | Amount of reserves required. | Required | Y
|
||||
| `Shortfall penalty ($/MW)` | Penalty for shortage in meeting the reserve requirements (in $/MW). This is charged per time step. Negative value implies reserve constraints must always be satisfied. | `-1` | Y
|
||||
|
||||
#### Example
|
||||
#### Example 1
|
||||
|
||||
```json
|
||||
{
|
||||
"Reserves": {
|
||||
"Spinning (MW)": [
|
||||
57.30552,
|
||||
53.88429,
|
||||
51.31838,
|
||||
50.46307
|
||||
]
|
||||
"r1": {
|
||||
"Type": "spinning",
|
||||
"Amount (MW)": [
|
||||
57.30552,
|
||||
53.88429,
|
||||
51.31838,
|
||||
50.46307
|
||||
],
|
||||
"Shortfall penalty ($/MW)": 5.0
|
||||
},
|
||||
"r2": {
|
||||
"Type": "flexiramp",
|
||||
"Amount (MW)": [
|
||||
20.31042,
|
||||
23.65273,
|
||||
27.41784,
|
||||
25.34057
|
||||
],
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -284,9 +301,8 @@ The output data format is also JSON-based, but it is not currently documented si
|
||||
Current limitations
|
||||
-------------------
|
||||
|
||||
* All reserves are system-wide. Zonal reserves are not currently supported.
|
||||
* Network topology remains the same for all time periods
|
||||
* Only N-1 transmission contingencies are supported. Generator contingencies are not currently supported.
|
||||
* Time-varying minimum production amounts are not currently compatible with ramp/startup/shutdown limits.
|
||||
|
||||
* Flexible ramping products can only be acquired under the `WanHob2016` formulation, which does not support spinning reserves.
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
### Authors
|
||||
* **Alinson S. Xavier** (Argonne National Laboratory)
|
||||
* **Aleksandr M. Kazachkov** (University of Florida)
|
||||
* **Ogün Yurdakul** (Technische Universität Berlin)
|
||||
* **Feng Qiu** (Argonne National Laboratory)
|
||||
|
||||
### Acknowledgments
|
||||
@@ -35,7 +36,7 @@
|
||||
|
||||
If you use UnitCommitment.jl in your research (instances, models or algorithms), we kindly request that you cite the package as follows:
|
||||
|
||||
* **Alinson S. Xavier, Aleksandr M. Kazachkov, Feng Qiu**, "UnitCommitment.jl: A Julia/JuMP Optimization Package for Security-Constrained Unit Commitment". Zenodo (2020). [DOI: 10.5281/zenodo.4269874](https://doi.org/10.5281/zenodo.4269874).
|
||||
* **Alinson S. Xavier, Aleksandr M. Kazachkov, Ogün Yurdakul, Feng Qiu**, "UnitCommitment.jl: A Julia/JuMP Optimization Package for Security-Constrained Unit Commitment". Zenodo (2020). [DOI: 10.5281/zenodo.4269874](https://doi.org/10.5281/zenodo.4269874).
|
||||
|
||||
If you use the instances, we additionally request that you cite the original sources, as described in the [instances page](instances.md).
|
||||
|
||||
|
||||
@@ -9,12 +9,11 @@ suffix: .
|
||||
Instances
|
||||
=========
|
||||
|
||||
UnitCommitment.jl provides a large collection of benchmark instances collected
|
||||
from the literature and converted to a [common data format](format.md). In some cases, as indicated below, the original instances have been extended, with realistic parameters, using data-driven methods.
|
||||
If you use these instances in your research, we request that you cite UnitCommitment.jl, as well as the original sources.
|
||||
UnitCommitment.jl provides a large collection of benchmark instances collected from the literature and converted to a [common data format](format.md). In some cases, as indicated below, the original instances have been extended, with realistic parameters, using data-driven methods. If you use these instances in your research, we request that you cite UnitCommitment.jl, as well as the original sources, as listed below. Benchmark instances can be loaded with `UnitCommitment.read_benchmark(name)`, as explained in the [usage section](usage.md). Instance files can also be [directly downloaded from our website](https://axavier.org/UnitCommitment.jl/0.3/instances/).
|
||||
|
||||
Raw instances files are [available at our GitHub repository](https://github.com/ANL-CEEESA/UnitCommitment.jl/tree/dev/instances). Benchmark instances can also be loaded with
|
||||
`UnitCommitment.read_benchmark(name)`, as explained in the [usage section](usage.md).
|
||||
```{warning}
|
||||
The instances included in UC.jl are still under development and may change in the future. If you use these instances in your research, for reproducibility, you should specify what version of UC.jl they came from.
|
||||
```
|
||||
|
||||
|
||||
MATPOWER
|
||||
@@ -34,7 +33,7 @@ Because most MATPOWER test cases were originally designed for power flow studies
|
||||
|
||||
* **Contingencies** were set to include all N-1 transmission line contingencies that do not generate islands or isolated buses. More specifically, there is one contingency for each transmission line, as long as that transmission line is not a bridge in the network graph.
|
||||
|
||||
For each MATPOWER test case, UC.jl provides two variations (`2017-02-01` and `2017-08-01`) corresponding respectively to a winter and to a summer test case.
|
||||
For each MATPOWER test case, UC.jl provides 364 variations (`2017-01-01` to `2017-12-30`) corresponding different days of the year.
|
||||
|
||||
### MATPOWER/UW-PSTCA
|
||||
|
||||
@@ -42,16 +41,11 @@ A variety of smaller IEEE test cases, [compiled by University of Washington](htt
|
||||
|
||||
| Name | Buses | Generators | Lines | Contingencies | References |
|
||||
|------|-------|------------|-------|---------------|--------|
|
||||
| `matpower/case14/2017-02-01` | 14 | 5 | 20 | 19 | [MTPWR, PSTCA]
|
||||
| `matpower/case14/2017-08-01` | 14 | 5 | 20 | 19 | [MTPWR, PSTCA]
|
||||
| `matpower/case30/2017-02-01` | 30 | 6 | 41 | 38 | [MTPWR, PSTCA]
|
||||
| `matpower/case30/2017-08-01` | 30 | 6 | 41 | 38 | [MTPWR, PSTCA]
|
||||
| `matpower/case57/2017-02-01` | 57 | 7 | 80 | 79 | [MTPWR, PSTCA]
|
||||
| `matpower/case57/2017-08-01` | 57 | 7 | 80 | 79 | [MTPWR, PSTCA]
|
||||
| `matpower/case118/2017-02-01` | 118 | 54 | 186 | 177 | [MTPWR, PSTCA]
|
||||
| `matpower/case118/2017-08-01` | 118 | 54 | 186 | 177 | [MTPWR, PSTCA]
|
||||
| `matpower/case300/2017-02-01` | 300 | 69 | 411 | 320 | [MTPWR, PSTCA]
|
||||
| `matpower/case300/2017-08-01` | 300 | 69 | 411 | 320 | [MTPWR, PSTCA]
|
||||
| `matpower/case14/2017-01-01` | 14 | 5 | 20 | 19 | [MTPWR, PSTCA]
|
||||
| `matpower/case30/2017-01-01` | 30 | 6 | 41 | 38 | [MTPWR, PSTCA]
|
||||
| `matpower/case57/2017-01-01` | 57 | 7 | 80 | 79 | [MTPWR, PSTCA]
|
||||
| `matpower/case118/2017-01-01` | 118 | 54 | 186 | 177 | [MTPWR, PSTCA]
|
||||
| `matpower/case300/2017-01-01` | 300 | 69 | 411 | 320 | [MTPWR, PSTCA]
|
||||
|
||||
|
||||
### MATPOWER/Polish
|
||||
@@ -60,22 +54,14 @@ Test cases based on the Polish 400, 220 and 110 kV networks, originally provided
|
||||
|
||||
| Name | Buses | Generators | Lines | Contingencies | References |
|
||||
|------|-------|------------|-------|---------------|--------|
|
||||
| `matpower/case2383wp/2017-02-01` | 2383 | 323 | 2896 | 2240 | [MTPWR]
|
||||
| `matpower/case2383wp/2017-08-01` | 2383 | 323 | 2896 | 2240 | [MTPWR]
|
||||
| `matpower/case2736sp/2017-02-01` | 2736 | 289 | 3504 | 3159 | [MTPWR]
|
||||
| `matpower/case2736sp/2017-08-01` | 2736 | 289 | 3504 | 3159 | [MTPWR]
|
||||
| `matpower/case2737sop/2017-02-01` | 2737 | 267 | 3506 | 3161 | [MTPWR]
|
||||
| `matpower/case2737sop/2017-08-01` | 2737 | 267 | 3506 | 3161 | [MTPWR]
|
||||
| `matpower/case2746wop/2017-02-01` | 2746 | 443 | 3514 | 3155 | [MTPWR]
|
||||
| `matpower/case2746wop/2017-08-01` | 2746 | 443 | 3514 | 3155 | [MTPWR]
|
||||
| `matpower/case2746wp/2017-02-01` | 2746 | 457 | 3514 | 3156 | [MTPWR]
|
||||
| `matpower/case2746wp/2017-08-01` | 2746 | 457 | 3514 | 3156 | [MTPWR]
|
||||
| `matpower/case3012wp/2017-02-01` | 3012 | 496 | 3572 | 2854 | [MTPWR]
|
||||
| `matpower/case3012wp/2017-08-01` | 3012 | 496 | 3572 | 2854 | [MTPWR]
|
||||
| `matpower/case3120sp/2017-02-01` | 3120 | 483 | 3693 | 2950 | [MTPWR]
|
||||
| `matpower/case3120sp/2017-08-01` | 3120 | 483 | 3693 | 2950 | [MTPWR]
|
||||
| `matpower/case3375wp/2017-02-01` | 3374 | 590 | 4161 | 3245 | [MTPWR]
|
||||
| `matpower/case3375wp/2017-08-01` | 3374 | 590 | 4161 | 3245 | [MTPWR]
|
||||
| `matpower/case2383wp/2017-01-01` | 2383 | 323 | 2896 | 2240 | [MTPWR]
|
||||
| `matpower/case2736sp/2017-01-01` | 2736 | 289 | 3504 | 3159 | [MTPWR]
|
||||
| `matpower/case2737sop/2017-01-01` | 2737 | 267 | 3506 | 3161 | [MTPWR]
|
||||
| `matpower/case2746wop/2017-01-01` | 2746 | 443 | 3514 | 3155 | [MTPWR]
|
||||
| `matpower/case2746wp/2017-01-01` | 2746 | 457 | 3514 | 3156 | [MTPWR]
|
||||
| `matpower/case3012wp/2017-01-01` | 3012 | 496 | 3572 | 2854 | [MTPWR]
|
||||
| `matpower/case3120sp/2017-01-01` | 3120 | 483 | 3693 | 2950 | [MTPWR]
|
||||
| `matpower/case3375wp/2017-01-01` | 3374 | 590 | 4161 | 3245 | [MTPWR]
|
||||
|
||||
### MATPOWER/PEGASE
|
||||
|
||||
@@ -83,16 +69,11 @@ Test cases from the [Pan European Grid Advanced Simulation and State Estimation
|
||||
|
||||
| Name | Buses | Generators | Lines | Contingencies | References |
|
||||
|------|-------|------------|-------|---------------|--------|
|
||||
| `matpower/case89pegase/2017-02-01` | 89 | 12 | 210 | 192 | [JoFlMa16, FlPaCa13, MTPWR]
|
||||
| `matpower/case89pegase/2017-08-01` | 89 | 12 | 210 | 192 | [JoFlMa16, FlPaCa13, MTPWR]
|
||||
| `matpower/case1354pegase/2017-02-01` | 1354 | 260 | 1991 | 1288 | [JoFlMa16, FlPaCa13, MTPWR]
|
||||
| `matpower/case1354pegase/2017-08-01` | 1354 | 260 | 1991 | 1288 | [JoFlMa16, FlPaCa13, MTPWR]
|
||||
| `matpower/case2869pegase/2017-02-01` | 2869 | 510 | 4582 | 3579 | [JoFlMa16, FlPaCa13, MTPWR]
|
||||
| `matpower/case2869pegase/2017-08-01` | 2869 | 510 | 4582 | 3579 | [JoFlMa16, FlPaCa13, MTPWR]
|
||||
| `matpower/case9241pegase/2017-02-01` | 9241 | 1445 | 16049 | 13932 | [JoFlMa16, FlPaCa13, MTPWR]
|
||||
| `matpower/case9241pegase/2017-08-01` | 9241 | 1445 | 16049 | 13932 | [JoFlMa16, FlPaCa13, MTPWR]
|
||||
| `matpower/case13659pegase/2017-02-01` | 13659 | 4092 | 20467 | 13932 | [JoFlMa16, FlPaCa13, MTPWR]
|
||||
| `matpower/case13659pegase/2017-08-01` | 13659 | 4092 | 20467 | 13932 | [JoFlMa16, FlPaCa13, MTPWR]
|
||||
| `matpower/case89pegase/2017-01-01` | 89 | 12 | 210 | 192 | [JoFlMa16, FlPaCa13, MTPWR]
|
||||
| `matpower/case1354pegase/2017-01-01` | 1354 | 260 | 1991 | 1288 | [JoFlMa16, FlPaCa13, MTPWR]
|
||||
| `matpower/case2869pegase/2017-01-01` | 2869 | 510 | 4582 | 3579 | [JoFlMa16, FlPaCa13, MTPWR]
|
||||
| `matpower/case9241pegase/2017-01-01` | 9241 | 1445 | 16049 | 13932 | [JoFlMa16, FlPaCa13, MTPWR]
|
||||
| `matpower/case13659pegase/2017-01-01` | 13659 | 4092 | 20467 | 13932 | [JoFlMa16, FlPaCa13, MTPWR]
|
||||
|
||||
### MATPOWER/RTE
|
||||
|
||||
@@ -100,22 +81,14 @@ Test cases from the R&D Division at [Reseau de Transport d'Electricite](https://
|
||||
|
||||
| Name | Buses | Generators | Lines | Contingencies | References |
|
||||
|------|-------|------------|-------|---------------|--------|
|
||||
| `matpower/case1888rte/2017-02-01` | 1888 | 296 | 2531 | 1484 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case1888rte/2017-08-01` | 1888 | 296 | 2531 | 1484 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case1951rte/2017-02-01` | 1951 | 390 | 2596 | 1497 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case1951rte/2017-08-01` | 1951 | 390 | 2596 | 1497 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case2848rte/2017-02-01` | 2848 | 544 | 3776 | 2242 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case2848rte/2017-08-01` | 2848 | 544 | 3776 | 2242 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case2868rte/2017-02-01` | 2868 | 596 | 3808 | 2260 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case2868rte/2017-08-01` | 2868 | 596 | 3808 | 2260 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case6468rte/2017-02-01` | 6468 | 1262 | 9000 | 6094 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case6468rte/2017-08-01` | 6468 | 1262 | 9000 | 6094 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case6470rte/2017-02-01` | 6470 | 1306 | 9005 | 6085 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case6470rte/2017-08-01` | 6470 | 1306 | 9005 | 6085 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case6495rte/2017-02-01` | 6495 | 1352 | 9019 | 6060 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case6495rte/2017-08-01` | 6495 | 1352 | 9019 | 6060 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case6515rte/2017-02-01` | 6515 | 1368 | 9037 | 6063 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case6515rte/2017-08-01` | 6515 | 1368 | 9037 | 6063 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case1888rte/2017-01-01` | 1888 | 296 | 2531 | 1484 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case1951rte/2017-01-01` | 1951 | 390 | 2596 | 1497 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case2848rte/2017-01-01` | 2848 | 544 | 3776 | 2242 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case2868rte/2017-01-01` | 2868 | 596 | 3808 | 2260 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case6468rte/2017-01-01` | 6468 | 1262 | 9000 | 6094 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case6470rte/2017-01-01` | 6470 | 1306 | 9005 | 6085 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case6495rte/2017-01-01` | 6495 | 1352 | 9019 | 6060 | [MTPWR, JoFlMa16]
|
||||
| `matpower/case6515rte/2017-01-01` | 6515 | 1368 | 9037 | 6063 | [MTPWR, JoFlMa16]
|
||||
|
||||
|
||||
PGLIB-UC Instances
|
||||
@@ -315,7 +288,7 @@ Tejada19
|
||||
References
|
||||
----------
|
||||
|
||||
* [UCJL] **Alinson S. Xavier, Aleksandr M. Kazachkov, Feng Qiu.** "UnitCommitment.jl: A Julia/JuMP Optimization Package for Security-Constrained Unit Commitment". Zenodo (2020). [DOI: 10.5281/zenodo.4269874](https://doi.org/10.5281/zenodo.4269874)
|
||||
* [UCJL] **Alinson S. Xavier, Aleksandr M. Kazachkov, Ogün Yurdakul, Feng Qiu.** "UnitCommitment.jl: A Julia/JuMP Optimization Package for Security-Constrained Unit Commitment". Zenodo (2020). [DOI: 10.5281/zenodo.4269874](https://doi.org/10.5281/zenodo.4269874)
|
||||
|
||||
* [KnOsWa20] **Bernard Knueven, James Ostrowski and Jean-Paul Watson.** "On Mixed-Integer Programming Formulations for the Unit Commitment Problem". INFORMS Journal on Computing (2020). [DOI: 10.1287/ijoc.2019.0944](https://doi.org/10.1287/ijoc.2019.0944)
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ Name | Symbol | Description | Unit
|
||||
`switch_off[g,t]` | $w_{g}(t)$ | True if generator `g` switches off at time `t`. | Binary
|
||||
`prod_above[g,t]` |$p'_{g}(t)$ | Amount of power produced by generator `g` above its minimum power output at time `t`. For example, if the minimum power of generator `g` is 100 MW and `g` is producing 115 MW of power at time `t`, then `prod_above[g,t]` equals `15.0`. | MW
|
||||
`segprod[g,t,k]` | $p^k_g(t)$ | Amount of power from piecewise linear segment `k` produced by generator `g` at time `t`. For example, if cost curve for generator `g` is defined by the points `(100, 1400)`, `(110, 1600)`, `(130, 2200)` and `(135, 2400)`, and if the generator is producing 115 MW of power at time `t`, then `segprod[g,t,:]` equals `[10.0, 5.0, 0.0]`.| MW
|
||||
`reserve[g,t]` | $r_g(t)$ | Amount of reserves provided by generator `g` at time `t`. | MW
|
||||
`reserve[r,g,t]` | $r_g(t)$ | Amount of reserve `r` provided by unit `g` at time `t`. | MW
|
||||
`startup[g,t,s]` | $\delta^s_g(t)$ | True if generator `g` switches on at time `t` incurring start-up costs from start-up category `s`. | Binary
|
||||
|
||||
|
||||
|
||||
4
docs/requirements.txt
Normal file
4
docs/requirements.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
Sphinx==3.5.4
|
||||
sphinx-book-theme==0.1.0
|
||||
myst-parser==0.14.0
|
||||
Jinja2==3.0.2
|
||||
@@ -12,10 +12,10 @@ Usage
|
||||
Installation
|
||||
------------
|
||||
|
||||
UnitCommitment.jl was tested and developed with [Julia 1.6](https://julialang.org/). To install Julia, please follow the [installation guide on the official Julia website](https://julialang.org/downloads/platform.html). To install UnitCommitment.jl, run the Julia interpreter, type `]` to open the package manager, then type:
|
||||
UnitCommitment.jl was tested and developed with [Julia 1.7](https://julialang.org/). To install Julia, please follow the [installation guide on the official Julia website](https://julialang.org/downloads/). To install UnitCommitment.jl, run the Julia interpreter, type `]` to open the package manager, then type:
|
||||
|
||||
```text
|
||||
pkg> add UnitCommitment@0.2
|
||||
pkg> add UnitCommitment@0.3
|
||||
```
|
||||
|
||||
To test that the package has been correctly installed, run:
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
Instances
|
||||
=========
|
||||
|
||||
UnitCommitment.jl provides a large collection of benchmark instances collected
|
||||
from the literature and converted to a common data format. If you use these instances in your research, we request that you cite UnitCommitment.jl, as well as the original sources, as listed below. [See documentation for more details](https://anl-ceeesa.github.io/UnitCommitment.jl/).
|
||||
|
||||
References
|
||||
----------
|
||||
|
||||
### UnitCommitment.jl
|
||||
|
||||
* [UCJL] **Alinson S. Xavier, Feng Qiu.** "UnitCommitment.jl: A Julia/JuMP Optimization Package for Security-Constrained Unit Commitment". Zenodo (2020). [DOI: 10.5281/zenodo.4269874](https://doi.org/10.5281/zenodo.4269874)
|
||||
|
||||
|
||||
### MATPOWER
|
||||
|
||||
* [MTPWR] **D. Zimmerman, C. E. Murillo-Sandnchez and R. J. Thomas.** "Matpower: Steady-state operations, planning, and analysis tools forpower systems research and education", IEEE Transactions on PowerSystems, vol. 26, no. 1, pp. 12 –19, Feb. 2011. [DOI: 10.1109/TPWRS.2010.2051168](https://doi.org/10.1109/TPWRS.2010.2051168)
|
||||
|
||||
* [PSTCA] **University of Washington, Dept. of Electrical Engineering.** "Power Systems Test Case Archive". Available at: <http://www.ee.washington.edu/research/pstca/> (Accessed: Nov 14, 2020)
|
||||
|
||||
* [JoFlMa16] **C. Josz, S. Fliscounakis, J. Maeght, and P. Panciatici.** "AC Power Flow
|
||||
Data in MATPOWER and QCQP Format: iTesla, RTE Snapshots, and PEGASE". [ArXiv (2016)](https://arxiv.org/abs/1603.01533).
|
||||
|
||||
* [FlPaCa13] **S. Fliscounakis, P. Panciatici, F. Capitanescu, and L. Wehenkel.**
|
||||
"Contingency ranking with respect to overloads in very large power
|
||||
systems taking into account uncertainty, preventive and corrective
|
||||
actions", Power Systems, IEEE Trans. on, (28)4:4909-4917, 2013.
|
||||
[DOI: 10.1109/TPWRS.2013.2251015](https://doi.org/10.1109/TPWRS.2013.2251015)
|
||||
|
||||
|
||||
### PGLIB-UC
|
||||
|
||||
* [PGLIB] **Carleton Coffrin and Bernard Knueven.** "Power Grid Lib - Unit Commitment". Available at: <https://github.com/power-grid-lib/pglib-uc> (Accessed: Nov 14, 2020)
|
||||
|
||||
* [KrHiOn12] **Eric Krall, Michael Higgins and Richard P. O’Neill.** "RTO unit commitment test system." Federal Energy Regulatory Commission. Available at: <https://www.ferc.gov/industries-data/electric/power-sales-and-markets/increasing-efficiency-through-improved-software-1> (Accessed: Nov 14, 2020)
|
||||
|
||||
* [KnOsWa20] **Bernard Knueven, James Ostrowski and Jean-Paul Watson.** "On Mixed-Integer Programming Formulations for the Unit Commitment Problem". INFORMS Journal on Computing (2020). [DOI: 10.1287/ijoc.2019.0944](https://doi.org/10.1287/ijoc.2019.0944)
|
||||
|
||||
### RTS-GMLC
|
||||
|
||||
* https://github.com/GridMod/RTS-GMLC
|
||||
|
||||
* [BaBlEh19] **Clayton Barrows, Aaron Bloom, Ali Ehlen, Jussi Ikaheimo, Jennie Jorgenson, Dheepak Krishnamurthy, Jessica Lau et al.** "The IEEE Reliability Test System: A Proposed 2019 Update." IEEE Transactions on Power Systems (2019). [DOI: 10.1109/TPWRS.2019.2925557](https://doi.org/10.1109/TPWRS.2019.2925557)
|
||||
|
||||
### OR-LIB
|
||||
|
||||
* [ORLIB] **J.E.Beasley.** "OR-Library: distributing test problems by electronic mail", Journal of the Operational Research Society 41(11) (1990). [DOI: 10.2307/2582903](https://doi.org/10.2307/2582903)
|
||||
|
||||
* [FrGe06] **A. Frangioni, C. Gentile.** "Solving nonlinear single-unit commitment problems with ramping constraints" Operations Research 54(4), p. 767 - 775, 2006. [DOI: 10.1287/opre.1060.0309](https://doi.org/10.1287/opre.1060.0309)
|
||||
|
||||
### Tejada19
|
||||
|
||||
* [TeLuSa19] **D. A. Tejada-Arango, S. Lumbreras, P. Sanchez-Martin and A. Ramos.** "Which Unit-Commitment Formulation is Best? A Systematic Comparison," in IEEE Transactions on Power Systems. [DOI: 10.1109/TPWRS.2019.2962024](https://ieeexplore.ieee.org/document/8941313/).
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user