tabora.gms : Tabora Rural Development - Fuelwood Production

Description

A village in Tanzania, growing maize and tobacco, is faced with the
decision to either invest in a managed forest close to the village or
continue to harvest wood from the natural forest which requires increasing
travel time as the resource gets depleted. The investments in the
managed forest are analyzed using a 30 year dynamic model.


Reference

  • World Bank, Tanzania: Appraisal of the Tabora Rural Development Project. Tech. rep., The World Bank, 1977.

Large Model of Type : LP


Category : GAMS Model library


Main file : tabora.gms

$title Tabora Rural Development - Fuelwood Production (TABORA,SEQ=57)

$onText
A village in Tanzania, growing maize and tobacco, is faced with the
decision to either invest in a managed forest close to the village or
continue to harvest wood from the natural forest which requires increasing
travel time as the resource gets depleted. The investments in the
managed forest are analyzed using a 30 year dynamic model.


World Bank, Tanzania: Appraisal of the Tabora Rural Development Project.
Tech. rep., The World Bank, 1977.

Keywords: linear programming, forestry
$offText

Set
   t     'time periods'    / y01*y30 /
   a     'age of trees'    / a01*a24 /
   m     'month'           / jan, feb, mar, apr, may, jun
                             jul, aug, sep, oct, nov, dec /
   mc(m) 'cutting months'  / jul, aug, sep, oct /
   i     'annuly'          / 1*9 /
   c     'annual crops'    / maize, tobacco /;

Table ld(*,m)  'labor requirements'
                jan   feb   mar   apr   may   jun   jul   aug   sep   oct   nov   dec
   tobacco     44.7  84.2  87.3  90.7  20.5                    37.3  44.7  19.7  46.4
   maize       46.7  10.0  13.0  16.7  18.3                                13.3  33.3
   timber-1    10.0         3.0        10.0               1.0   7.0   8.0   9.0
   timber-2     7.0                    10.0               1.0
   other       10.0   8.0  12.0  10.0   4.0   2.0                    10.0  28.0  24.0;

Table tmd(*,c) 'crop data'
                tobacco   maize
   input-cost    2000      20
   yield          675     750
   price            8.4      .8;

Scalar
   nfam     'number of families in village'                  / 400    /
   sfam     'size of family                   (adult equiv)' /   3    /
   resw     'reservation wage                (tsh per hour)' /    .5  /
   fdmaize  'domestic maize demand          (kg per family)' / 650    /
   tob      'steady state tobacco                      (ha)' / 234    /
   sr       'starting radius of annulus                (km)' /   5    /
   width    'width of annulus                          (km)' /   1    /
   ws       'walking speed                    (km per hour)' /   5    /
   whd      'work hours per day'                             /  10    /
   wdm      'working days per month'                         /  25    /
   tr       'transport cost             (tsh per m3 per km)' /   1.31 /
   tc       'timber planting cost              (tsh per ha)' / 349    /
   wrc      'wood for curing                    (m3 per ha)' /  46.75 /
   dwr      'domestic wood requirement      (m3 per family)' /  10    /
   labwc    'labor for cutting forest     (man-days per m3)' /   1    /
   labvc    'labor for cutting timber     (man-days per m3)' /    .5  /
   yw       'yield of existing forest           (m3 per ha)' /  40    /
   rho      'discount rate'                                  /    .1  /
   matr     'improvement in maize yield after tobacco'       /    .25 /
   dmaize   'domestic maize demand in village          (kg)'
   wr       'wood requirements for domestic use and tobacco curing (m3)';

Parameter
   yv(a)    'yield of planted timber     (m3 per ha)' / (a08,a16,a24) 120 /
   vr(t)    'residual value of timber          (tsh)'
   labor(m) 'village labor supply         (man-days)'
   fa(i)    'area of annulus                    (ha)'
   dist(i)  'average distance of annulus        (km)'
   labw(i)  'labor for cutting forest     (man-days)'
   cc(c)    'input cost                 (tsh per ha)'
   yc(c)    'crop yields                 (kg per ha)'
   pc(c)    'crop prices                (tsh per kg)'
   cr(c)    'crop revenues              (tsh per ha)'
   delt(t)  'discount factor'
   delta(a) 'discount factor for tree age';

