Initializing help system before first use

Robust unit commitment

Topics covered in this section:

Problem description

The unit commitment problem consists in scheduling the power generation level of a set of generators to meet the power demand. In order for a power system to operate safely, the power generation must equal the demand at any time (the so-called power balance constraints) Failing to satisfy this requirement may result in serious issues, possibly causing a black out.

The power generation level of a power generating unit depends on its commitment. When the unit is switched off, no power is produced, only when it has been started the unit can generate electricity. Due to technical constraints, the power generation level must lie within a band describing safe operation. For the vast majority of unit types, the minimum power generation level is an important parameter when deciding whether to start a particular unit or not.

Another parameter that plays an important role in the decision whether to start a unit is its startup cost. Units with low startup cost could be started and shut down multiple times during a planning period, while units with high cost will preferrably be kept running once started.

For the sake of simplicity, other considerations like ramp rate constraints, shutdown costs or the various reserve types are omitted from the present model.

Example: We shall consider the case of day-head unit commitment scheduling. This operational planning task consists in determining on a day for the next, the startup and shutdown phases of the generating units in order to be able to safely satisfy the next day's power demand. However, the exact demand is not known for sure at the time of scheduling, and hence it is considered an uncertain parameter of the optimization problem. Common practice for dealing with this uncertainty is to commit a larger number of units than strictly required to be sure to have sufficient upward and downward power generation reserve. In the following we will show how to apply robust optimization techniques to take into account this uncertainty more efficiently.

We are going to present two robust implementations of the unit commitment problem resulting in plans for which the unit commitment decisions do not have to be changed in real time. More precisely, the suggested unit commitment schedules make sure that enough power generation capacity is available to supply the actual demand without requiring any last minute unit startups or shutdowns. The first model is based on a scenario uncertainty set, it ensures that the unit commitment status will not require any modification even if the real power demand is different from the forecast. In this problem it is assumed that the power demand realization will be similar to either the forecast or some historical power demand curve. The second model, based on a cardinality uncertainty set, guarantees that the unit commitment status will not require any modification even if up to 'k' generating units are simultaneously forced in outage.

Robust against power demand variation

Typical unit commitment robustness against power demand variation is achieved by adding constraints to bound the difference between the total power generation and the total available power generation capacity of running units. This value is known as the upward power generation level and defines the maximum power demand increase that can be safely supplied without requiring new unit startup. This empirical value is arbitrarly determined from historical power demand.

We will see how the robust optimization framework can be used to seamlessly implement similar constraints by replacing the reserve requirement by a set of robust constraints formed from historical power demand. These historical data and the power demand forecast are used to determine the real power demand. This real power demand is modeled with the scenario uncertainty sets. The figure Historical power demand and forecast presents the next day's historical power demand of the last 6 years alongside with the forecasted power demand.

loadcurve

Figure 6: Historical power demand and forecast

Robust against the N-k contingency

Typical unit commitment robustness against unit forced outage is achieved by analysing the impact of a contingency resulting in loss of k generating units. If the total lost generation is greater than the upward reserve from the remaining generating units, then the system is at risk and demand cannot be fully sustained. Running such a simulation is an important task and provides insights about the security of the power system. Unfortunately, if it can prove the inability of the schedule to survive k, the model will fail to suggest how to improve the schedule to satisfy the safety constraint.

A robust optimization formulation can be used to simulate the loss of k running units and to suggest the startup and shutdown of new units to safely supply the power demand. The cardinality uncertainty sets will be used to model the outage state of a unit.

Mathematical formulation

The set Horizon of consecutive time periods describes the planning horizon of the study. Time periods t∈Horizon have different lengths LENt. Each time period t∈Horizon is associated with a power demand DEMt.

The set Units denotes the set of available power generation units. The minimum power generation level of a unit is PMINu, and its maximum capacity is PMAXu. The startup cost of a single unit is CSTRu, and the cost of running it at the minimum power generation level is CMINu. The marginal power production cost above PMINu for each hour is CADDu.

Each unit u is associated with three decision variables. The binary variable startut equals 1 if the unit u is starting at the beginning of time period t. The binary variable workut equals 1 if the unit u is up and running during the whole time period t. At last, the variable paddut is set to the power generation level of the unit u during time period t.

Original Unit Commitment Problem

The objective function, to be minimized, is the expected operation cost. The operation cost is composed of the startup cost and the generation cost. It can be expressed as follows:

u∈Units,t∈Horizon
CSTRu ·startut + LENt·(cminuworkut + caddu·paddut)

The startup constraints describe the time period(s) during which the unit is starting. They can expressed as follows:

startut ≥ workut - workut-1,  ∀u∈Units, if   t>1
startu1 ≥ worku1 - workuT,  ∀u∈Units, if   t=0

