**UnitCommitment.jl** (UC.jl) is a Julia/JuMP optimization package for the Security-Constrained Unit Commitment Problem (SCUC), a fundamental optimization problem in power systems used, for example, to clear the day-ahead electricity markets. The package provides benchmark instances for the problem and Julia/JuMP implementations of state-of-the-art mixed-integer programming formulations.
### Package Components
## Package Components
* **Data Format:** The package proposes an extensible and fully-documented JSON-based data specification format for SCUC, developed in collaboration with Independent System Operators (ISOs), which describes the most important aspects of the problem. The format supports all the most common generator characteristics (including ramping, piecewise-linear production cost curves and time-dependent startup costs), as well as operating reserves, price-sensitive loads, transmission networks and contingencies.
* **Benchmark Instances:** The package provides a diverse collection of large-scale benchmark instances collected from the literature and extended to make them more challenging and realistic.
* **Model Implementation**: The package provides a Julia/JuMP implementation of state-of-the-art formulations and solution methods for SCUC. Our goal is to keep this implementation up-to-date, as new methods are proposed in the literature.
* **Benchmark Instances:** The package provides a diverse collection of large-scale benchmark instances collected from the literature, converted into a common data format, and extended using data-driven methods to make them more challenging and realistic.
* **Model Implementation**: The package provides a Julia/JuMP implementations of state-of-the-art formulations and solution methods for SCUC, including multiple ramping formulations ([ArrCon2000][ArrCon2000], [MorLatRam2013][MorLatRam2013], [DamKucRajAta2016][DamKucRajAta2016], [PanGua2016][PanGua2016]), multiple piecewise-linear costs formulations ([Gar1962][Gar1962], [CarArr2006][CarArr2006], [KnuOstWat2018][KnuOstWat2018]) and contingency screening methods ([XavQiuWanThi2019][XavQiuWanThi2019]). Our goal is to keep these implementations up-to-date as new methods are proposed in the literature.
* **Benchmark Tools:** The package provides automated benchmark scripts to accurately evaluate the performance impact of proposed code changes.
* **Alinson Santos Xavier** (Argonne National Laboratory)
* **Alinson S. Xavier** (Argonne National Laboratory)
* **Aleksandr M. Kazachkov** (University of Florida)
* **Feng Qiu** (Argonne National Laboratory)
### Acknowledgments
* We would like to thank **Aleksandr M. Kazachkov** (University of Florida), **Yonghong Chen** (Midcontinent Independent System Operator), **Feng Pan** (Pacific Northwest National Laboratory) for valuable feedback on early versions of this package.
* We would like to thank **Yonghong Chen** (Midcontinent Independent System Operator), **Feng Pan** (Pacific Northwest National Laboratory) for valuable feedback on early versions of this package.
* Based upon work supported by **Laboratory Directed Research and Development** (LDRD) funding from Argonne National Laboratory, provided by the Director, Office of Science, of the U.S. Department of Energy under Contract No. DE-AC02-06CH11357
@ -25,7 +35,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, 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, 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).
* [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)
* [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)
* [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)
The first step to use UC.jl is to construct a JSON file describing your unit commitment instance. See the [data format page]() for a complete description of the data format UC.jl expects. The next steps, as shown below, are to read the instance from file, construct the optimization model, run the optimization and extract the optimal solution.
The first step to use UC.jl is to construct a JSON file describing your unit commitment instance. See [Data Format](format.md) for a complete description of the data format UC.jl expects. The next steps, as shown below, are to: (1) read the instance from file; (2) construct the optimization model; (3) run the optimization; and (4) extract the optimal solution.
As described in the [Instances page](instances.md), UnitCommitment.jl contains a number of benchmark instances collected from the literature. To solve one of these instances individually, instead of constructing your own, the function `read_benchmark` can be used:
UnitCommitment.jl contains a large number of benchmark instances collected from the literature and converted into a common data format. To solve one of these instances individually, instead of constructing your own, the function `read_benchmark` can be used, as shown below. See [Instances](instances.md) for the complete list of available instances.
By default, `build_model` uses a formulation that combines modeling components from different publications, and that has been carefully tested, using our own benchmark scripts, to provide good performance across a wide variety of instances. This default formulation is expected to change over time, as new methods are proposed in the literature. You can, however, construct your own formulation, based the modeling components that you choose, as shown in the next example.
```julia
using Cbc
using UnitCommitment
import UnitCommitment:
Formulation,
KnuOstWat2018,
MorLatRam2013,
ShiftFactorsFormulation
### Modifying the formulation
instance = UnitCommitment.read_benchmark(
"matpower/case118/2017-02-01",
)
For the time being, the recommended way of modifying the MILP formulation used by UC.jl is to create a local copy of our git repository and directly modify the source code of the package. In a future version, it will be possible to switch between multiple formulations, or to simply add/remove constraints after the model has been generated.
<h2>Package Components<aclass="headerlink"href="#package-components"title="Permalink to this headline">¶</a></h2>
<ulclass="simple">
<li><p><strong>Data Format:</strong> The package proposes an extensible and fully-documented JSON-based data specification format for SCUC, developed in collaboration with Independent System Operators (ISOs), which describes the most important aspects of the problem. The format supports all the most common generator characteristics (including ramping, piecewise-linear production cost curves and time-dependent startup costs), as well as operating reserves, price-sensitive loads, transmission networks and contingencies.</p></li>
<li><p><strong>Benchmark Instances:</strong> The package provides a diverse collection of large-scale benchmark instances collected from the literature and extended to make them more challenging and realistic.</p></li>
<li><p><strong>Model Implementation</strong>: The package provides a Julia/JuMP implementation of state-of-the-art formulations and solution methods for SCUC. Our goal is to keep this implementation up-to-date, as new methods are proposed in the literature.</p></li>
<li><p><strong>Benchmark Instances:</strong> The package provides a diverse collection of large-scale benchmark instances collected from the literature, converted into a common data format, and extended using data-driven methods to make them more challenging and realistic.</p></li>
<li><p><strong>Model Implementation</strong>: The package provides a Julia/JuMP implementations of state-of-the-art formulations and solution methods for SCUC, including multiple ramping formulations (<aclass="reference external"href="https://doi.org/10.1109/59.871739">ArrCon2000</a>, <aclass="reference external"href="https://doi.org/10.1109/TPWRS.2013.2251373">MorLatRam2013</a>, <aclass="reference external"href="https://doi.org/10.1007/s10107-015-0919-9">DamKucRajAta2016</a>, <aclass="reference external"href="https://doi.org/10.1287/opre.2016.1520">PanGua2016</a>), multiple piecewise-linear costs formulations (<aclass="reference external"href="https://doi.org/10.1109/AIEEPAS.1962.4501405">Gar1962</a>, <aclass="reference external"href="https://doi.org/10.1109/TPWRS.2006.876672">CarArr2006</a>, <aclass="reference external"href="https://doi.org/10.1109/TPWRS.2017.2783850">KnuOstWat2018</a>) and contingency screening methods (<aclass="reference external"href="https://doi.org/10.1109/TPWRS.2019.2892620">XavQiuWanThi2019</a>). Our goal is to keep these implementations up-to-date as new methods are proposed in the literature.</p></li>
<li><p><strong>Benchmark Tools:</strong> The package provides automated benchmark scripts to accurately evaluate the performance impact of proposed code changes.</p></li>
</ul>
</div>
<divclass="section"id="authors">
<h2>Authors<aclass="headerlink"href="#authors"title="Permalink to this headline">¶</a></h2>
<h3>Authors<aclass="headerlink"href="#authors"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p><strong>Alinson Santos Xavier</strong> (Argonne National Laboratory)</p></li>
<li><p><strong>Alinson S. Xavier</strong> (Argonne National Laboratory)</p></li>
<li><p><strong>Aleksandr M. Kazachkov</strong> (University of Florida)</p></li>
<li><p><strong>Feng Qiu</strong> (Argonne National Laboratory)</p></li>
</ul>
</div>
<divclass="section"id="acknowledgments">
<h2>Acknowledgments<aclass="headerlink"href="#acknowledgments"title="Permalink to this headline">¶</a></h2>
<h3>Acknowledgments<aclass="headerlink"href="#acknowledgments"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>We would like to thank <strong>Aleksandr M. Kazachkov</strong> (University of Florida), <strong>Yonghong Chen</strong> (Midcontinent Independent System Operator), <strong>Feng Pan</strong> (Pacific Northwest National Laboratory) for valuable feedback on early versions of this package.</p></li>
<li><p>We would like to thank <strong>Yonghong Chen</strong> (Midcontinent Independent System Operator), <strong>Feng Pan</strong> (Pacific Northwest National Laboratory) for valuable feedback on early versions of this package.</p></li>
<li><p>Based upon work supported by <strong>Laboratory Directed Research and Development</strong> (LDRD) funding from Argonne National Laboratory, provided by the Director, Office of Science, of the U.S. Department of Energy under Contract No. DE-AC02-06CH11357</p></li>
<li><p>Based upon work supported by the <strong>U.S. Department of Energy Advanced Grid Modeling Program</strong> under Grant DE-OE0000875.</p></li>
</ul>
</div>
<divclass="section"id="citing">
<h2>Citing<aclass="headerlink"href="#citing"title="Permalink to this headline">¶</a></h2>
<h3>Citing<aclass="headerlink"href="#citing"title="Permalink to this headline">¶</a></h3>
<p>If you use UnitCommitment.jl in your research (instances, models or algorithms), we kindly request that you cite the package as follows:</p>
<ulclass="simple">
<li><p><strong>Alinson S. Xavier, Feng Qiu</strong>, “UnitCommitment.jl: A Julia/JuMP Optimization Package for Security-Constrained Unit Commitment”. Zenodo (2020). <aclass="reference external"href="https://doi.org/10.5281/zenodo.4269874">DOI: 10.5281/zenodo.4269874</a>.</p></li>
<li><p><strong>Alinson S. Xavier, Aleksandr M. Kazachkov, Feng Qiu</strong>, “UnitCommitment.jl: A Julia/JuMP Optimization Package for Security-Constrained Unit Commitment”. Zenodo (2020). <aclass="reference external"href="https://doi.org/10.5281/zenodo.4269874">DOI: 10.5281/zenodo.4269874</a>.</p></li>
</ul>
<p>If you use the instances, we additionally request that you cite the original sources, as described in the <aclass="reference internal"href="instances/"><spanclass="doc std std-doc">instances page</span></a>.</p>
</div>
<divclass="section"id="license">
<h2>License<aclass="headerlink"href="#license"title="Permalink to this headline">¶</a></h2>
<h3>License<aclass="headerlink"href="#license"title="Permalink to this headline">¶</a></h3>
<divclass="highlight-text notranslate"><divclass="highlight"><pre><span></span>UnitCommitment.jl: A Julia/JuMP Optimization Package for Security-Constrained Unit Commitment
@ -1933,7 +1933,7 @@ If you use these instances in your research, we request that you cite UnitCommit
<divclass="section"id="references">
<h2><spanclass="sectnum">3.5.</span> References<aclass="headerlink"href="#references"title="Permalink to this headline">¶</a></h2>
<ulclass="simple">
<li><p>[UCJL] <strong>Alinson S. Xavier, Feng Qiu.</strong> “UnitCommitment.jl: A Julia/JuMP Optimization Package for Security-Constrained Unit Commitment”. Zenodo (2020). <aclass="reference external"href="https://doi.org/10.5281/zenodo.4269874">DOI: 10.5281/zenodo.4269874</a></p></li>
<li><p>[UCJL] <strong>Alinson S. Xavier, Aleksandr M. Kazachkov, Feng Qiu.</strong> “UnitCommitment.jl: A Julia/JuMP Optimization Package for Security-Constrained Unit Commitment”. Zenodo (2020). <aclass="reference external"href="https://doi.org/10.5281/zenodo.4269874">DOI: 10.5281/zenodo.4269874</a></p></li>
<li><p>[KnOsWa20] <strong>Bernard Knueven, James Ostrowski and Jean-Paul Watson.</strong> “On Mixed-Integer Programming Formulations for the Unit Commitment Problem”. INFORMS Journal on Computing (2020). <aclass="reference external"href="https://doi.org/10.1287/ijoc.2019.0944">DOI: 10.1287/ijoc.2019.0944</a></p></li>
<li><p>[KrHiOn12] <strong>Eric Krall, Michael Higgins and Richard P. O’Neill.</strong> “RTO unit commitment test system.” Federal Energy Regulatory Commission. Available at: <aclass="reference external"href="https://www.ferc.gov/industries-data/electric/power-sales-and-markets/increasing-efficiency-through-improved-software-1">https://www.ferc.gov/industries-data/electric/power-sales-and-markets/increasing-efficiency-through-improved-software-1</a> (Accessed: Nov 14, 2020)</p></li>
<li><p>[BaBlEh19] <strong>Clayton Barrows, Aaron Bloom, Ali Ehlen, Jussi Ikaheimo, Jennie Jorgenson, Dheepak Krishnamurthy, Jessica Lau et al.</strong> “The IEEE Reliability Test System: A Proposed 2019 Update.” IEEE Transactions on Power Systems (2019). <aclass="reference external"href="https://doi.org/10.1109/TPWRS.2019.2925557">DOI: 10.1109/TPWRS.2019.2925557</a></p></li>
<h3>Solving user-provided instances<aclass="headerlink"href="#solving-user-provided-instances"title="Permalink to this headline">¶</a></h3>
<p>The first step to use UC.jl is to construct a JSON file describing your unit commitment instance. See the <spanclass="xref myst">data format page</span> for a complete description of the data format UC.jl expects. The next steps, as shown below, are to read the instance from file, construct the optimization model, run the optimization and extract the optimal solution.</p>
<p>The first step to use UC.jl is to construct a JSON file describing your unit commitment instance. See <aclass="reference internal"href="../format/"><spanclass="doc std std-doc">Data Format</span></a> for a complete description of the data format UC.jl expects. The next steps, as shown below, are to: (1) read the instance from file; (2) construct the optimization model; (3) run the optimization; and (4) extract the optimal solution.</p>
<h3>Solving benchmark instances<aclass="headerlink"href="#solving-benchmark-instances"title="Permalink to this headline">¶</a></h3>
<p>As described in the <aclass="reference internal"href="../instances/"><spanclass="doc std std-doc">Instances page</span></a>, UnitCommitment.jl contains a number of benchmark instances collected from the literature. To solve one of these instances individually, instead of constructing your own, the function <codeclass="docutils literal notranslate"><spanclass="pre">read_benchmark</span></code> can be used:</p>
<p>UnitCommitment.jl contains a large number of benchmark instances collected from the literature and converted into a common data format. To solve one of these instances individually, instead of constructing your own, the function <codeclass="docutils literal notranslate"><spanclass="pre">read_benchmark</span></code> can be used, as shown below. See <aclass="reference internal"href="../instances/"><spanclass="doc std std-doc">Instances</span></a> for the complete list of available instances.</p>
<h3>Modifying the formulation<aclass="headerlink"href="#modifying-the-formulation"title="Permalink to this headline">¶</a></h3>
<p>For the time being, the recommended way of modifying the MILP formulation used by UC.jl is to create a local copy of our git repository and directly modify the source code of the package. In a future version, it will be possible to switch between multiple formulations, or to simply add/remove constraints after the model has been generated.</p>
<h3>Customizing the formulation<aclass="headerlink"href="#customizing-the-formulation"title="Permalink to this headline">¶</a></h3>
<p>By default, <codeclass="docutils literal notranslate"><spanclass="pre">build_model</span></code> uses a formulation that combines modeling components from different publications, and that has been carefully tested, using our own benchmark scripts, to provide good performance across a wide variety of instances. This default formulation is expected to change over time, as new methods are proposed in the literature. You can, however, construct your own formulation, based the modeling components that you choose, as shown in the next example.</p>