examples/egypt.mod
changeset 1 c445c931472f
equal deleted inserted replaced
-1:000000000000 0:f76080bb8e8a
       
     1 # EGYPT, a static model of fertilizer production
       
     2 #
       
     3 # References:
       
     4 # Robert Fourer, David M. Gay and Brian W. Kernighan, "A Modeling Language
       
     5 # for Mathematical Programming." Management Science 36 (1990) 519-554.
       
     6 
       
     7 ###  SETS  ###
       
     8 
       
     9 set center;                # Locations from which final product may be shipped
       
    10 set port within center;    # Locations at which imports can be received
       
    11 set plant within center;   # Locations of plants
       
    12 
       
    13 set region;                # Demand regions
       
    14 
       
    15 set unit;                  # Productive units
       
    16 set proc;                  # Processes
       
    17 
       
    18 set nutr;                  # Nutrients
       
    19 
       
    20 set c_final;               # Final products (fertilizers)
       
    21 set c_inter;               # Intermediate products
       
    22 set c_ship within c_inter; # Intermediates for shipment
       
    23 set c_raw;                 # Domestic raw materials and miscellaneous inputs
       
    24 
       
    25 set commod := c_final union c_inter union c_raw;
       
    26 
       
    27                            # All commodities
       
    28 
       
    29 ###  PARAMETERS  ###
       
    30 
       
    31 param cf75 {region,c_final} >= 0;
       
    32 
       
    33                            # Consumption of fertilizer 1974-75 (1000 tpy)
       
    34 
       
    35 param fn {c_final,nutr} >= 0;
       
    36 
       
    37                            # Nutrient content of fertilizers
       
    38 
       
    39 param cn75 {r in region, n in nutr} := sum {c in c_final} cf75[r,c] * fn[c,n];
       
    40 
       
    41                            # Consumption of nutrients 1974-75 (1000 tpy)
       
    42 
       
    43 param road {region,center} >= 0;
       
    44 
       
    45                            # Road distances
       
    46 
       
    47 param rail_half {plant,plant} >= 0;
       
    48 param rail {p1 in plant, p2 in plant} :=
       
    49     if rail_half[p1,p2] > 0 then rail_half[p1,p2] else rail_half[p2,p1];
       
    50 
       
    51                            # Interplant rail distances (kms)
       
    52 
       
    53 param impd_barg {plant} >= 0;
       
    54 param impd_road {plant} >= 0;
       
    55 
       
    56                            # Import distances (kms) by barge and road
       
    57 
       
    58 param tran_final {pl in plant, r in region} :=
       
    59               if road[r,pl] > 0 then .5 + .0144 * road[r,pl] else 0;
       
    60 
       
    61 param tran_import {r in region, po in port} :=
       
    62               if road[r,po] > 0 then .5 + .0144 * road[r,po] else 0;
       
    63 
       
    64 param tran_inter {p1 in plant, p2 in plant} :=
       
    65               if rail[p1,p2] > 0 then 3.5 + .03 * rail[p1,p2] else 0;
       
    66 
       
    67 param tran_raw {pl in plant} :=
       
    68             (if impd_barg[pl] > 0 then 1.0 + .0030 * impd_barg[pl] else 0)
       
    69           + (if impd_road[pl] > 0 then 0.5 + .0144 * impd_road[pl] else 0);
       
    70 
       
    71                            # Transport cost (le per ton) for:
       
    72                            #   final products, imported final products,
       
    73                            #   interplant shipment, imported raw materials
       
    74 
       
    75 param io {commod,proc};    # Input-output coefficients
       
    76 
       
    77 param util {unit,proc} >= 0;
       
    78 
       
    79                            # Capacity utilization coefficients
       
    80 
       
    81 param p_imp {commod} >= 0; # Import Price (cif US$ per ton 1975)
       
    82 
       
    83 param p_r {c_raw} >= 0;
       
    84 param p_pr {plant,c_raw} >= 0;
       
    85 
       
    86 param p_dom {pl in plant, c in c_raw} :=
       
    87               if p_r[c] > 0 then p_r[c] else p_pr[pl,c];
       
    88 
       
    89                            # Domestic raw material prices
       
    90 
       
    91 param dcap {plant,unit} >= 0;
       
    92 
       
    93                            # Design capacity of plants (t/day)
       
    94 
       
    95 param icap {u in unit, pl in plant} := 0.33 * dcap[pl,u];
       
    96 
       
    97                            # Initial capacity of plants (t/day)
       
    98 
       
    99 param exch := 0.4;         # Exchange rate
       
   100 
       
   101 param util_pct := 0.85;    # Utilization percent for initial capacity
       
   102 
       
   103 ###  DERIVED SETS OF "POSSIBILITIES"  ###
       
   104 
       
   105 set m_pos {pl in plant} := {u in unit: icap[u,pl] > 0};
       
   106 
       
   107                            # At each plant, set of units for which there is
       
   108                            # initial capacity
       
   109 
       
   110 set p_cap {pl in plant} :=
       
   111              {pr in proc: forall {u in unit: util[u,pr] > 0} u in m_pos[pl] };
       
   112 
       
   113                            # At each plant, set of processes for which
       
   114                            # all necessary units have some initial capacity
       
   115 
       
   116 set p_except {plant} within proc;
       
   117 
       
   118                            # At each plant, list of processes that are
       
   119                            # arbitrarily ruled out
       
   120 
       
   121 set p_pos {pl in plant} := p_cap[pl] diff p_except[pl];
       
   122 
       
   123                            # At each plant, set of possible processes
       
   124 
       
   125 set cp_pos {c in commod} := {pl in plant: sum {pr in p_pos[pl]} io[c,pr] > 0};
       
   126 
       
   127 set cc_pos {c in commod} := {pl in plant: sum {pr in p_pos[pl]} io[c,pr] < 0};
       
   128 
       
   129 set c_pos {c in commod} := cp_pos[c] union cc_pos[c];
       
   130 
       
   131                            # For each commodity, set of plants that can
       
   132                            # produce it (cp_pos) or consume it (cc_pos),
       
   133                            # and their union (c_pos)
       
   134 
       
   135 ###  VARIABLES  ###
       
   136 
       
   137 var Z {pl in plant, p_pos[pl]} >= 0;
       
   138 
       
   139                            # Z[pl,pr] is level of process pr at plant pl
       
   140 
       
   141 var Xf {c in c_final, cp_pos[c], region} >= 0;
       
   142 
       
   143                            # Xf[c,pl,r] is amount of final product c
       
   144                            # shipped from plant pl to region r
       
   145 
       
   146 var Xi {c in c_ship, cp_pos[c], cc_pos[c]} >= 0;
       
   147 
       
   148                            # Xi[c,p1,p2] is amount of intermediate c
       
   149                            # shipped from plant p1 to plant p2
       
   150 
       
   151 var Vf {c_final,region,port} >= 0;
       
   152 
       
   153                            # Vf[c,r,po] is amount of final product c
       
   154                            # imported by region r from port po
       
   155 
       
   156 var Vr {c in c_raw, cc_pos[c]} >= 0;
       
   157 
       
   158                            # Vr[c,pl] is amount of raw material c
       
   159                            # imported for use at plant pl
       
   160 
       
   161 var U {c in c_raw, cc_pos[c]} >= 0;
       
   162 
       
   163                            # U[c,pl] is amount of raw material c
       
   164                            # purchased domestically for use at plant pl
       
   165 
       
   166 var Psip;                  # Domestic recurrent cost
       
   167 var Psil;                  # Transport cost
       
   168 var Psii;                  # Import cost
       
   169 
       
   170 ###  OBJECTIVE  ###
       
   171 
       
   172 minimize Psi:  Psip + Psil + Psii;
       
   173 
       
   174 ###  CONSTRAINTS  ###
       
   175 
       
   176 subject to mbd {n in nutr, r in region}:
       
   177 
       
   178     sum {c in c_final} fn[c,n] *
       
   179                 (sum {po in port} Vf[c,r,po] +
       
   180                  sum {pl in cp_pos[c]} Xf[c,pl,r])  >=  cn75[r,n];
       
   181 
       
   182                            # Total nutrients supplied to a region by all
       
   183                            # final products (sum of imports plus internal
       
   184                            # shipments from plants) must meet requirements
       
   185 
       
   186 subject to mbdb {c in c_final, r in region: cf75[r,c] > 0}:
       
   187 
       
   188     sum {po in port} Vf[c,r,po] +
       
   189     sum {pl in cp_pos[c]} Xf[c,pl,r]  >=  cf75[r,c];
       
   190 
       
   191                            # Total of each final product supplied to each
       
   192                            # region (as in previous constraint) must meet
       
   193                            # requirements
       
   194 
       
   195 subject to mb {c in commod, pl in plant}:
       
   196 
       
   197     sum {pr in p_pos[pl]} io[c,pr] * Z[pl,pr]
       
   198 
       
   199    + ( if c in c_ship then
       
   200                 ( if pl in cp_pos[c] then sum {p2 in cc_pos[c]} Xi[c,pl,p2] )
       
   201               - ( if pl in cc_pos[c] then sum {p2 in cp_pos[c]} Xi[c,p2,pl] ))
       
   202 
       
   203    + ( if (c in c_raw and pl in cc_pos[c]) then
       
   204                  (( if p_imp[c] > 0 then Vr[c,pl] )
       
   205                 + ( if p_dom[pl,c] > 0 then U[c,pl] )))
       
   206 
       
   207   >= if (c in c_final and pl in cp_pos[c]) then sum {r in region} Xf[c,pl,r];
       
   208 
       
   209                            # For each commodity at each plant:  sum of
       
   210                            #   (1) production or consumption at plant,
       
   211                            #   (2) inter-plant shipments in or out,
       
   212                            #   (3) import and domestic purchases (raw only)
       
   213                            # is >= 0 for raw materials and intermediates;
       
   214                            # is >= the total shipped for final products
       
   215 
       
   216 subject to cc {pl in plant, u in m_pos[pl]}:
       
   217 
       
   218     sum {pr in p_pos[pl]} util[u,pr] * Z[pl,pr]  <=  util_pct * icap[u,pl];
       
   219 
       
   220                            # For each productive unit at each plant,
       
   221                            # total utilization by all processes
       
   222                            # may not exceed the unit's capacity
       
   223 
       
   224 subject to ap:
       
   225 
       
   226     Psip  =  sum {c in c_raw, pl in cc_pos[c]} p_dom[pl,c] * U[c,pl];
       
   227 
       
   228                            # Psip is the cost of domestic raw materials,
       
   229                            # summed over all plants that consume them
       
   230 
       
   231 subject to al:
       
   232 
       
   233     Psil  =  sum {c in c_final} (
       
   234 
       
   235                sum {pl in cp_pos[c], r in region}
       
   236                                               tran_final[pl,r] * Xf[c,pl,r]
       
   237 
       
   238              + sum {po in port, r in region} tran_import[r,po] * Vf[c,r,po] )
       
   239 
       
   240            + sum {c in c_ship, p1 in cp_pos[c], p2 in cc_pos[c]}
       
   241                                                tran_inter[p1,p2] * Xi[c,p1,p2]
       
   242 
       
   243            + sum {c in c_raw, pl in cc_pos[c]: p_imp[c] > 0}
       
   244                                                     tran_raw[pl] * Vr[c,pl];
       
   245 
       
   246                            # Total transport cost is sum of shipping costs for
       
   247                            #   (1) all final products from all plants,
       
   248                            #   (2) all imports of final products,
       
   249                            #   (3) all intermediates shipped between plants,
       
   250                            #   (4) all imports of raw materials
       
   251 
       
   252 subject to ai:
       
   253 
       
   254     Psii / exch  =  sum {c in c_final, r in region, po in port}
       
   255                                                       p_imp[c] * Vf[c,r,po]
       
   256 
       
   257                   + sum {c in c_raw, pl in cc_pos[c]} p_imp[c] * Vr[c,pl];
       
   258 
       
   259                            # Total import cost -- at exchange rate --
       
   260                            # is sum of import costs for final products
       
   261                            # in each region and raw materials at each plant
       
   262 
       
   263 ###  DATA  ###
       
   264 
       
   265 data;
       
   266 
       
   267 set center := ASWAN HELWAN ASSIOUT KAFR_EL_ZT ABU_ZAABAL ABU_KIR TALKHA SUEZ ;
       
   268 
       
   269 set port := ABU_KIR ;
       
   270 
       
   271 set plant := ASWAN HELWAN ASSIOUT KAFR_EL_ZT ABU_ZAABAL ;
       
   272 
       
   273 set region := ALEXANDRIA BEHERA GHARBIA KAFR_EL_SH DAKAHLIA DAMIETTA
       
   274               SHARKIA ISMAILIA SUEZ MENOUFIA KALUBIA GIZA BENI_SUEF FAYOUM
       
   275               MINIA ASSIOUT NEW_VALLEY SOHAG QUENA ASWAN ;
       
   276 
       
   277 set unit := SULF_A_S SULF_A_P NITR_ACID AMM_ELEC AMM_C_GAS C_AMM_NITR
       
   278             AMM_SULF SSP ;
       
   279 
       
   280 set proc := SULF_A_S SULF_A_P NITR_ACID AMM_ELEC AMM_C_GAS CAN_310 CAN_335
       
   281             AMM_SULF SSP_155 ;
       
   282 
       
   283 set nutr := N P205 ;
       
   284 
       
   285 set c_final := UREA CAN_260 CAN_310 CAN_335 AMM_SULF DAP SSP_155 C_250_55
       
   286                C_300_100 ;
       
   287 
       
   288 set c_inter := AMMONIA NITR_ACID SULF_ACID ;
       
   289 
       
   290 set c_ship := AMMONIA SULF_ACID ;
       
   291 
       
   292 set c_raw := EL_ASWAN COKE_GAS PHOS_ROCK LIMESTONE EL_SULFUR PYRITES
       
   293              ELECTRIC BF_GAS WATER STEAM BAGS ;
       
   294 
       
   295 set p_except[ASWAN] := CAN_335 ;
       
   296 set p_except[HELWAN] := CAN_310 ;
       
   297 set p_except[ASSIOUT] := ;
       
   298 set p_except[KAFR_EL_ZT] := ;
       
   299 set p_except[ABU_ZAABAL] := ;
       
   300 
       
   301 param cf75  default 0.0  :
       
   302 
       
   303                CAN_260    CAN_310    CAN_335    AMM_SULF     UREA   :=
       
   304 
       
   305 ALEXANDRIA        .           .         5.0        3.0        1.0
       
   306 ASSIOUT          1.0        20.0       26.0        1.0       27.0
       
   307 ASWAN             .         40.0         .          .          .
       
   308 BEHERA           1.0          .        25.0       90.0       35.0
       
   309 BENI_SUEF        1.0          .        15.0        1.0       20.0
       
   310 DAKAHLIA         1.0          .        26.0       60.0       20.0
       
   311 DAMIETTA          .           .         2.0       15.0        8.0
       
   312 FAYOUM           1.0          .        20.0        6.0       20.0
       
   313 GHARBIA           .           .        17.0       60.0       28.0
       
   314 GIZA              .           .        40.0        6.0        2.0
       
   315 ISMAILIA          .           .         4.0        6.0        2.0
       
   316 KAFR_EL_SH       1.0          .        10.0       45.0       22.0
       
   317 KALUBIA           .           .        25.0       16.0        7.0
       
   318 MENOUFIA         1.0          .        24.0       21.0       30.0
       
   319 MINIA            2.0        15.0       35.0        1.0       41.0
       
   320 NEW_VALLEY        .           .          .          .         1.0
       
   321 QUENA             .         95.0        2.0         .         3.0
       
   322 SHARKIA          1.0          .        31.0       50.0       28.0
       
   323 SOHAG             .         65.0        3.0         .         7.0
       
   324 SUEZ              .           .         1.0         .          .
       
   325 
       
   326    :          SSP_155    C_250_55   C_300_100    DAP   :=
       
   327 
       
   328 ALEXANDRIA       8.0         .          .         .
       
   329 ASSIOUT         35.0        5.0         .1        .
       
   330 ASWAN            8.0         .          .         .
       
   331 BEHERA          64.0        1.0         .1        .1
       
   332 BENI_SUEF       13.0        3.0         .         .
       
   333 DAKAHLIA        52.0        1.0         .         .
       
   334 DAMIETTA         5.0         .          .         .
       
   335 FAYOUM          17.0        1.0         .         .
       
   336 GHARBIA         57.0        1.0         .2        .1
       
   337 GIZA            14.0        1.0         .1        .
       
   338 ISMAILIA         4.0         .          .         .
       
   339 KAFR_EL_SH      25.0        2.0         .1        .
       
   340 KALUBIA         22.0        1.0         .         .1
       
   341 MENOUFIA        33.0        2.0         .1        .1
       
   342 MINIA           50.0        3.0         .2        .1
       
   343 NEW_VALLEY       1.0         .          .         .
       
   344 QUENA            8.0         .          .         .
       
   345 SHARKIA         43.0        1.0         .1        .
       
   346 SOHAG           20.0        1.0         .         .
       
   347 SUEZ             1.0         .          .         .        ;
       
   348 
       
   349 param fn  default 0.0 :      N     P205    :=
       
   350 
       
   351             AMM_SULF       .206     .
       
   352             CAN_260        .26      .
       
   353             CAN_310        .31      .
       
   354             CAN_335        .335     .
       
   355             C_250_55       .25      .055
       
   356             C_300_100      .30      .10
       
   357             DAP            .18      .46
       
   358             SSP_155        .        .15
       
   359             UREA           .46      .      ;
       
   360 
       
   361 param road  default 0.0  :
       
   362 
       
   363             ABU_KIR ABU_ZAABAL ASSIOUT ASWAN HELWAN KAFR_EL_ZT SUEZ TALKHA :=
       
   364 
       
   365 ALEXANDRIA      16     210       607    1135   244      119     362   187
       
   366 ASSIOUT        616     420         .     518   362      504     527   518
       
   367 ASWAN         1134     938       518       .   880     1022    1045  1036
       
   368 BEHERA          76      50       547    1065   184       42     288   120
       
   369 BENI_SUEF      359     163       257     775   105      248     270   261
       
   370 DAKAHLIA       208     138       515    1033   152       58     219     3
       
   371 DAMIETTA       267     216       596    1114   233      131     286    66
       
   372 FAYOUM         341     145       308     826    88      230     252   243
       
   373 GHARBIA        150      65       485    1003   122       20     226    55
       
   374 GIZA           287      48       372     890    .9      133     169   146
       
   375 ISMAILIA       365     142       536    1054   173      241      89   146
       
   376 KAFR_EL_SH     145     105       525    1043   162       20     266    35
       
   377 KALUBIA        190      97       439     957    76       66     180    81
       
   378 MENOUFIA       157     154       472     990   109       33     213    90
       
   379 MINIA          384     288       132     650   230      372     394   386
       
   380 NEW_VALLEY     815     619       199     519   561      703     726   717
       
   381 QUENA          858     662       242     276   604      746     769   760
       
   382 SHARKIA        240      60       473     991   110       78     214    58
       
   383 SOHAG          715     519        99     419   461      603     626   617
       
   384 SUEZ           370     224       541    1059   178      246       .   298  ;
       
   385 
       
   386 param rail_half  default 0  :
       
   387 
       
   388               KAFR_EL_ZT   ABU_ZAABAL    HELWAN     ASSIOUT   :=
       
   389 
       
   390 ABU_ZAABAL         85            .           .          .
       
   391 HELWAN            142           57           .          .
       
   392 ASSIOUT           504          420         362          .
       
   393 ASWAN            1022          938         880        518     ;
       
   394 
       
   395 param :            impd_barg   impd_road :=
       
   396 
       
   397 ABU_ZAABAL            210          .1
       
   398 ASSIOUT               583         0
       
   399 ASWAN                1087        10
       
   400 HELWAN                183         0
       
   401 KAFR_EL_ZT            104         6 ;
       
   402 
       
   403 param io  default 0.0  :=
       
   404 
       
   405    [*,AMM_C_GAS]  AMMONIA        1.0
       
   406                   BF_GAS      -609.
       
   407                   COKE_GAS      -2.0
       
   408                   ELECTRIC   -1960.
       
   409                   STEAM         -4.
       
   410                   WATER       -700.
       
   411 
       
   412    [*,AMM_ELEC]   AMMONIA        1.0
       
   413                   EL_ASWAN     -12.0
       
   414 
       
   415    [*,AMM_SULF]   AMMONIA        -.26
       
   416                   AMM_SULF       1.0
       
   417                   BAGS         -22.
       
   418                   ELECTRIC     -19.
       
   419                   SULF_ACID      -.76
       
   420                   WATER        -17.
       
   421 
       
   422    [*,CAN_310]    AMMONIA        -.20
       
   423                   BAGS         -23.
       
   424                   CAN_310        1.0
       
   425                   LIMESTONE      -.12
       
   426                   NITR_ACID      -.71
       
   427                   STEAM          -.4
       
   428                   WATER        -49.
       
   429 
       
   430    [*,CAN_335]    AMMONIA        -.21
       
   431                   BAGS         -23.
       
   432                   CAN_335        1.0
       
   433                   LIMESTONE      -.04
       
   434                   NITR_ACID      -.76
       
   435                   STEAM          -.4
       
   436                   WATER        -49.
       
   437 
       
   438    [*,NITR_ACID]  AMMONIA        -.292
       
   439                   ELECTRIC    -231.
       
   440                   NITR_ACID      1.0
       
   441                   WATER          -.6
       
   442 
       
   443    [*,SSP_155]    BAGS         -22.
       
   444                   ELECTRIC     -14.
       
   445                   PHOS_ROCK      -.62
       
   446                   SSP_155        1.0
       
   447                   SULF_ACID      -.41
       
   448                   WATER         -6.
       
   449 
       
   450    [*,SULF_A_P]   ELECTRIC     -75.
       
   451                   PYRITES        -.826
       
   452                   SULF_ACID      1.0
       
   453                   WATER        -60.
       
   454 
       
   455    [*,SULF_A_S]   ELECTRIC     -50.
       
   456                   EL_SULFUR      -.334
       
   457                   SULF_ACID      1.0
       
   458                   WATER        -20. ;
       
   459 
       
   460 param util  default 0  :=
       
   461 
       
   462    [*,*]   SULF_A_S SULF_A_S    1      SULF_A_P SULF_A_P   1
       
   463            NITR_ACID NITR_ACID  1      AMM_ELEC AMM_ELEC   1
       
   464            AMM_C_GAS AMM_C_GAS  1      SSP SSP_155         1
       
   465            C_AMM_NITR CAN_310   1      C_AMM_NITR CAN_335  1
       
   466            AMM_SULF AMM_SULF    1 ;
       
   467 
       
   468 param p_imp  default 0.0  :=
       
   469 
       
   470      PYRITES       17.5           AMM_SULF      75.
       
   471      EL_SULFUR     55.            DAP          175.
       
   472      UREA         150.            SSP_155       80.
       
   473      CAN_260       75.            C_250_55     100.
       
   474      CAN_310       90.            C_300_100    130.
       
   475      CAN_335      100.   ;
       
   476 
       
   477 param p_r  default 0.0  :=
       
   478 
       
   479      ELECTRIC     .007
       
   480      BF_GAS       .007
       
   481      WATER        .031
       
   482      STEAM       1.25
       
   483      BAGS         .28   ;
       
   484 
       
   485 param p_pr  default 0.0  :=
       
   486 
       
   487  [HELWAN,COKE_GAS]              16.0
       
   488  [ASWAN,EL_ASWAN]                1.0
       
   489 
       
   490  [*,LIMESTONE]      ASWAN        1.2
       
   491                     HELWAN       1.2
       
   492 
       
   493  [*,PHOS_ROCK]      ABU_ZAABAL   4.0
       
   494                     ASSIOUT      3.5
       
   495                     KAFR_EL_ZT   5.0   ;
       
   496 
       
   497 param dcap  default 0.0  :=
       
   498 
       
   499    [ABU_ZAABAL,*]   SSP          600
       
   500                     SULF_A_P     227
       
   501                     SULF_A_S     242
       
   502 
       
   503    [ASSIOUT,*]      SSP          600
       
   504                     SULF_A_S     250
       
   505 
       
   506    [ASWAN,*]        AMM_ELEC     450
       
   507                     C_AMM_NITR  1100
       
   508                     NITR_ACID    800
       
   509 
       
   510    [HELWAN,*]       AMM_C_GAS    172
       
   511                     AMM_SULF      24
       
   512                     C_AMM_NITR   364
       
   513                     NITR_ACID    282
       
   514 
       
   515    [KAFR_EL_ZT,*]   SSP          600
       
   516                     SULF_A_P      50
       
   517                     SULF_A_S     200  ;
       
   518 
       
   519 end;