COIN-OR::LEMON - Graph Library

source: glpk-cmake/examples/egypt.mod @ 1:c445c931472f

Last change on this file since 1:c445c931472f was 1:c445c931472f, checked in by Alpar Juttner <alpar@…>, 13 years ago

Import glpk-4.45

  • Generated files and doc/notes are removed
File size: 18.4 KB
RevLine 
[1]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
9set center;                # Locations from which final product may be shipped
10set port within center;    # Locations at which imports can be received
11set plant within center;   # Locations of plants
12
13set region;                # Demand regions
14
15set unit;                  # Productive units
16set proc;                  # Processes
17
18set nutr;                  # Nutrients
19
20set c_final;               # Final products (fertilizers)
21set c_inter;               # Intermediate products
22set c_ship within c_inter; # Intermediates for shipment
23set c_raw;                 # Domestic raw materials and miscellaneous inputs
24
25set commod := c_final union c_inter union c_raw;
26
27                           # All commodities
28
29###  PARAMETERS  ###
30
31param cf75 {region,c_final} >= 0;
32
33                           # Consumption of fertilizer 1974-75 (1000 tpy)
34
35param fn {c_final,nutr} >= 0;
36
37                           # Nutrient content of fertilizers
38
39param 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
43param road {region,center} >= 0;
44
45                           # Road distances
46
47param rail_half {plant,plant} >= 0;
48param 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
53param impd_barg {plant} >= 0;
54param impd_road {plant} >= 0;
55
56                           # Import distances (kms) by barge and road
57
58param tran_final {pl in plant, r in region} :=
59              if road[r,pl] > 0 then .5 + .0144 * road[r,pl] else 0;
60
61param tran_import {r in region, po in port} :=
62              if road[r,po] > 0 then .5 + .0144 * road[r,po] else 0;
63
64param tran_inter {p1 in plant, p2 in plant} :=
65              if rail[p1,p2] > 0 then 3.5 + .03 * rail[p1,p2] else 0;
66
67param 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
75param io {commod,proc};    # Input-output coefficients
76
77param util {unit,proc} >= 0;
78
79                           # Capacity utilization coefficients
80
81param p_imp {commod} >= 0; # Import Price (cif US$ per ton 1975)
82
83param p_r {c_raw} >= 0;
84param p_pr {plant,c_raw} >= 0;
85
86param 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
91param dcap {plant,unit} >= 0;
92
93                           # Design capacity of plants (t/day)
94
95param icap {u in unit, pl in plant} := 0.33 * dcap[pl,u];
96
97                           # Initial capacity of plants (t/day)
98
99param exch := 0.4;         # Exchange rate
100
101param util_pct := 0.85;    # Utilization percent for initial capacity
102
103###  DERIVED SETS OF "POSSIBILITIES"  ###
104
105set 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
110set 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
116set p_except {plant} within proc;
117
118                           # At each plant, list of processes that are
119                           # arbitrarily ruled out
120
121set p_pos {pl in plant} := p_cap[pl] diff p_except[pl];
122
123                           # At each plant, set of possible processes
124
125set cp_pos {c in commod} := {pl in plant: sum {pr in p_pos[pl]} io[c,pr] > 0};
126
127set cc_pos {c in commod} := {pl in plant: sum {pr in p_pos[pl]} io[c,pr] < 0};
128
129set 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
137var Z {pl in plant, p_pos[pl]} >= 0;
138
139                           # Z[pl,pr] is level of process pr at plant pl
140
141var 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
146var 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
151var 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
156var 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
161var 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
166var Psip;                  # Domestic recurrent cost
167var Psil;                  # Transport cost
168var Psii;                  # Import cost
169
170###  OBJECTIVE  ###
171
172minimize Psi:  Psip + Psil + Psii;
173
174###  CONSTRAINTS  ###
175
176subject 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
186subject 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
195subject 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
216subject 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
224subject 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
231subject 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
252subject 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
265data;
266
267set center := ASWAN HELWAN ASSIOUT KAFR_EL_ZT ABU_ZAABAL ABU_KIR TALKHA SUEZ ;
268
269set port := ABU_KIR ;
270
271set plant := ASWAN HELWAN ASSIOUT KAFR_EL_ZT ABU_ZAABAL ;
272
273set 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
277set unit := SULF_A_S SULF_A_P NITR_ACID AMM_ELEC AMM_C_GAS C_AMM_NITR
278            AMM_SULF SSP ;
279
280set proc := SULF_A_S SULF_A_P NITR_ACID AMM_ELEC AMM_C_GAS CAN_310 CAN_335
281            AMM_SULF SSP_155 ;
282
283set nutr := N P205 ;
284
285set c_final := UREA CAN_260 CAN_310 CAN_335 AMM_SULF DAP SSP_155 C_250_55
286               C_300_100 ;
287
288set c_inter := AMMONIA NITR_ACID SULF_ACID ;
289
290set c_ship := AMMONIA SULF_ACID ;
291
292set c_raw := EL_ASWAN COKE_GAS PHOS_ROCK LIMESTONE EL_SULFUR PYRITES
293             ELECTRIC BF_GAS WATER STEAM BAGS ;
294
295set p_except[ASWAN] := CAN_335 ;
296set p_except[HELWAN] := CAN_310 ;
297set p_except[ASSIOUT] := ;
298set p_except[KAFR_EL_ZT] := ;
299set p_except[ABU_ZAABAL] := ;
300
301param cf75  default 0.0  :
302
303               CAN_260    CAN_310    CAN_335    AMM_SULF     UREA   :=
304
305ALEXANDRIA        .           .         5.0        3.0        1.0
306ASSIOUT          1.0        20.0       26.0        1.0       27.0
307ASWAN             .         40.0         .          .          .
308BEHERA           1.0          .        25.0       90.0       35.0
309BENI_SUEF        1.0          .        15.0        1.0       20.0
310DAKAHLIA         1.0          .        26.0       60.0       20.0
311DAMIETTA          .           .         2.0       15.0        8.0
312FAYOUM           1.0          .        20.0        6.0       20.0
313GHARBIA           .           .        17.0       60.0       28.0
314GIZA              .           .        40.0        6.0        2.0
315ISMAILIA          .           .         4.0        6.0        2.0
316KAFR_EL_SH       1.0          .        10.0       45.0       22.0
317KALUBIA           .           .        25.0       16.0        7.0
318MENOUFIA         1.0          .        24.0       21.0       30.0
319MINIA            2.0        15.0       35.0        1.0       41.0
320NEW_VALLEY        .           .          .          .         1.0
321QUENA             .         95.0        2.0         .         3.0
322SHARKIA          1.0          .        31.0       50.0       28.0
323SOHAG             .         65.0        3.0         .         7.0
324SUEZ              .           .         1.0         .          .
325
326   :          SSP_155    C_250_55   C_300_100    DAP   :=
327
328ALEXANDRIA       8.0         .          .         .
329ASSIOUT         35.0        5.0         .1        .
330ASWAN            8.0         .          .         .
331BEHERA          64.0        1.0         .1        .1
332BENI_SUEF       13.0        3.0         .         .
333DAKAHLIA        52.0        1.0         .         .
334DAMIETTA         5.0         .          .         .
335FAYOUM          17.0        1.0         .         .
336GHARBIA         57.0        1.0         .2        .1
337GIZA            14.0        1.0         .1        .
338ISMAILIA         4.0         .          .         .
339KAFR_EL_SH      25.0        2.0         .1        .
340KALUBIA         22.0        1.0         .         .1
341MENOUFIA        33.0        2.0         .1        .1
342MINIA           50.0        3.0         .2        .1
343NEW_VALLEY       1.0         .          .         .
344QUENA            8.0         .          .         .
345SHARKIA         43.0        1.0         .1        .
346SOHAG           20.0        1.0         .         .
347SUEZ             1.0         .          .         .        ;
348
349param 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
361param road  default 0.0  :
362
363            ABU_KIR ABU_ZAABAL ASSIOUT ASWAN HELWAN KAFR_EL_ZT SUEZ TALKHA :=
364
365ALEXANDRIA      16     210       607    1135   244      119     362   187
366ASSIOUT        616     420         .     518   362      504     527   518
367ASWAN         1134     938       518       .   880     1022    1045  1036
368BEHERA          76      50       547    1065   184       42     288   120
369BENI_SUEF      359     163       257     775   105      248     270   261
370DAKAHLIA       208     138       515    1033   152       58     219     3
371DAMIETTA       267     216       596    1114   233      131     286    66
372FAYOUM         341     145       308     826    88      230     252   243
373GHARBIA        150      65       485    1003   122       20     226    55
374GIZA           287      48       372     890    .9      133     169   146
375ISMAILIA       365     142       536    1054   173      241      89   146
376KAFR_EL_SH     145     105       525    1043   162       20     266    35
377KALUBIA        190      97       439     957    76       66     180    81
378MENOUFIA       157     154       472     990   109       33     213    90
379MINIA          384     288       132     650   230      372     394   386
380NEW_VALLEY     815     619       199     519   561      703     726   717
381QUENA          858     662       242     276   604      746     769   760
382SHARKIA        240      60       473     991   110       78     214    58
383SOHAG          715     519        99     419   461      603     626   617
384SUEZ           370     224       541    1059   178      246       .   298  ;
385
386param rail_half  default 0  :
387
388              KAFR_EL_ZT   ABU_ZAABAL    HELWAN     ASSIOUT   :=
389
390ABU_ZAABAL         85            .           .          .
391HELWAN            142           57           .          .
392ASSIOUT           504          420         362          .
393ASWAN            1022          938         880        518     ;
394
395param :            impd_barg   impd_road :=
396
397ABU_ZAABAL            210          .1
398ASSIOUT               583         0
399ASWAN                1087        10
400HELWAN                183         0
401KAFR_EL_ZT            104         6 ;
402
403param 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
460param 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
468param 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
477param p_r  default 0.0  :=
478
479     ELECTRIC     .007
480     BF_GAS       .007
481     WATER        .031
482     STEAM       1.25
483     BAGS         .28   ;
484
485param 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
497param 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
519end;
Note: See TracBrowser for help on using the repository browser.