westmip.gms : Economies of Scale and Investment over Time

Description

A small four sector model is used to illustrate the importance of
economies-of-scale in a dynamic context. Detailed attention has been
paid to the evaluation of terminal savings, capacity and utilization.


Small Model of Types : MIP cns


Category : GAMS Model library


Main file : westmip.gms

$title Economies of Scale and Investment over Time (WESTMIP,SEQ=58)

$onText
A small four sector model is used to illustrate the importance of
economies-of-scale in a dynamic context. Detailed attention has been
paid to the evaluation of terminal savings, capacity and utilization.


Chenery, H B, and Westphal, L E, Economies of Scale and Investment
Over Time. In Chenery, H B, Ed, Structural Change and Development
Policy. Oxford University Press, New York and Oxford, 1979.

Keywords: mixed integer linear programming, constrained nonlinear system,
          economies of scale, investment planning, micro economics
$offText

Set
   i       'sectors'                   / finished, intermed, primary, overhead /
   ia(i)   'sectors needing aux units' / finished, intermed /
   im(i)   'import possible'           / finished, intermed /
   ie(i)   'export possible'           / primary            /
   n       'capacity type'             / normal, auxiliary  /
   in(i,n) 'capacity use'              / (finished, intermed).(normal,auxiliary)
                                         (primary,overhead).   normal            /
   es(i,n) 'units with economies of scale'
   r       'resources'                 / foreign, domestic   /
   forn(r)                             / foreign  /
   dom(r)                              / domestic /
   te      'extended time horizon'     / base, 1*9, terminal /
   t(te)   'time horizon'              /       1*9, terminal /
   ti(te)  'initial period'
   tb(te)  'all periods but last'
   tl(te)  'last or terminal period';

Alias (i,j);

ti(te) = yes$(ord(te) = 1);
tb(te) = yes$(ord(te) < card(te));
tl(te) = not tb(te);
display ti,tb,tl;

Scalar
   cmin 'minimum annual consumption increase' / 10.6  /
   dmax 'debt limit per period'               / 75    /
   rho  'discount rate'                       /   .07 /
   vmax 'largest plant size'                  / 200   /;

Table a(i,j) 'input output matrix'
              finished  intermed  primary  overhead
   finished       1.0
   intermed       -.4       1.0
   primary        -.12      -.48     1.0
   overhead       -.10      -.21     -.35       1.0;

Table u(i,r) 'resource use'
              foreign  domestic
   finished       .04       -.2
   intermed       .06       -.2
   primary                  -.2
   overhead                 -.2;

Parameter
   rbase(r) 'base resources'  / foreign 40, domestic 82.3  /
   delt(t)  'discount factor'
   alpha(i) 'allocation'      / finished  .45, intermed  .32
                                primary   .04, overhead  .19 /
   cbb(i)   'base demand'     / finished   90, intermed   75
                                primary 11.5,  overhead   50 /
   kb(i,n)  'base capacity'   / finished.(normal,auxiliary)  50
                                intermed.(normal,auxiliary)  75
                                primary.normal              160
                                overhead.normal             126.7 /;

Table inv(i,n,*,r) 'investment cost data'
                        fixed.foreign  fixed.domestic  prop.foreign  prop.domestic
   finished.normal                                              .2             .53
   finished.auxiliary                                           .1             .27
   intermed.normal               19                42           .15            .45
   intermed.auxiliary                                           .05            .15
   primary.normal                                               .6            7
   overhead.normal               57.6             108          1.28           2.4 ;

es(i,n) = yes$sum(r, inv(i,n,"fixed",r) > 0);
delt(t) = (1 + rho)**(-ord(t));
display es, delt;

Scalar
   dft1 'discount factor: terminal + 1 to infinity'
   dft3 'discount factor: terminal + 3 to infinity'
   dft8 'discount factor: terminal + 8 to infinity';

dft1 = (1/(1 + rho))**card(t)/(1 - 1/(1 + rho));
dft3 = (1/(1 + rho))**(card(t) + 2)/(1 - 1/(1 + rho));
dft8 = (1/(1 + rho))**(card(t) + 7)/(1 - 1/(1 + rho));

display dft1, dft3, dft8;

* solve square system with CNS solver
Equation mbone(i) 'material balance for terminal model';

Variable xone(i)  'local production required for one unit of consumption';

Model    one      'terminal model one' / mbone /;

mbone(i).. sum(j, a(i,j)*xone(j)) =e= alpha(i);

