Version:

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, agricultural production, energy economics, forestry,
fuelwood production
$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;
```