lemon-project-template-glpk
comparison deps/glpk/examples/egypt.mod @ 9:33de93886c88
Import GLPK 4.47
author | Alpar Juttner <alpar@cs.elte.hu> |
---|---|
date | Sun, 06 Nov 2011 20:59:10 +0100 |
parents | |
children |
comparison
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; |