The maximum power generation level constraints limit the power generation level of a unit. These constraints are stated as:

paddut ≤ (PMAXu - PMINu)·workut  ∀u∈Units, t∈Horizon

The power balance constraints ensure that the total power production equals the power demand at any time. They are formulated by these equations:

u∈Units
PMINu·workut + paddut = DEMu,  ∀t∈Horizon

Load Robust Unit Commitment Problem

The Load Robust Unit Commitment problem extends the Original Unit Commitment problem by constraining the unit commitment to be safe under power demand variation. Historical power demands for the last years are known.

The scenario uncertainty set
Let Udem be the set of possible future power demands. Let Years be the set of past years that should be taken into account, and HDEMyt the demand for the time period t of the year y. Then the uncertainty set can be expressed as follows:

Udem = { e : ∀t∈Horizon, ∃y∈Years : et = HDEMyt }

Robust constraints

u∈Units
PMAXu · workut ≥ demt  ∀dem∈Udem, t∈Horizon

The reformulation engine will efficiently handle the resulting, potentially large number of constraints, even with large sets of historical data.

The N-k Contingency-Constrained Unit Commitment Problem

The N-k Contingency-Constrained Unit Commitment problem extends the Original Unit Commitment problem as to make sure that the committed power generation units can supply the load, even if k generators are simultaneously forced in outage. The uncertain eut represents the forced outage event, and the uncertainty set is the set of units that are in forced outage.

The power generation units cannot efficiently be turned on or off at short notice. At the time of scheduling the units, the demand is not known for sure and we must make sure that the total maximum power output capacity of the committed units is greater than the highest demand forecast. Similarly, the total minimum power generation level must be lower than the lowest demand forecast.

The cardinality uncertainty set
Let Uoutage be the set describing groups of combinations of k units in forced outage. This uncertainty set can be expressed as follows:

Uoutage = { e :
u∈Units
eu ≤ k }

Robust constraints

u∈Units
PMAXu * workut · (1-eu) ≥ DEMt  ∀e∈Uoutage, t∈Horizon
u∈Units
PMINu * workut · (1-eu) ≤ DEMt  ∀e∈Uoutage, t∈Horizon

These two robust constraints contain the same uncertains. Because uncertains are used to model worst case situation for a particular constraint, the same uncertain may have different values in each constraint.

Implementation

The Original Unit Commitment Implementation

The Mosel code printed below implements and solves the original formulation of the unit commitment problem.

 declarations
  NT = 7                              ! Number of time periods
  TIME = 1..NT                        ! Time periods
  PLANTS = 1..4                       ! Power generation plant
  UNITS: set of string                ! Power generation units

  LEN, DEM: array(TIME) of integer    ! Length and demand of time periods
  PMIN,PMAX: array(PLANTS) of integer ! Min. and max output of a generator type
  CSTART: array(PLANTS) of integer    ! Start-up cost of a generator
  CMIN: array(PLANTS) of integer      ! Hourly cost of gen. at min. output
  CADD: array(PLANTS) of real         ! Cost/hour/MW of prod. above min. level
  PLANT: array(UNITS) of integer      ! Unit generation plant

  YEARS: range                        ! Historical years
  HDEM: array(YEARS,TIME) of integer  ! Historical demand profiles

  start: array(UNITS,TIME) of mpvar   ! Is generation unit starting ?
  work: array(UNITS,TIME) of mpvar    ! Is generation unit up ?
  padd: array(UNITS,TIME) of mpvar    ! Production above min. output level
 end-declarations

 initializations from 'a6electr_ro_simple.dat'
  LEN DEM PMIN PMAX CSTART CMIN CADD PLANT HDEM
 end-initializations
! Create decision variables
 forall(u in UNITS, t in TIME) do
  start(u,t) is_binary
  work(u,t) is_binary
 end-do

! Objective function: total daily cost
 Cost:= sum(u in UNITS, t in TIME) (CSTART(PLANT(u))*start(u,t) +
  LEN(t)*(CMIN(PLANT(u))*work(u,t) + CADD(PLANT(u))*padd(u,t)))

! Number of generators started per period and per type
 forall(u in UNITS, t in TIME)
  start(u,t) >= work(u,t) - if(t>1, work(u,t-1), work(u,NT))

! Limit on power production range
 forall(u in UNITS, t in TIME)
  padd(u,t) <= (PMAX(PLANT(u))-PMIN(PLANT(u)))*work(u,t)

! Power balance
 forall(t in TIME)
  sum(u in UNITS) (PMIN(PLANT(u))*work(u,t) + padd(u,t)) = DEM(t)

! Symmetry breaker
 forall(t in TIME, p in PLANTS)
  forall(u1, u2 in UNITS | PLANT(u1) = PLANT(u2) and u1<u2)
   work(u1,t) >= work(u2,t)

