tfordy.gms : Antalya Forestry Model - Dynamic

Description

This model finds an optimal forest management plan, converting existing
forests into highly managed ones. Various types of sustained yield
conditions can be imposed.


Reference

  • Bergendorff, H, Glenshaw, P, and Meeraus, A, The Planning of Investment Programs in the Paper Industry. Tech. rep., The World Bank, 1980.

Large Model of Type : LP


Category : GAMS Model library


Main file : tfordy.gms

$title Antalya Forestry Model - Dynamic (TFORDY,SEQ=62)

$onText
This model finds an optimal forest management plan, converting existing
forests into highly managed ones. Various types of sustained yield
conditions can be imposed.


Bergendorff, H, Glenshaw, P, and Meeraus, A, The Planning of Investment
Programs in the Paper Industry. Tech. rep., The World Bank, 1980.

Keywords: linear programming, forestry, investment planning, forest management planning
$offText

Set
   c     'commodities'      / pulplogs, sawlogs, residuals, pulp, sawnwood /
   cf(c) 'final products'   / pulp, sawnwood     /
   cl(c) 'log types'        / pulplogs, sawlogs  /
   s     'species'          / nigra, brutia      /
   k     'site classes'     / good, medium, poor /
   at    'tree age'         / a-10,  a-20,  a-30,  a-40,  a-50,  a-60,  a-70,  a-80, a-90
                              a-100, a-110, a-120, a-130, a-140, a-150, a-160, a-170      /
   u(at) 'initial age'      / a-10,  a-20,  a-30,  a-40,  a-50,  a-60,  a-70,  a-80, a-90 /
   p     'processes'        / pulp-pl, pulp-sl, pulp-rs, sawing /
   m     'productive units' / pulp-mill, saw-mill /
   te    'extended horizon' / period-1*period-12  /
   t(te) 'model horizon'    / period-1*period-9   /;

Alias (t,tp);

Parameter
   scd(k)  'site class distribution' / good .25, medium .50, poor .25 /
   land(s) 'land available (1000ha)' / nigra 143.679, brutia 227.58   /;

Table is(at,s) 'initial age distribution of existing forest (proportion)'
                      nigra  brutia
   (a-10,a-20,a-30)      .2      .2
   (a-40,a-50,a-60)     8.5    12.7
   (a-70,a-80,a-90)    24.6    20.6;

Table yef(at,s,cl)   'yield of existing forest               (m3 per ha)'
           nigra.pulplogs  nigra.sawlogs  brutia.pulplogs  brutia.sawlogs
   a-10              38.8            1.2             17.8             3.2
   a-20              48.4            8.6             16.8            19.1
   a-30              43.4           26.6             15.4            32.6
   a-40              34.4           45.6             16.0            41.0
   a-50              27.8           59.2             18.2            46.8
   a-60              28.5           66.5             16.8            53.2
   a-70              27.3           72.7             17.5            55.5
   a-80              25.2           79.8             17.3            54.7
   a-90              26.4           83.8             17.0            54.0
   a-100             27.1           85.9             16.3            51.7
   a-110             27.8           88.2             14.9            47.1
   a-120             28.3           89.7             12.0            38.0
   a-130             28.8           91.2              9.1            28.9
   a-140             28.8           91.2              6.2            19.8
   a-150             28.3           89.7              3.1             9.9
   a-160             27.8           82.2              1.2             3.8
   a-170             27.1           85.9               .5             1.5;

Table ymf(at,k,s,cl) 'yield of managed forest                (m3 per ha)'
                 nigra.pulplogs  nigra.sawlogs  brutia.pulplogs  brutia.sawlogs
   a-10.good                                               17.5
   a-10.medium
   a-10.poor
   a-20.good              120.0                            66.8
   a-20.medium             95.0                            51.1
   a-20.poor               80.0                            37.8
   a-30.good              132.6           37.4             91.3            25.7
   a-30.medium            120.2           14.8             81.4            10.0
   a-30.poor              115.0                            71.3
   a-40.good              121.0           99.0             91.3            74.7
   a-40.medium            115.5           59.5             86.5            44.5
   a-40.poor              119.0           21.0             90.1            15.9
   a-50.good              108.0          162.0             76.0           114.0
   a-50.medium            112.0          108.0             77.0            74.0
   a-50.poor              112.2           57.8             92.0            47.6
   a-60.good              104.0          221.0             76.0           116.0
   a-60.medium            106.0          159.0             76.0           113.0
   a-60.poor              110.0           90.0             95.2            77.8
   a-70.good              105.0          270.0             78.0           200.0
   a-70.medium             98.0          207.0             72.0           153.0
   a-70.poor               97.0          128.0             88.0           116.0
   a-80.good              102.0          323.0             76.0           240.0
   a-80.medium            105.0          235.0             80.0           177.0
   a-80.poor               92.0          163.0             84.0           148.0;