dmaize   = fdmaize*nfam;
wr       = tob*wrc + dwr*nfam;
delt(t)  = (1+rho)**(-ord(t));
delta(a) = (1+rho)**(-ord(a));
vr(t)    = tr*sr*sum(a$(ord(t) + ord(a) > card(t)), yv(a)*delta(a));
dist(i)  = sr - width/2 + width*ord(i);
fa(i)    = 100*3.1416*dist(i)*width;
labor(m) = nfam*(sfam*wdm - ld("other",m));
labw(i)  = yw*labwc*whd/(whd - 2*dist(i)/ws);
cc(c)    = tmd("input-cost",c);
yc(c)    = tmd("yield",c);
pc(c)    = tmd("price",c);
cr(c)    = yc(c)*pc(c);

display dmaize, wr, delt, delta, vr, fa, yv, dist, labor, labw, pc, yc, cc, cr;

$sTitle Model Definition
Variable
   w(t,i)   'cutting of existing forest              (ha)'
   v(t)     'management of planted timber            (ha)'
   x(t,c)   'cropping activity                       (ha)'
   mat(t)   'maize after tobacco                     (ha)'
   lc(t,m)  'labor for wood cutting            (man-days)'
   rev(t)   'revenue                           (1000 tsh)'
   cost(t)  'annual cost                       (1000 tsh)'
   income   'discounted income      (discounted 1000 tsh)';

Positive Variable w, v, x, mat, lc;

Equation
   wb(t)    'wood balance                            (m3)'
   wa(i)    'wood availability                       (ha)'
   lb(t,m)  'labor balance                     (man-days)'
   lw(t)    'labor constraint for wood cutting (man-days)'
   matd1(t) 'maize after tobacco: type 1             (ha)'
   matd2(t) 'maize after tobacco: type 2             (ha)'
   mm(t)    'minimum maize demand                    (kg)'
   ttb(t)   'post terminal timber bounds             (m3)'
   rd(t)    'revenue definition                (1000 tsh)'
   cd(t)    'cost definition                   (1000 tsh)'
   od       'objective definition   (discounted 1000 tsh)';

wb(t)..      yw*sum(i, w(t,i)) + sum(a, yv(a)*v(t-ord(a))) =g= wrc*x(t,"tobacco") + dwr*nfam;

wa(i)..      sum(t, w(t,i)) =l= fa(i);

lb(t,m)..    ld("timber-1",m)*v(t)  + ld("timber-2",m)*v(t-1)
           + sum(c, ld(c,m)*x(t,c)) + lc(t,m)$mc(m) =l= labor(m);

lw(t)..      sum(mc, lc(t,mc)) =e=   sum(i, labw(i)*w(t,i))
                                   + sum(a, labvc*yv(a)*v(t-ord(a)));

mm(t)..      yc("maize")*(x(t,"maize") + matr*mat(t)) =g= dmaize;

ttb(t)..     sum(a , yv(a)*v(t+(card(t) - ord(a))) )  =l= wr;

matd1(t-1).. mat(t)  =l= x(t-1,"tobacco");

matd2(t)..   mat(t)  =l= x(t,"maize");

rd(t)..      rev(t)  =e= (sum(c, cr(c)*x(t,c)) + matr*cr("maize")*mat(t))/1000;

cd(t)..      cost(t) =e=  (sum(c, cc(c)*x(t,c)) + tc*v(t) + resw*whd*sum(mc, lc(t,mc))
                         + sum(i, tr*yw*dist(i)*w(t,i)))/1000;

od..         income  =e=   sum(t, delt(t)*(rev(t) - cost(t) + vr(t)*v(t)/1000) );

mat.up("y01") = tob;

Model tabora / all /;

* This problem is poorly scaled and the shadow prices are so small to
* be indistinguishable from zero in the last few periods. Automatic scaling
* was required when using apex4. The following option statement was needed.
* option scale = on;
solve tabora maximizing income using lp;

Parameter rep1 'summary report';

rep1(t,"income") = rev.l(t) - cost.l(t);
rep1(t,"timber") = v.l(t);
rep1(t,c)        = x.l(t,c);
rep1(t,"forest") = sum(i, w.l(t,i));
rep1(t,"distance")$rep1(t,"forest") = sum(i, dist(i)*w.l(t,i))/rep1(t,"forest");

display rep1;