!**** Solving and solution reporting ****
! Solve the original problem
 minimize(Cost)

 writeln("\n=== Nominal case ===\n")
 print_solution

! Add robust constraints
 robust_demand

! Solve robust the problem
 setparam("ROBUST_UNCERTAIN_OVERLAP", true)
 minimize(Cost)

 writeln("\n=== Robust against demand variation ===\n")
 print_solution

The following output printing routines are invoked from the model shown above:

!**** Print highest loss of load in case of worst case scenario realization
 procedure print_risk
   write("\n", strfmt("Loss of load",20))
   forall(t in TIME) do
     s:= sum(u in UNITS) (work(u,t).sol*PMAX(PLANT(u))) ! Total capacity
     v:= maxlist(DEM(t), max(y in YEARS) HDEM(y,t))     ! Hist. peak demand
     if(s < v) then
       write(strfmt(v-s,8))
     else
       write(strfmt("",8))
     end-if
   end-do
 end-procedure

!**** Solution printing ****
 procedure print_solution
   writeln("Total cost: ", getobjval)

   write(strfmt("Time period ",-20))
   ct:=0
   forall(t in TIME) do
     write(strfmt(ct,5), "-", strfmt(ct+LEN(t),2), "")
     ct+=LEN(t)
   end-do

   write("\n",strfmt("Up Units",-20))
   forall(t in TIME) write(strfmt(sum(u in UNITS) work(u,t).sol,8))
   write("\n", strfmt("Gen. Pwr.",20))
   forall(t in TIME)
     write(strfmt(sum(u in UNITS) (work(u,t).sol*PMIN(PLANT(u))+padd(u,t).sol),8))
   write("\n", strfmt("Gen. Cap.",20))
   forall(t in TIME)
     write(strfmt(sum(u in UNITS) (work(u,t).sol*PMAX(PLANT(u))),8))
   write("\n", strfmt("Res. Dn",20))
   forall(t in TIME) write(strfmt(sum(u in UNITS) (padd(u,t).sol),8))
   write("\n", strfmt("Res. Up",20))
   forall(t in TIME)
     write(strfmt(sum(u in UNITS) work(u,t).sol*PMAX(PLANT(u)) - DEM(t),8))

   print_risk	
   writeln	
 end-procedure

The Load Robust Unit Commitment Implementation

The extension to scenario-based robust optimization is implemented by the following subroutines.

!**** Helper routine to create scenario uncertain set ****
  public procedure makescenario(a:array(r1:range,c1:range) of integer,
	  u:array(c2:range) of uncertain)
    declarations
      aa:dynamic array(r0:range,U:set of uncertain) of real
    end-declarations
    forall(i in r1, j in c1|exists(a(i,j)) and exists(u(j)),n as counter) do
      aa(n,u(j)):=a(i,j)
    end-do
    scenario(aa)
  end-procedure


!**** Robust against past scenario ****
 public procedure robust_demand
   declarations
     demand: array(TIME) of uncertain    ! Uncertain power demand
   end-declarations

  ! Add uncertainty set (time correlation)
   makescenario(HDEM,demand)

  ! Security reserve upward
   forall(t in TIME) sum(u in UNITS) PMAX(PLANT(u))*work(u,t) >= demand(t)

 end-procedure

The N-k Contingency-Constrained Unit Commitment Implementation

Replacing the call to the procedure robust_demand by a call to the procedure robust_contingency printed below will turn the problem formulation into a N-k contingency-constrained unit commitment model.

The example also demonstrates how to use the value of the uncertain to extract meaningful information about the units which are the most critical ones for the system.

 writeln("\n")

!***************************Subroutines***************************
!**** Ensure enough power production capacity allows to
!**** satisfy load even if 'k' units are forced in outage.
 procedure robust_contingency(k: integer)

   forall(t in TIME, u in UNITS) create(outage(u,t))
   forall(t in TIME, u in UNITS) outage(u,t) >= 0
   ! If the unit is forced in outage, the total capacity
   ! of the generating units are lost
   forall(t in TIME, u in UNITS) outage(u,t) <= 1

   ! forall(t in TIME) sum(u in UNITS) outage(u,t) <= k
   forall(t in TIME) cardinality(union(u in UNITS | exists(outage(u,t))) {outage(u,t)}, k)

   forall(t in TIME)
     RobCtrMaxDem(t) := 	
       sum(u in UNITS) PMAX(PLANT(u))*work(u,t) -
       sum(u in UNITS) PMAX(PLANT(u))*work(u,t)*outage(u,t) >= DEM(t)

   ! In order to reduce the number of variables we reuse
   ! outage() and let the solver do the variable duplication
   ! by setting the ROBUST_UNCERTAIN_OVERLAP parameter
   setparam("ROBUST_UNCERTAIN_OVERLAP",true)
   forall(t in TIME)
     RobCtrMinDem(t) :=
       sum(u in UNITS) PMIN(PLANT(u))*work(u,t) -