Parameter
   yw(te,at,s,cl)   'yield of existing forest   (m3 per ha)'
   yv(te,te,s,cl,k) 'yield of managed forest    (m3 per ha)'
   iad(at,s)        'initial age distribution (proportions)';

iad(u,s) = is(u,s)/sum(at, is(at,s))/100;
yw(t,at,s,cl)$u(at) = yef(at + (ord(t) - 1),s,cl);

loop(at, yv(t,t + ord(at),s,cl,k) = ymf(at,k,s,cl));
yv(te,te+3,s,cl,k) = ymf("a-30",k,s,cl);

display yw, yv, iad;

Set
   wpos(u,te) 'w possibility'
   vpos(t,te) 'v possibility';

wpos(u,t)  = yes$sum((s,cl),   yw(t,u,s,cl));
vpos(t,te) = yes$sum((s,cl,k), yv(t,te,s,cl,k));

Table a(c,p) 'input output matrix'
              pulp-pl  pulp-sl  pulp-rs  sawing
   pulplogs    -1.0
   sawlogs              -1.0               -1.0
   residuals                     -1.0       0.4
   pulp          .207     .207     .207
   sawnwood                                 0.6;

Table b(m,p) 'capacity utilization'
              pulp-pl  pulp-sl  pulp-rs  sawing
   pulp-mill        1        1        1
   saw-mill                                   1;

Parameter
   pc(p)     'process cost     (us$ per m3 input)' / (pulp-pl,pulp-sl,pulp-rs) 5.96
                                                      sawing                   6.00 /
   pd(cf)    'sales price          (us$ per unit)' / pulp      147.0, sawnwood 70.0 /
   nu(m)     'investment costs (us$ per m3 input)' / pulp-mill  37.8, saw-mill 61.5 /
   age(at)   'age of trees                (years)'
   avl(t,te) 'plant live in periods'
   delt(t)   'discount factors';

Scalar
   mup  'planting cost          (us$ per ha)' / 150.0 /
   muc  'cutting cost           (us$ per m3)' /   7.0 /
   life 'plant life                  (years)' /  30   /
   rho  'discount rate'                       /    .1 /
   sgm  'capital recovery factor';

age(at)    = 10*ord(at);
avl(t,t)   = 1;
avl(t,t-1) = 1;
avl(t,t-2) = 1;
sgm        = rho/(1 - (1 + rho)**(-life));
delt(t)    = (1 + rho)**(-10*(ord(t) - 1));

display age, avl, sgm, delt;

$sTitle Model Definition
Equation
   efs(s,k,u)  'existing forest stock               (1000ha)'
   pfs(s,k,t)  'planted forest stock                (1000ha)'
   lbal(cl,te) 'log balances'
   bal(c,t)    'material balances of wood processing'
   cap(m,t)    'wood processing capacities'
   sy1(te)     'sustained yield constraint - all logs'
   sy2(cl,te)  'sustained yield constraint - log type'
   sy3(cl,te)  'sustained yield constraint - pulp logs'
   sy4(c,t)    'sustained yield constraint - pulp'
   wbnd        'cutting restrictions'
   ainvc(t)    'investment cost'
   aproc(t)    'process cost'
   asales(t)   'sales revenue'
   acutc(t)    'cutting cost'
   aplnt(t)    'planting cost'
   benefit;

