Version:

magic.gms : Magic Power Scheduling Problem

**Description**

A number of power stations are committed to meet demand for a particular day. Three types of generators having different operating characteristics are available. Generating units can be shut down or operate between minimum and maximum output levels. Units can be started up or closed down in every demand block.

**Small Model of Type :** MIP

**Category :** GAMS Model library

**Main file :** magic.gms

```
$title M A G I C Power Scheduling Problem (MAGIC,SEQ=12)
$onText
A number of power stations are committed to meet demand for a particular
day. Three types of generators having different operating characteristics
are available. Generating units can be shut down or operate between
minimum and maximum output levels. Units can be started up or closed down
in every demand block.
Garver, L L, Power Scheduling by Integer Programming,
Tariff-Rates-Power-Generation-Problem, IEEE Trans. Power Apparatus
and Systems, 81, 730-735, 1963
Day, R E, and Williams, H P, MAGIC: The design and use of an interactive
modeling language for mathematical programming. Tech. rep., Department
Business Studies, University of Edinburgh, 1982.
Williams, H P, Model Building in Mathematical Programming. John Wiley
and Sons, 1978.
Keywords: mixed integer linear programming, scheduling, power generation
$offText
Set
t 'demand blocks' / 12pm-6am, 6am-9am, 9am-3pm, 3pm-6pm, 6pm-12pm /
g 'generators' / type-1*type-3 /;
Parameter
dem(t) 'demand (1000mw)' / 12pm-6am 15, 6am-9am 30, 9am-3pm 25, 3pm-6pm 40, 6pm-12pm 27 /
dur(t) 'duration (hours)' / 12pm-6am 6, 6am-9am 3, 9am-3pm 6, 3pm-6pm 3, 6pm-12pm 6 /
peak 'peak power (1000mw)'
ener(t) 'energy demand in load block (1000mwh)'
tener 'total energy demanded (1000mwh)'
lf 'load factor';
peak = smax(t, dem(t));
ener(t) = dur(t)*dem(t);
tener = sum(t, ener(t));
lf = tener/(peak*24);
display peak, tener, lf, ener;
Table data(g,*) 'generation data'
min-pow max-pow cost-min cost-inc start number
* (1000mw) (1000mw) (l/h) (l/h/mw) (l) (units)
type-1 .85 2.0 1000 2.0 2000 12
type-2 1.25 1.75 2600 1.3 1000 10
type-3 1.5 4.0 3000 3.0 500 5;
Variable
x(g,t) 'generator output (1000mw)'
n(g,t) 'number of generators in use'
s(g,t) 'number of generators started up'
cost 'total operating cost (l)';
Integer Variable n;
Positive Variable s;
Equation
pow(t) 'demand for power (1000mw)'
res(t) 'spinning reserve requirements (1000mw)'
st(g,t) 'start-up definition'
minu(g,t) 'minimum generation level (1000mw)'
maxu(g,t) 'maximum generation level (1000mw)'
cdef 'cost definition (l)';
pow(t).. sum(g, x(g,t)) =g= dem(t);
res(t).. sum(g, data(g,"max-pow")*n(g,t)) =g= 1.15*dem(t);
st(g,t).. s(g,t) =g= n(g,t) - n(g,t--1);
minu(g,t).. x(g,t) =g= data(g,"min-pow")*n(g,t);
maxu(g,t).. x(g,t) =l= data(g,"max-pow")*n(g,t);
cdef.. cost =e= sum((g,t), dur(t)*data(g,"cost-min")*n(g,t) + data(g,"start")*s(g,t)
+ 1000*dur(t)*data(g,"cost-inc")*(x(g,t)-data(g,"min-pow")*n(g,t)));
n.up(g,t) = data(g,"number");
Model william / all /;
william.optCr = 0;
solve william minimizing cost using mip;
Parameter rep 'summary report';
rep(t,"demand") = dem(t);
rep(t,"spinning") = sum(g, data(g,"max-pow")*n.l(g,t));
rep(t,"start-ups") = sum(g, s.l(g,t));
rep(t,"m-cost") = -pow.m(t)/dur(t)/1000;
display rep;
```