In this work, we analyse how we can use the famous Ward reduction to reduce the computational burden of unit-commitment models. The UC model we currently study has two main components:
- Typical model for thermal generating units: linear generation costs, generation limits, ramps, and minimum up and down times.
- Lossless DC network model.
The resulting mathematical model is mixed-integer linear.
For the lack of a better name, in the following, we refer to this package as the package
.
- The package first determines sets of branch elements whose limits cannot be reached during the planning horizon
- Then, it applies succesive Ward reductions to the power system by explointing the redundant branch limits previously found. In the Ward reduction, nodes connected to branches with redundant limits are deemed external; nodes directly connected to any external nodes are defined frontier nodes; and the remaining, those connected to at least one branch element whose limit can be reached and those who are not directly connected to external nodes, are called internal nodes.
On Windows:
mpiexec -np 1 python "main.py" %1 [--EXP_NAME=exp_1] [--T=36] [--CASE=1] [--PS=ieee118] [--IN_DIR=""] [--OUT_DIR=""] [--THREADS=0] [--VERBOSE=1] [--DISCRETIZATION=1] [--MILP_GAP=0.0001] [--DEFICIT_COST=100000000] [--REDUCE_SYSTEM=0] [--POWER_BASE=100] [--SCAL_OBJ_F=0.001] [--MIN_GEN_CUT_MW=1] [--PTDF_COEFF_TOL=0.00001] [--MAX_NUMBER_OF_CONNECTIONS=20] [--MAX_PROCESS_REDUCE_NETWORK=1] [--NETWORK_MODEL=B_THETA] [--NETWORK_SLACKS=BUS_SLACKS]
Command | Description |
---|---|
EXP_NAME | Name that uniquely identifies the current experiment. If an output directory, OUT_DIR, is not provided, then an output directory EXP_NAME will be created, defaults to "exp1" |
T | Number of periods in the scheduling horizon, defaults to 36 |
TIME_LIMIT | Time limit in seconds, defaults to 3600.0 |
CASE | ID of the case under study, defaults to "1" |
PS | Name of the power system under study, defaults to "ieee118" |
IN_DIR | dir where the input files are located, defaults to ''. If not given, the input directory is assumed to be in the parent directory |
OUT_DIR | dir to which the output is to be written to, defaults to ''. If not given, an directory will be created in the parent directory |
THREADS | Maximum number of threads available to each process, defaults to 0 |
DISCRETIZATION | Length in hours of each time period in the scheduling horizon, defaults to 1.0 |
VERBOSE | Flag that indicates whether the optimization solvers console output is enabled, defaults to True |
DISCRETIZATION | Length in hours of each time period in the scheduling horizon, defaults to 1.0 |
MILP_GAP | Relative gap tolerance for the UC MILP, defaults to 1e-4 |
REDUCE_SYSTEM | Flag to indicate whether the transmission system should be reduced, defaults to False |
DEFICIT_COST | Unitary cost for load curtailment and generation surplus, defaults to 1e8 |
REDUCE_SYSTEM | Flag to indicate whether the transmission system should be reduced, defaults to False |
POWER_BASE | Power base in MVA, defaults to 100 |
SCAL_OBJ_F | Scaling factor applied to the objective function. The objective function is multiplied by this factor, defaults to 1e-3. |
MIN_GEN_CUT_MW | Threshold for the minimum generation of generating units. Units whose minimum generation is strictly less than this value are assumed to have no minimum generation, i.e., the minimum generation is replaced by 0, default to 1.00. |
PTDF_COEFF_TOL | Threshold for the coefficient of the PTDF matrix. Coefficients whose magnitudes are less than this value are substituted by 0, defaults to 1e-5. |
MAX_NUMBER_OF_CONNECTIONS | In the strategy used to reduce the network, it is possible to determine the maximum number of connections that the network nodes may have after the reduction is applied, defaults to 20 |
MAX_PROCESS_REDUCE_NETWORK | Maximum number of processes launched to identify inactive transmission line bounds, defaults to 1 |
NETWORK_MODEL | Network model used |
NETWORK_SLACKS | Network slacks to be included (default = NetworkSlacks.BUS_SLACKS ) |
The complete package dependency is described in 'requirements.txt'. We summarize the roles of the main packages below.
- gurobipy for solving the optimization models
- numpy for matrix computations
- networkx for network computations
- mpi4py for parallel computing
If you have an MPI implementation, you can launch multiple processes to accelerate the branch-limit's redundancy identification step. We test our codes with the Microsoft implementation, MS-MPI, Version 10.1.12498.18, on an Intel machine running Win11. And on Ubuntu 20, with Open-MPI, version 4, also on a Intel machine.
TODO
TODO
Consider the following 14-node system.
The system has 18 branches, 5 generators (represented in green), and 11 nodes with load (represented by the red arrows). Assume for simplicity that all branches have reactances of 0.1 p.u.. Moreover, throughout this example, node 2 is used as the reference node for the voltage angles. The first order of businness is to compute the Power Transfer Distribution Factors (PTDF) matrix for this system.
Now, assume that the individual loads are 1 p.u., then adding up to a total system load of 11 p.u.. Moreover, assume that only 4 of all 18 branches can possibly reach their limits under any feasible operation of this system for this load profile --- these are the branches 4, 13, 14 and 16, represented in red in the image. For the possibly binding branches, assume lower and upper limits for the flows of 10 p.u.. For all other branches, the limits -inf and +inf.
We intend to show some of the most important features of our algorithm with this example. Hence, in this example, we follow the same steps taken in the algorithm. If you wish, you can follow the same steps by debugging our code with your favorite IDE.
For this system, the PTDF matrix (rounded) is
The above steps are taken in
wardUC/pre_processing/build_ptdf.py
Line 148 in 7fccda4
With the PTDF, we can add the flow constraints for the branches whose limits might be reached in the UC, as we explain in the paper. For this example, there are 4 possibly binding branches, 4, 13, 14 and 16. Their flows, as described by the PTDF, are force to be within their respective limits by the constraints below.
In addition to the flow constraints, we need to make sure that the total generation equals total load for the system.
On the other hand, for the B-theta formulation, we explictly enforce the power balance for each node.
Where
For this formulation, the flow expressions and their respective limits are as follows.
The above formulations are used when the network is not reduced. That is, for the full network, or original system. As the network is reduced, nodes, branches and slack variables are eliminated from the model. Thus reflecting in changes both in the B-theta and the PTDF formulations
Below we show the step-by-step transformation that these formulations undergo as the network is reduced.
For this system, our algorithm firstly removes node 8. This node is connected to the rest of the system through a single, and it is one branch that is possibly binding. Furthermore, generator G5 is connected to node 8. Hence, after removing this, we need to ensure that the limits of the branch removed with it, branch 13, is still enforced in the reduced network, and we need to properly reassign the generation of G5.
In the B-theta formulation, in addition to removing the constraints associated with node 8 and branch 13, the power balance constraint of node 7 now becomes
In our strategy, because the limits of branch 13 are possibly binding but it has been removed, its limits are now enforced on the injections connected to the node being deleted. For branch 13, this simply means enforcing its limits on the generation of G5.
For this particular node deletion, nothing changes for the PTDF formulation.
The next step is to remove node 14. This is a load node also connected to the rest of the network through a single branch. Different from node 8, however, the branch connecting node 14 is not possibly binding. Thus, all we need to do is carefully reassign the load then connected to node 14. Because it was connected by a single branch, all injections of node 14 are then reassigned to the node that it was connected to: node 13. Thus, node 13 now receives an additional 1 p.u. load.
For the B-theta formulation, removing node 14, in addition to removing the variables and constraints associated with it and with the branch deleted, boils down to modifying the power balance constraint of node 13 as follows.
For the PTDF formulation, in addition to relocating the load, we need to remember to remove the slack variables previously associated with node 14 from the flow expressions, as follows.
Naturally, the slack variable associated with the deleted node 14 also needs to be removed from the global balance equation.
This same procedure is then applied to node 13 and then to node 12, which results in the reduced network shown below.
After these steps, the loads originally located at 14, 13 and 12 are placed at node 6, whose power balance equation becomes
For the PTDF formulation, the reduced network now has the following constraints.
and
The next node removed is node 10. Different from the previous nodes deleted, node 10 is connected to two branches and one of them is possibly them. Removing node 10 then divides its injection between the nodes it was connected to (11 and 9), and creates a new branch between these nodes (branch 19). The amount of injection of node 10 that goes to 9 and the amount that goes to 11, as well as the reactance and limits of the new branch, depend on the reactances of the branches then connecting node 10. The new branch's limits, in fact, are also dependent on the injection of node 10.
B-theta:
PTDF:
and
By following the same procedure applied to node 10, we can safely remove node 11 and reduce the network to the one shown below.
Then, we further reduce the network by deleting node 1. This node is connected to two branches but it has one generator connected to it. Naturally, the generation from G1 is then split between nodes 2 and 5, according to the reactances of the branches between deleted.
Note that the only thing that changes is that the generator now simultaneously injects power into two nodes. However, its total power injection is still the same: the injection has only been fractioned among more nodes. Furthermore, from the point-of-view of the generator, its model remains unchanged.
and
The same steps applied to node 1 are replicated to node 3, with the exception that the new branch between nodes 2 and 4 is parallel to a existing branch, which happens to be possibly binding.
In this scenario, the limits of the new branch 22 are defined by the maximum angular difference that could be applied to branch 4. The result is a lower bound of -15 p.u. and an upper bound of 15 p.u..
PTDF:
and
B-theta:
PTDF: