Description
Stochastic Electric Power Expansion Planning Problem. This is a two-stage stochastic linear program. Facing uncertain demand, decisions about generation capacity need to be made. This model is also used as an example in the GAMS/DECIS user's guide.
Small Model of Type : DECIS
Category : GAMS Model library
Main file : apl1p.gms
$title APL1P Stochastic Programming Example for GAMS/DECIS (APL1P,SEQ=197)
$onText
Stochastic Electric Power Expansion Planning Problem.
This is a two-stage stochastic linear program.
Facing uncertain demand, decisions about generation
capacity need to be made.
This model is also used as an example in the
GAMS/DECIS user's guide.
Infanger, G, Planning Under Uncertainty - Solving Large-Scale
Stochastic Linear Programs, 1988.
Keywords: linear programming, stochastic programming, electric power generation
$offText
$if not set decisalg $set decisalg decism
Set
g 'generators' / g1, g2 /
dl 'demand levels' / h , m , l /;
Parameter
alpha(g) 'availability' / g1 0.68, g2 0.64 /
ccmin(g) 'min capacity' / g1 1000, g2 1000 /
ccmax(g) 'max capacity' / g1 10000, g2 10000 /
c(g) 'investment' / g1 4.0, g2 2.5 /;
Table f(g,dl) 'operating cost'
h m l
g1 4.3 2.0 0.5
g2 8.7 4.0 1.0;
Parameter
d(dl) 'demand' / h 1040, m 1040, l 1040 /
us(dl) 'cost of unserved demand' / h 10, m 10, l 10 /;
* -----------------------------------------------
* define the core model
* -----------------------------------------------
Free Variable tcost 'total cost';
Positive Variable
x(g) 'capacity of generators'
y(g,dl) 'operation level'
s(dl) 'unserved demand';
Equation
cost 'total cost'
cmin(g) 'minimum capacity'
cmax(g) 'maximum capacity'
omax(g) 'maximum operating level'
demand(dl) 'satisfy demand';
cost.. tcost =e= sum(g, c(g)*x(g))
+ sum(g, sum(dl, f(g,dl)*y(g,dl)))
+ sum(dl,us(dl)*s(dl));
cmin(g).. x(g) =g= ccmin(g);
cmax(g).. x(g) =l= ccmax(g);
omax(g).. sum(dl, y(g,dl)) =l= alpha(g)*x(g);
demand(dl).. sum(g, y(g,dl)) + s(dl) =g= d(dl);
Model apl1p / all /;
* -----------------------------------------------
* setting decision stages
* -----------------------------------------------
x.stage(g) = 1;
y.stage(g,dl) = 2;
s.stage(dl) = 2;
cmin.stage(g) = 1;
cmax.stage(g) = 1;
omax.stage(g) = 2;
demand.stage(dl) = 2;
* -----------------------------------------------
* defining independent stochastic parameters
* -----------------------------------------------
Set
stoch / out, pro /
omega1 / o11, o12, o13, o14 /
omega2 / o21, o22, o23, o24, o25 /;
Table v1(stoch, omega1)
o11 o12 o13 o14
out -1.0 -0.9 -0.5 -0.1
pro 0.2 0.3 0.4 0.1;
Table v2(stoch, omega2)
o21 o22 o23 o24 o25
out -1.0 -0.9 -0.7 -0.1 -0.0
pro 0.1 0.2 0.5 0.1 0.1;
Table v3(stoch, omega1)
o11 o12 o13 o14
out 900 1000 1100 1200
pro 0.15 0.45 0.25 0.15;
Table v4(stoch,omega1)
o11 o12 o13 o14
out 900 1000 1100 1200
pro 0.15 0.45 0.25 0.15;
Table v5(stoch,omega1)
o11 o12 o13 o14
out 900 1000 1100 1200
pro 0.15 0.45 0.25 0.15;
* -----------------------------------------------
* outputting stochastic file
* -----------------------------------------------
File stg / MODEL.STG /;
put stg;
put "INDEP DISCRETE" /;
loop(omega1, put "x g1 omax g1 ", v1("out", omega1), " period2 ", v1("pro", omega1) /;);
put "*" /;
loop(omega2, put "x g2 omax g2 ", v2("out", omega2), " period2 ", v2("pro", omega2) /;);
put "*" /;
loop(omega1, put "RHS demand h ", v3("out", omega1), " period2 ", v3("pro", omega1) /;);
put "*" /;
loop(omega1, put "RHS demand m ", v4("out", omega1), " period2 ", v4("pro", omega1) /;);
put "*" /;
loop(omega1, put "RHS ", " demand l ", v5("out", omega1), " period2 ", v5("pro", omega1) /;);
putClose;
* -----------------------------------------------
* output a MINOS option file
* -----------------------------------------------
File mopt / MINOS.SPC /;
put mopt;
put "begin"/;
put "rows 250"/;
put "columns 250"/;
put "elements 10000"/;
put "end"/;
putClose;
* -----------------------------------------------
* solve the model
* -----------------------------------------------
option lp = %decisalg%;
solve apl1p using lp minimizing tcost;
Scalar
ccost 'capital cost'
ocost 'operating cost';
ccost = sum(g, c(g)*x.l(g));
ocost = tcost.l - ccost;
display x.l, tcost.l, ccost, ocost, y.l, s.l;