Results

Let us now take a look at the results generated by the three models. The Original Unit Commitment Problem is used as the baseline scenario and the results of the two robust versions are compared against it.

For all three model formulations, a feasible unit commitment which satisfies the technical constraints and supplies the load is found.

The characteristics of the power generation units used in the test instances (number of units per type, minimum and maximum generation levels, fixed cost when running at minimum level, variable cost between minimum and maximum generation levels, start-up cost) are summarized in Table Description of power generators.

Table 14: Description of power generators
Unit type Number Pmin Pmax Fix cost Add. MW cost Start-up cost
1 10 750 1750 2250 2.7 5000
2 4 1000 1500 1800 2.2 1600
3 8 1200 2000 3750 1.8 2400
4 3 1800 3500 4800 3.8 1200

Table Nominal case presents results of the nominal optimization problem. For each time period, the number of started units is presented (Up Units), along with the generation power (Gen. Pwr.). The generation capacity (Gen. Cap.) is the total maximum power generation available from the started units. The columns 'reserve down' (Res. Dn.) and 'reserve up' (Res. Up) respectively show the maximum load decrease or load increase that can be safely supported without requiring startup or shutdown of any units.

For example, during the first period (0-6) the load can increase from 12000 kWh (power demand forecast) to 13250 kWh (power demand forecast + reserve up) without having to start up new units.

The last two lines present the maximum loss-of-load in case the worst scenario realizes. For the demand variation, the worst scenario is the realization of the load profile that requires the highest power generation increase. For the contingency planning, the worst scenario occurs when the k 'critical' units are forced in outage. The criticality of a unit depends on its power generation level and total reserve. A unit without reserve up is critical, as is a unit supplying a very large share of the total load.

Table 15: Nominal case (Total cost: 1.406 Million)
0-6 6-9 9-12 12-14 14-18 18-22 22-24
Up units 8 18 15 20 15 17 11
Gen. Pwr. 12000 32000 25000 36000 25000 30000 18000
Gen. Cap. 13250 37750 27250 44750 27250 34250 19250
Res. Dn 3850 10050 8450 10450 8450 9850 6250
Res. Up 1250 5750 2250 8750 2250 4250 1250
Loss of load
Demand variation 0 1395 1491 0 2592 0 0
2 Contingencies 2750 1250 1750 0 1750 2750 2750

Table 16: Robust against demand variation (Total cost: 1.409 Million)
0-6 6-9 9-12 12-14 14-18 18-22 22-24
Up Units 8 18 15 20 15 17 11
Gen. Pwr. 12000 32000 25000 36000 25000 30000 18000
Gen. Cap. 13250 39250 28750 44750 30250 37250 19250
Res. Dn 3850 9450 7850 10450 7250 8650 6250
Res. Up 1250 7250 3750 8750 5250 7250 1250
Loss of load 0 0 0 0 0 0 0

If the nominal case is applied, then in case of demand variation, there is a risk of not supplying 1395 kWh of demand during the morning peak. Common sense would be to start up a new unit in order to cover the risk for all time periods when there is a risk of loss of load. However, the results from the robust formulation for the demand variation problem presented in Table Robust against demand variation show that it is possible to overcome the risk merely by changing the type of committed units.

Table 17: Robust against 2 contingencies (Total cost: 1.420 Million)
0-6 6-9 9-12 12-14 14-18 18-22 22-24
Up Units 9 18 16 20 15 17 11
Gen. Pwr. 12000 32000 25000 36000 25000 30000 18000
Gen. Cap. 19750 39250 32250 44750 33250 38750 25250
Res. Dn 850 9450 6050 10450 6050 8050 3850
Res. Up 7750 7250 7250 8750 8250 8750 7250
Loss of load 0 0 0 0 0 0 0

The loss of load for the 2 contingencies case highlights that there is a risk of not being able to supply 2750 kWh during the initial periods. It means that about 20% of the total demand will not be covered. Indeed there is only 1250 kWh of upward reserve available, which means that even if just a single unit running at full capacity is lost (1500 kWh) then the power demand cannot be supplied. Like in the previous case, the common sense conclusion would be to start up new units. However, the results from the robust formulation for the 2 contingencies problem presented in Table Robust against 2 contingencies show that it is possible to find a unit commitment schedule without risking load disconnection and without committing too many new units (and hence incurring higher startup costs).

References

The presented nominal unit commitment model is based on a problem described in the book 'Applications of optimization with Xpress-MP' [GHP02].


© 2001-2024 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.