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
$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;