solve one using cns;

Parameter
   aic(i,n,r) 'average investment cost for size clev'
   clev       'average capacity use'
   ar(r)      'average resource use for size clev';

clev  = 265;
aic(i,n,r)$in(i,n) = inv(i,n,"fixed",r)/(clev*xone.l(i)) + inv(i,n,"prop",r);
ar(r) = sum((i,n)$in(i,n), aic(i,n,r)*xone.l(i));

display clev, aic, ar;

$sTitle Model Definition
Variable
   x(te,i)   'production'
   m(te,i)   'imports'
   e(te,i)   'exports'
   v(te,i,n) 'capacity expansion'
   f(te,i,n) 'fixed charge variable'
   k(te,i,n) 'capacity stock'
   ke3(i,n)  'excess capacity: during first five post terminal years'
   ke8(i,n)  'excess capacity: during second five post terminal years'
   c(t)      'consumption increment'
   d(te)     'level of debt or borrowing'
   ufe(te)   'unused foreign exchange'
   ms(te)    'foreign exchange into domestic'
   vr        'terminal savings in terms of unit consumption'
   vc3       'terminal excess capacity value 3'
   vc8       'terminal excess capacity value 8'
   vc        'post terminal consumption valuation'
   wterm     'terminal valuation'
   welfare   'discounted welfare';

Binary   Variable f;
Positive Variable x, m, e, v, ke3, ke8, ufe, ms, vr, vc3, vc8, vc, c;

Equation
   mb(t,i)    'material balance'
   cc(t,i,n)  'capacity constraint'
   ecc(i,n)   'excess capacity valuation'
   cb(te,i,n) 'capacity balance'
   bi(te,i,n) 'integer constraint'
   rb(te,r)   'resource balance'
   vc38(r)    'terminal excess capacity valuation'
   clow(t)    'increment bounds'
   xlow(t)    'production bounds'
   vcdef(i)   'utilized capacity valuation'
   term       'terminal value definition'
   obj        'objective definition';

mb(t,i).. sum(j, a(i,j)*x(t,j)) + m(t,i)$im(i) =e= e(t,i)$ie(i) + alpha(i)*c(t) + cbb(i);

cc(t,i,n)$in(i,n)..    x(t,i) =l= k(t,i,n);

ecc(i,n)$in(i,n)..     ke3(i,n) + ke8(i,n) =e= k("terminal",i,n) - x("terminal",i);

cb(te-1,i,n)$in(i,n).. k(te,i,n) =e= k(te-1,i,n) + v(te-1,i,n);

bi(te+1,i,n)$es(i,n).. v(te,i,n) =l= vmax*f(te,i,n);

rb(te,r).. sum(i, u(i,r)*x(te,i) + (m(te,i)$im(i) - e(te,i)$ie(i))$forn(r))$t(te)
        +  sum((i,n)$in(i,n), inv(i,n,"fixed",r)*f(te,i,n) + inv(i,n,"prop",r)*v(te,i,n))$tb(te)
        +  (1 + rho)*d(te-1) - d(te)$tb(te) + ms(te)$forn(r) - .8*ms(te)$dom(r)
        +  (ufe(te)$tb(te) - ufe(te-1))$forn(r) + ar(r)*vr$tl(te)
       =l= rbase(r)$ti(te);

vc38(r)..   sum((i,n)$in(i,n), aic(i,n,r)*(ke3(i,n) + ke8(i,n))) =g= ar(r)*(vc3 + vc8);

clow(t+1).. c(t+1) =g= cmin + c(t);

xlow(t+1).. x(t+1,"primary") =g= x(t,"primary");

vcdef(i)..  sum(j, a(i,j)*(x("terminal",j) - kb(j,"normal"))) =g= alpha(i)*vc;

term..      wterm   =e= dft1*vr + dft3*vc3 + dft8*vc8 + dft1*vc;

obj..       welfare =e= sum(t, delt(t)*c(t)) + wterm;

d.up(te)     = dmax;
k.fx(ti,i,n) = kb(i,n);
ke3.up(i,n)  = 5*cmin*xone.l(i);

Model westmip / all /;

option optCr = 0.0;

solve westmip maximizing welfare using mip;

Parameter finsum 'summary of financial results';
finsum(te,"debt-level") = d.l(te);
finsum(te,"fxch-local") = ms.l(te);
finsum(te,"u-fxch")     = ufe.l(te);

display x.l, m.l, e.l, c.l, k.l, v.l, f.l, finsum;