msm.gms : Morocco Fertilizer Distribution - Mode Selection

Description

This model has been used to estimate the transport cost for different
types of fertilizer in Morocco. Only rail and road transport are considered
but mode switching is permitted. Three transport matrices are computed as
estimates for transport cost from (1) ports to bagging stations, (2) bagging
centers to market centers and (3) port to market centers.


Reference

  • Meeraus, A, and Smeers, Y, Transport Cost Estimates via Linear Programming. The World Bank, 1985.

Large Model of Type : LP


Category : GAMS Model library


Main file : msm.gms

$title Morocco Fertilizer Distribution - Mode Selection (MSM,SEQ=66)

$onText
This model has been used to estimate the transport cost for different
types of fertilizer in Morocco. Only rail and road transport are considered
but mode switching is permitted. Three transport matrices are computed as
estimates for transport cost from (1) ports to bagging stations, (2) bagging
centers to market centers and (3) port to market centers.


Meeraus, A, and Smeers, Y, Transport Cost Estimates via Linear Programming.
The World Bank, 1985.

Keywords: linear programming, scenario analysis, fertilizer industry, micro economics
          distribution problem, transportation problem
$offText

Set
   n 'nodes for rail and road network'
     / agadir    , afrour    , aknoul    , al-hoceima, azilal    , azrou
       ben-slim  , benguerir , beni-melal, beni-oukil, berechid  , bourfa
       bougedra  , boulemane , casablanca, chaouen   , chichaoua , el-ayon
       el-jadida , el-kella  , er-rachida, essaouira , fes       , fes-e-bali
       figuig    , fqih-ben  , guercif   , ifrane    , jorf-las  , kasba-tdl
       kenitra   , ketama    , khemesset , khenifra  , khouribga , larache
       marrakech , mathar    , meknes    , midelt    , nador     , ouarzazate
       oued-metil, oued-zem  , ouezzane  , oujda     , qunara    , rabat
       romani    , safi      , selouane  , settat    , sid-benour, sidi-e-aid
       sidi-kacem, sidi-slim , sidi-smail, sou-e-arba, t-azial   , taline
       tanger    , taounate  , taza      , tetouan   , tiznit    , youssoufia /
   m         'modes' / rail, road /
   nm(n,m)   'node mode mapping'
   orig(n,n) 'origins';

Alias (n,np,npp), (m,mp);