Variable
   w(s,k,u,te) 'cutting of existing forest (1000ha per year)'
   v(s,k,t,te) 'management of new forest   (1000ha per year)'
   r(c,te)     'supply of logs to industry (1000m3 per year)'
   z(p,t)      'process level        (1000m3 input per year)'
   h(m,t)      'capacity expansion   (1000m3 input per year)'
   x(c,t)      'final shipments        (1000 units per year)'
   phik(t)     'investment cost           (1000us$ per year)'
   phir(t)     'process cost              (1000us$ per year)'
   phix(t)     'sales revenue             (1000us$ per year)'
   phil(t)     'cutting cost              (1000us$ per year)'
   phip(t)     'planting cost             (1000us$ per year)'
   phi         'total benefits             (discounted cost)';

Positive Variable w, v, r, z, h, x;

efs(s,k,u)..  10*sum(t$wpos(u,t), w(s,k,u,t)) =l= iad(u,s)*scd(k)*land(s);

pfs(s,k,t)..  sum(te$vpos(t,te), v(s,k,t,te)) =l= sum(u$wpos(u,t), w(s,k,u,t))
                                               +  sum(tp$vpos(tp,t), v(s,k,tp,t));

lbal(cl,te).. r(cl,te) =e= sum((k,s,t), yv(t,te,s,cl,k)*v(s,k,t,te))
                        +  sum((k,s,u), yw(te,u,s,cl)*w(s,k,u,te));

sy1(te-1)..   sum(cl, r(cl,te)) =g= sum(cl, r(cl,te-1));

sy2(cl,te-1)..          r(cl,te) =g= r(cl,te-1);

sy3("pulplogs",te-1)..  r("pulplogs",te) =g= r("pulplogs",te-1);

sy4("pulp",t-1)..       x("pulp",t)      =g= x("pulp",t-1);

wbnd..        sum((s,k,u,te)$wpos(u,te), w(s,k,u,te)$((ord(u) + ord(te)) <= 5)) =e= 0;

bal(c,t)..    sum(p, a(c,p)*z(p,t)) + r(c,t)$cl(c) =g= x(c,t)$cf(c);

cap(m,t)..    sum(p, b(m,p)*z(p,t)) =l= sum(tp$avl(t,tp), h(m,tp));

ainvc(t)..    phik(t) =e= sgm*sum(tp$avl(t,tp), sum(m,nu(m)*h(m,tp)));

aproc(t)..    phir(t) =e= sum(p, pc(p)*z(p,t));

asales(t)..   phix(t) =e= sum(cf, pd(cf)*x(cf,t));

acutc(t)..    phil(t) =e= muc*sum(cl, r(cl,t));

aplnt(t)..    phip(t) =e= mup*sum((s,k,te)$vpos(t,te), v(s,k,t,te));

benefit..     phi     =e= sum(t, delt(t)*( phix(t) - phik(t) - phir(t) - phil(t) - phip(t)));

Model
   antala 'base case' / all - sy1       - sy3 - sy4        /
   antalb 'case b'    / all - sy1       - sy3 - sy4 - wbnd /
   antalc 'case c'    / all       - sy2 - sy3 - sy4 - wbnd /
   antald 'case d'    / all - sy1 - sy2       - sy4 - wbnd /
   antale 'case e'    / all - sy1 - sy2 - sy3 - sy4 - wbnd /
   antalf 'case f'    / all - sy1 - sy2 - sy3       - wbnd /;

$sTitle Case Definition and Reports
Parameter
   rp(*,* ,s,k) 'rotation period for new forest (percent)'
   tc(s,k)      'total new cut                   (1000ha)'
   csum(*,t,s)  'cutting summary of old forest';

solve antala using lp maximizing phi;

tc(s,k) = sum((t,tp), v.l(s,k,t,tp));
rp("case-a",at,s,k) = (100*sum(t, v.l(s,k,t,t + ord(at)))/tc(s,k))$tc(s,k);
rp("case-a","total-cut",s,k) = tc(s,k);
csum("case-a",t,s)  = sum((k,u), w.l(s,k,u,t));

solve antalb using lp maximizing phi;

tc(s,k) = sum((t,tp), v.l(s,k,t,tp));
rp("case-b",at,s,k) = (100*sum(t, v.l(s,k,t,t + ord(at)))/tc(s,k))$tc(s,k);
rp("case-b","total-cut",s,k) = tc(s,k);
csum("case-b",t,s)  = sum((k,u), w.l(s,k,u,t));

display rp, csum;