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