Table arcs(n,np,m) 'rail and road distances (km)'
                             rail  road
   agadir.    chichaoua             198
   agadir.    essaouira             173
   agadir.    taline                130
   agadir.    tiznit                 78
   afrour.    azilal                 67
   afrour.    beni-melal             19
   afrour.    el-kella               91
   afrour.    fqih-ben               40
   aknoul.    t-azial                39
   aknoul.    taounate              120
   aknoul.    taza                   61
   al-hoceima.ketama                107
   al-hoceima.t-azial                65
   azilal.    marrakech             163
   azrou.     fes                    61
   azrou.     khenifra               82
   azrou.     meknes                 60
   azrou.     midelt                125
   ben-slim.  casablanca             55
   ben-slim.  rabat                  64
   ben-slim.  romani                 57
   benguerir. el-kella               57
   benguerir. marrakech        74    70
   benguerir. settat          104    96
   benguerir. youssoufia       59    60
   beni-melal.fqih-ben               42
   beni-melal.kasba-tdl              30
   beni-oukil.bourfa          287
   beni-oukil.el-ayon          64
   beni-oukil.oujda            16
   berechid.  casablanca       36    36
   berechid.  el-jadida             106
   berechid.  khouribga              78
   berechid.  settat                 30
   berechid.  sidi-e-aid       14    14
   bourfa.    er-rachida            250
   bourfa.    figuig                108
   bourfa.    mathar                185
   bougedra.  marrakech             131
   bougedra.  qunara                 97
   bougedra.  safi                   26
   bougedra.  sidi-smail             81
   boulemane. fes                   101
   boulemane. ifrane                 53
   boulemane. midelt                 86
   casablanca.el-jadida              98
   casablanca.jorf-las              110
   casablanca.rabat            89    91
   chaouen.   ketama                 80
   chaouen.   ouezzane               60
   chaouen.   tetouan                60
   chichaoua. essaouira             101
   chichaoua. marrakech              75
   el-ayon.   guercif                89
   el-ayon.   oued-metil             21
   el-ayon.   oujda            80    79
   el-ayon.   taza            164   164
   el-jadida. jorf-las         12    12
   el-jadida. safi                  142
   el-jadida. settat                137
   el-jadida. sidi-smail             50
   el-kella.  fqih-ben              102
   el-kella.  marrakech              84
   er-rachida.midelt                154
   er-rachida.ouarzazate            320
   essaouira. qunara                 24
   fes.       fes-e-bali             87
   fes.       ifrane                 61
   fes.       meknes           56    60
   fes.       ouezzane              134
   fes.       sidi-kacem             82
   fes.       taounate               81
   fes.       taza            100   120
   fes-e-bali.ouezzane               70
   fes-e-bali.taounate               56
   fqih-ben.  khouribga              48
   fqih-ben.  oued-zem               46
   guercif.   midelt                277
   guercif.   oued-metil             78
   guercif.   taza                   65
   ifrane.    meknes                 65
   jorf-las.  safi                  130
   jorf-las.  settat                135
   jorf-las.  sidi-smail             48
   kasba-tdl. khenifra               99
   kasba-tdl. midelt                191
   kasba-tdl. oued-zem               47
   kenitra.   khemesset              79
   kenitra.   rabat            40    41
   kenitra.   sidi-slim        60    62
   kenitra.   sou-e-arba             78
   ketama.    taounate               79
   khemesset. meknes                 46
   khemesset. rabat                  81
   khemesset. romani                 78
   khemesset. sidi-slim              59
   khenifra.  meknes                119
   khouribga. oued-zem         34    33
   khouribga. sidi-e-aid       89    83
   larache.   sou-e-arba             73
   larache.   tanger                 87
   marrakech. ouarzazate            178
   marrakech. sid-benour            137
   marrakech. taline                171
   mathar.    oujda                  83
   meknes.    ouezzane              104
   meknes.    sidi-kacem       55    46
   meknes.    sidi-slim              57
   nador.     selouane               11
   ouarzazate.taline                217
   oued-metil.selouane               65
   oued-zem.  romani                 91
   ouezzane.  sou-e-arba             53
   oujda.     selouane              129
   rabat.     romani                 81
   safi.      youssoufia       83    90
   selouane.  t-azial                80
   settat.    sidi-e-aid       16    16
   sid-benour.sidi-smail             28
   sidi-kacem.sidi-slim        25    22
   sidi-kacem.sou-e-arba       60    60
   sou-e-arba.tanger          140   160
   tanger.    tetouan                60;

Parameter darcs(n,np,m) 'directed arc length (km)';

darcs(n,np,m) = max(arcs(n,np,m),arcs(np,n,m));
nm(n,m)       = yes$sum(np, darcs(n,np,m) <> 0);
orig(n,n)     = yes;

display arcs, nm;

$sTitle Model and Parameter Definitions
Parameter
   mrate(m)      'mode rate by distance ($ per km per ton)'
   lrate(m)      'loading rate                 ($ per ton)'
   urate(m)      'unloading rate               ($ per ton)'
   srate(m,mp)   'mode switching cost          ($ per ton)';

Variable
   x(n,np,npp,m) 'flow on arcs'
   y(n,m)        'loading at source'
   z(n,np,m)     'unloading at destination'
   w(n,np,m,mp)  'switching of modes'
   phi           'total cost                   ($ per ton)'
   phil          'loading cost                 ($ per ton)'
   phiu          'unloading cost               ($ per ton)'
   phis          'switching cost               ($ per ton)'
   phim          'mode travel cost             ($ per ton)';

Positive Variable x, y, z, w;

Equation
   nb(n,np,m)    'node balance'
   db(n,np)      'destination balance'
   cd            'accounting: total cost       ($ per ton)'
   al            'accounting: loading cost     ($ per ton)'
   au            'accounting: unloading cost   ($ per ton)'
   as            'accounting: switching cost   ($ per ton)'
   am            'accounting: mode travel cost ($ per ton)';

Set
   s(n) 'source nodes - dynamic'
   d(n) 'destination nodes - dynamic';

s(n) = no;
d(n) = no;

nb(s,n,m)$nm(n,m).. sum(np$darcs(np,n,m), x(s,np,n,m))
                 +  sum(mp$nm(n,mp), w(s,n,m,mp)) + y(s,m)$orig(s,n)
                =g= sum(np$darcs(n,np,m), x(s,n,np,m)) + z(s,n,m)$d(n)
                 +  sum(mp$nm(n,mp), w(s,n,mp,m));

db(s,d).. sum(m$nm(d,m), z(s,d,m)) =g= 1;

al.. phil =e= sum((s,m)$nm(s,m), lrate(m)*y(s,m));

au.. phiu =e= sum((s,d,m)$nm(d,m), urate(m)*z(s,d,m));

as.. phis =e= sum((s,n,m,mp)$(nm(n,m)*nm(n,mp)), srate(m,mp)*w(s,n,m,mp));

am.. phim =e= sum((s,n,np,m), mrate(m)*darcs(n,np,m)*x(s,n,np,m));

cd.. phi  =e= phil + phiu + phis + phim;

Model msm  'morocco mode selection model' / all /;

$sTitle Submodel Selection and Rate Definitions
Set
   pp(n) 'plants and ports'
         / agadir, casablanca, jorf-las, kenitra, nador, safi, tanger       /
   bc(n) 'bagging centers'
         / agadir  , beni-melal, berechid , bougedra  , casablanca, el-ayon
           fes     , jorf-las  , kenitra  , marrakech , meknes    , nador
           oued-zem, safi      , sidi-slim, sou-e-arba, tanger    , taza    /
   mc(n) 'market centers'
         / agadir   , al-hoceima, azilal    , beni-melal
           ben-slim , boulemane , casablanca, chaouen
           el-jadida, el-kella  , er-rachida, essaouira
           fes      , figuig    , ifrane    , kenitra
           khemesset, khenifra  , khouribga , marrakech
           meknes   , nador     , ouarzazate, oujda
           rabat    , safi      , settat    , tanger
           taounate , taza      , tetouan   , tiznit     /;

option solveOpt = replace;

** ports-to-bagging centers **
s(n)          = pp(n);
d(n)          = bc(n);
lrate(m)      = .5;
urate(m)      = 0;
srate(m,mp)   = 5;
mrate("rail") = .029;
mrate("road") = .045;
srate(m,m)    = 0;

solve msm minimizing phi using lp;

Parameter pptobc(n,np) 'transport cost of bulk: ports to bagging center ($ per ton)';
pptobc(s,d) = db.m(s,d) + .50$orig(s,d);

** ports-to-markets **
s(n)          = pp(n);
d(n)          = mc(n);
lrate(m)      = 1;
urate(m)      = 1;
srate(m,mp)   = 1;
mrate("rail") = .035;
mrate("road") = .065;
srate(m,m)    = 0;

solve msm minimizing phi using lp;

Parameter pptomc(n,np) 'transport cost bagged: port to market ($ per ton)';
pptomc(s,d) = db.m(s,d) + 1.30$orig(s,d);

** bagging centers-to-demand points **
s(n)          = no;
d(n)          = mc(n);
lrate(m)      = 1;
urate(m)      = 1;
srate(m,mp)   = 1;
mrate("rail") = .035;
mrate("road") = .065;
srate(m,m)    = 0;

Parameter bctomc(n,np) 'transport cost bagged: bagging center to market ($ per ton)';

* The problem is broken up into three problems to fit into the cyber
* workspace. Not needed on other machines or professional verions.
* Also observe that bctomc is assigned after each solve because of
* the solOpt = replace.

s(bc) = yes$(ord(bc) <= 6);
solve msm minimizing phi using lp;

bctomc(s,d) = db.m(s,d) + 1.30$orig(s,d);
s(bc) = yes$(ord(bc) > 6 and ord(bc) <= 12);
solve msm minimizing phi using lp;

bctomc(s,d) = db.m(s,d) + 1.30$orig(s,d);
s(bc) = yes$(ord(bc) > 12);
solve msm minimizing phi using lp;

bctomc(s,d) = db.m(s,d) + 1.30$orig(s,d);

display pptobc, pptomc, bctomc;