You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							519 lines
						
					
					
						
							18 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							519 lines
						
					
					
						
							18 KiB
						
					
					
				| # EGYPT, a static model of fertilizer production | |
| # | |
| # References: | |
| # Robert Fourer, David M. Gay and Brian W. Kernighan, "A Modeling Language | |
| # for Mathematical Programming." Management Science 36 (1990) 519-554. | |
| 
 | |
| ###  SETS  ### | |
| 
 | |
| set center;                # Locations from which final product may be shipped | |
| set port within center;    # Locations at which imports can be received | |
| set plant within center;   # Locations of plants | |
| 
 | |
| set region;                # Demand regions | |
| 
 | |
| set unit;                  # Productive units | |
| set proc;                  # Processes | |
| 
 | |
| set nutr;                  # Nutrients | |
| 
 | |
| set c_final;               # Final products (fertilizers) | |
| set c_inter;               # Intermediate products | |
| set c_ship within c_inter; # Intermediates for shipment | |
| set c_raw;                 # Domestic raw materials and miscellaneous inputs | |
| 
 | |
| set commod := c_final union c_inter union c_raw; | |
| 
 | |
|                            # All commodities | |
| 
 | |
| ###  PARAMETERS  ### | |
| 
 | |
| param cf75 {region,c_final} >= 0; | |
| 
 | |
|                            # Consumption of fertilizer 1974-75 (1000 tpy) | |
| 
 | |
| param fn {c_final,nutr} >= 0; | |
| 
 | |
|                            # Nutrient content of fertilizers | |
| 
 | |
| param cn75 {r in region, n in nutr} := sum {c in c_final} cf75[r,c] * fn[c,n]; | |
| 
 | |
|                            # Consumption of nutrients 1974-75 (1000 tpy) | |
| 
 | |
| param road {region,center} >= 0; | |
| 
 | |
|                            # Road distances | |
| 
 | |
| param rail_half {plant,plant} >= 0; | |
| param rail {p1 in plant, p2 in plant} := | |
|     if rail_half[p1,p2] > 0 then rail_half[p1,p2] else rail_half[p2,p1]; | |
| 
 | |
|                            # Interplant rail distances (kms) | |
| 
 | |
| param impd_barg {plant} >= 0; | |
| param impd_road {plant} >= 0; | |
| 
 | |
|                            # Import distances (kms) by barge and road | |
| 
 | |
| param tran_final {pl in plant, r in region} := | |
|               if road[r,pl] > 0 then .5 + .0144 * road[r,pl] else 0; | |
| 
 | |
| param tran_import {r in region, po in port} := | |
|               if road[r,po] > 0 then .5 + .0144 * road[r,po] else 0; | |
| 
 | |
| param tran_inter {p1 in plant, p2 in plant} := | |
|               if rail[p1,p2] > 0 then 3.5 + .03 * rail[p1,p2] else 0; | |
| 
 | |
| param tran_raw {pl in plant} := | |
|             (if impd_barg[pl] > 0 then 1.0 + .0030 * impd_barg[pl] else 0) | |
|           + (if impd_road[pl] > 0 then 0.5 + .0144 * impd_road[pl] else 0); | |
| 
 | |
|                            # Transport cost (le per ton) for: | |
|                            #   final products, imported final products, | |
|                            #   interplant shipment, imported raw materials | |
| 
 | |
| param io {commod,proc};    # Input-output coefficients | |
| 
 | |
| param util {unit,proc} >= 0; | |
| 
 | |
|                            # Capacity utilization coefficients | |
| 
 | |
| param p_imp {commod} >= 0; # Import Price (cif US$ per ton 1975) | |
| 
 | |
| param p_r {c_raw} >= 0; | |
| param p_pr {plant,c_raw} >= 0; | |
| 
 | |
| param p_dom {pl in plant, c in c_raw} := | |
|               if p_r[c] > 0 then p_r[c] else p_pr[pl,c]; | |
| 
 | |
|                            # Domestic raw material prices | |
| 
 | |
| param dcap {plant,unit} >= 0; | |
| 
 | |
|                            # Design capacity of plants (t/day) | |
| 
 | |
| param icap {u in unit, pl in plant} := 0.33 * dcap[pl,u]; | |
| 
 | |
|                            # Initial capacity of plants (t/day) | |
| 
 | |
| param exch := 0.4;         # Exchange rate | |
| 
 | |
| param util_pct := 0.85;    # Utilization percent for initial capacity | |
| 
 | |
| ###  DERIVED SETS OF "POSSIBILITIES"  ### | |
| 
 | |
| set m_pos {pl in plant} := {u in unit: icap[u,pl] > 0}; | |
| 
 | |
|                            # At each plant, set of units for which there is | |
|                            # initial capacity | |
| 
 | |
| set p_cap {pl in plant} := | |
|              {pr in proc: forall {u in unit: util[u,pr] > 0} u in m_pos[pl] }; | |
| 
 | |
|                            # At each plant, set of processes for which | |
|                            # all necessary units have some initial capacity | |
| 
 | |
| set p_except {plant} within proc; | |
| 
 | |
|                            # At each plant, list of processes that are | |
|                            # arbitrarily ruled out | |
| 
 | |
| set p_pos {pl in plant} := p_cap[pl] diff p_except[pl]; | |
| 
 | |
|                            # At each plant, set of possible processes | |
| 
 | |
| set cp_pos {c in commod} := {pl in plant: sum {pr in p_pos[pl]} io[c,pr] > 0}; | |
| 
 | |
| set cc_pos {c in commod} := {pl in plant: sum {pr in p_pos[pl]} io[c,pr] < 0}; | |
| 
 | |
| set c_pos {c in commod} := cp_pos[c] union cc_pos[c]; | |
| 
 | |
|                            # For each commodity, set of plants that can | |
|                            # produce it (cp_pos) or consume it (cc_pos), | |
|                            # and their union (c_pos) | |
| 
 | |
| ###  VARIABLES  ### | |
| 
 | |
| var Z {pl in plant, p_pos[pl]} >= 0; | |
| 
 | |
|                            # Z[pl,pr] is level of process pr at plant pl | |
| 
 | |
| var Xf {c in c_final, cp_pos[c], region} >= 0; | |
| 
 | |
|                            # Xf[c,pl,r] is amount of final product c | |
|                            # shipped from plant pl to region r | |
| 
 | |
| var Xi {c in c_ship, cp_pos[c], cc_pos[c]} >= 0; | |
| 
 | |
|                            # Xi[c,p1,p2] is amount of intermediate c | |
|                            # shipped from plant p1 to plant p2 | |
| 
 | |
| var Vf {c_final,region,port} >= 0; | |
| 
 | |
|                            # Vf[c,r,po] is amount of final product c | |
|                            # imported by region r from port po | |
| 
 | |
| var Vr {c in c_raw, cc_pos[c]} >= 0; | |
| 
 | |
|                            # Vr[c,pl] is amount of raw material c | |
|                            # imported for use at plant pl | |
| 
 | |
| var U {c in c_raw, cc_pos[c]} >= 0; | |
| 
 | |
|                            # U[c,pl] is amount of raw material c | |
|                            # purchased domestically for use at plant pl | |
| 
 | |
| var Psip;                  # Domestic recurrent cost | |
| var Psil;                  # Transport cost | |
| var Psii;                  # Import cost | |
| 
 | |
| ###  OBJECTIVE  ### | |
| 
 | |
| minimize Psi:  Psip + Psil + Psii; | |
| 
 | |
| ###  CONSTRAINTS  ### | |
| 
 | |
| subject to mbd {n in nutr, r in region}: | |
| 
 | |
|     sum {c in c_final} fn[c,n] * | |
|                 (sum {po in port} Vf[c,r,po] + | |
|                  sum {pl in cp_pos[c]} Xf[c,pl,r])  >=  cn75[r,n]; | |
| 
 | |
|                            # Total nutrients supplied to a region by all | |
|                            # final products (sum of imports plus internal | |
|                            # shipments from plants) must meet requirements | |
| 
 | |
| subject to mbdb {c in c_final, r in region: cf75[r,c] > 0}: | |
| 
 | |
|     sum {po in port} Vf[c,r,po] + | |
|     sum {pl in cp_pos[c]} Xf[c,pl,r]  >=  cf75[r,c]; | |
| 
 | |
|                            # Total of each final product supplied to each | |
|                            # region (as in previous constraint) must meet | |
|                            # requirements | |
| 
 | |
| subject to mb {c in commod, pl in plant}: | |
| 
 | |
|     sum {pr in p_pos[pl]} io[c,pr] * Z[pl,pr] | |
| 
 | |
|    + ( if c in c_ship then | |
|                 ( if pl in cp_pos[c] then sum {p2 in cc_pos[c]} Xi[c,pl,p2] ) | |
|               - ( if pl in cc_pos[c] then sum {p2 in cp_pos[c]} Xi[c,p2,pl] )) | |
| 
 | |
|    + ( if (c in c_raw and pl in cc_pos[c]) then | |
|                  (( if p_imp[c] > 0 then Vr[c,pl] ) | |
|                 + ( if p_dom[pl,c] > 0 then U[c,pl] ))) | |
| 
 | |
|   >= if (c in c_final and pl in cp_pos[c]) then sum {r in region} Xf[c,pl,r]; | |
| 
 | |
|                            # For each commodity at each plant:  sum of | |
|                            #   (1) production or consumption at plant, | |
|                            #   (2) inter-plant shipments in or out, | |
|                            #   (3) import and domestic purchases (raw only) | |
|                            # is >= 0 for raw materials and intermediates; | |
|                            # is >= the total shipped for final products | |
| 
 | |
| subject to cc {pl in plant, u in m_pos[pl]}: | |
| 
 | |
|     sum {pr in p_pos[pl]} util[u,pr] * Z[pl,pr]  <=  util_pct * icap[u,pl]; | |
| 
 | |
|                            # For each productive unit at each plant, | |
|                            # total utilization by all processes | |
|                            # may not exceed the unit's capacity | |
| 
 | |
| subject to ap: | |
| 
 | |
|     Psip  =  sum {c in c_raw, pl in cc_pos[c]} p_dom[pl,c] * U[c,pl]; | |
| 
 | |
|                            # Psip is the cost of domestic raw materials, | |
|                            # summed over all plants that consume them | |
| 
 | |
| subject to al: | |
| 
 | |
|     Psil  =  sum {c in c_final} ( | |
| 
 | |
|                sum {pl in cp_pos[c], r in region} | |
|                                               tran_final[pl,r] * Xf[c,pl,r] | |
| 
 | |
|              + sum {po in port, r in region} tran_import[r,po] * Vf[c,r,po] ) | |
| 
 | |
|            + sum {c in c_ship, p1 in cp_pos[c], p2 in cc_pos[c]} | |
|                                                tran_inter[p1,p2] * Xi[c,p1,p2] | |
| 
 | |
|            + sum {c in c_raw, pl in cc_pos[c]: p_imp[c] > 0} | |
|                                                     tran_raw[pl] * Vr[c,pl]; | |
| 
 | |
|                            # Total transport cost is sum of shipping costs for | |
|                            #   (1) all final products from all plants, | |
|                            #   (2) all imports of final products, | |
|                            #   (3) all intermediates shipped between plants, | |
|                            #   (4) all imports of raw materials | |
| 
 | |
| subject to ai: | |
| 
 | |
|     Psii / exch  =  sum {c in c_final, r in region, po in port} | |
|                                                       p_imp[c] * Vf[c,r,po] | |
| 
 | |
|                   + sum {c in c_raw, pl in cc_pos[c]} p_imp[c] * Vr[c,pl]; | |
| 
 | |
|                            # Total import cost -- at exchange rate -- | |
|                            # is sum of import costs for final products | |
|                            # in each region and raw materials at each plant | |
| 
 | |
| ###  DATA  ### | |
| 
 | |
| data; | |
| 
 | |
| set center := ASWAN HELWAN ASSIOUT KAFR_EL_ZT ABU_ZAABAL ABU_KIR TALKHA SUEZ ; | |
| 
 | |
| set port := ABU_KIR ; | |
| 
 | |
| set plant := ASWAN HELWAN ASSIOUT KAFR_EL_ZT ABU_ZAABAL ; | |
| 
 | |
| set region := ALEXANDRIA BEHERA GHARBIA KAFR_EL_SH DAKAHLIA DAMIETTA | |
|               SHARKIA ISMAILIA SUEZ MENOUFIA KALUBIA GIZA BENI_SUEF FAYOUM | |
|               MINIA ASSIOUT NEW_VALLEY SOHAG QUENA ASWAN ; | |
| 
 | |
| set unit := SULF_A_S SULF_A_P NITR_ACID AMM_ELEC AMM_C_GAS C_AMM_NITR | |
|             AMM_SULF SSP ; | |
| 
 | |
| set proc := SULF_A_S SULF_A_P NITR_ACID AMM_ELEC AMM_C_GAS CAN_310 CAN_335 | |
|             AMM_SULF SSP_155 ; | |
| 
 | |
| set nutr := N P205 ; | |
| 
 | |
| set c_final := UREA CAN_260 CAN_310 CAN_335 AMM_SULF DAP SSP_155 C_250_55 | |
|                C_300_100 ; | |
| 
 | |
| set c_inter := AMMONIA NITR_ACID SULF_ACID ; | |
| 
 | |
| set c_ship := AMMONIA SULF_ACID ; | |
| 
 | |
| set c_raw := EL_ASWAN COKE_GAS PHOS_ROCK LIMESTONE EL_SULFUR PYRITES | |
|              ELECTRIC BF_GAS WATER STEAM BAGS ; | |
| 
 | |
| set p_except[ASWAN] := CAN_335 ; | |
| set p_except[HELWAN] := CAN_310 ; | |
| set p_except[ASSIOUT] := ; | |
| set p_except[KAFR_EL_ZT] := ; | |
| set p_except[ABU_ZAABAL] := ; | |
| 
 | |
| param cf75  default 0.0  : | |
| 
 | |
|                CAN_260    CAN_310    CAN_335    AMM_SULF     UREA   := | |
| 
 | |
| ALEXANDRIA        .           .         5.0        3.0        1.0 | |
| ASSIOUT          1.0        20.0       26.0        1.0       27.0 | |
| ASWAN             .         40.0         .          .          . | |
| BEHERA           1.0          .        25.0       90.0       35.0 | |
| BENI_SUEF        1.0          .        15.0        1.0       20.0 | |
| DAKAHLIA         1.0          .        26.0       60.0       20.0 | |
| DAMIETTA          .           .         2.0       15.0        8.0 | |
| FAYOUM           1.0          .        20.0        6.0       20.0 | |
| GHARBIA           .           .        17.0       60.0       28.0 | |
| GIZA              .           .        40.0        6.0        2.0 | |
| ISMAILIA          .           .         4.0        6.0        2.0 | |
| KAFR_EL_SH       1.0          .        10.0       45.0       22.0 | |
| KALUBIA           .           .        25.0       16.0        7.0 | |
| MENOUFIA         1.0          .        24.0       21.0       30.0 | |
| MINIA            2.0        15.0       35.0        1.0       41.0 | |
| NEW_VALLEY        .           .          .          .         1.0 | |
| QUENA             .         95.0        2.0         .         3.0 | |
| SHARKIA          1.0          .        31.0       50.0       28.0 | |
| SOHAG             .         65.0        3.0         .         7.0 | |
| SUEZ              .           .         1.0         .          . | |
| 
 | |
|    :          SSP_155    C_250_55   C_300_100    DAP   := | |
| 
 | |
| ALEXANDRIA       8.0         .          .         . | |
| ASSIOUT         35.0        5.0         .1        . | |
| ASWAN            8.0         .          .         . | |
| BEHERA          64.0        1.0         .1        .1 | |
| BENI_SUEF       13.0        3.0         .         . | |
| DAKAHLIA        52.0        1.0         .         . | |
| DAMIETTA         5.0         .          .         . | |
| FAYOUM          17.0        1.0         .         . | |
| GHARBIA         57.0        1.0         .2        .1 | |
| GIZA            14.0        1.0         .1        . | |
| ISMAILIA         4.0         .          .         . | |
| KAFR_EL_SH      25.0        2.0         .1        . | |
| KALUBIA         22.0        1.0         .         .1 | |
| MENOUFIA        33.0        2.0         .1        .1 | |
| MINIA           50.0        3.0         .2        .1 | |
| NEW_VALLEY       1.0         .          .         . | |
| QUENA            8.0         .          .         . | |
| SHARKIA         43.0        1.0         .1        . | |
| SOHAG           20.0        1.0         .         . | |
| SUEZ             1.0         .          .         .        ; | |
| 
 | |
| param fn  default 0.0 :      N     P205    := | |
| 
 | |
|             AMM_SULF       .206     . | |
|             CAN_260        .26      . | |
|             CAN_310        .31      . | |
|             CAN_335        .335     . | |
|             C_250_55       .25      .055 | |
|             C_300_100      .30      .10 | |
|             DAP            .18      .46 | |
|             SSP_155        .        .15 | |
|             UREA           .46      .      ; | |
| 
 | |
| param road  default 0.0  : | |
| 
 | |
|             ABU_KIR ABU_ZAABAL ASSIOUT ASWAN HELWAN KAFR_EL_ZT SUEZ TALKHA := | |
| 
 | |
| ALEXANDRIA      16     210       607    1135   244      119     362   187 | |
| ASSIOUT        616     420         .     518   362      504     527   518 | |
| ASWAN         1134     938       518       .   880     1022    1045  1036 | |
| BEHERA          76      50       547    1065   184       42     288   120 | |
| BENI_SUEF      359     163       257     775   105      248     270   261 | |
| DAKAHLIA       208     138       515    1033   152       58     219     3 | |
| DAMIETTA       267     216       596    1114   233      131     286    66 | |
| FAYOUM         341     145       308     826    88      230     252   243 | |
| GHARBIA        150      65       485    1003   122       20     226    55 | |
| GIZA           287      48       372     890    .9      133     169   146 | |
| ISMAILIA       365     142       536    1054   173      241      89   146 | |
| KAFR_EL_SH     145     105       525    1043   162       20     266    35 | |
| KALUBIA        190      97       439     957    76       66     180    81 | |
| MENOUFIA       157     154       472     990   109       33     213    90 | |
| MINIA          384     288       132     650   230      372     394   386 | |
| NEW_VALLEY     815     619       199     519   561      703     726   717 | |
| QUENA          858     662       242     276   604      746     769   760 | |
| SHARKIA        240      60       473     991   110       78     214    58 | |
| SOHAG          715     519        99     419   461      603     626   617 | |
| SUEZ           370     224       541    1059   178      246       .   298  ; | |
| 
 | |
| param rail_half  default 0  : | |
| 
 | |
|               KAFR_EL_ZT   ABU_ZAABAL    HELWAN     ASSIOUT   := | |
| 
 | |
| ABU_ZAABAL         85            .           .          . | |
| HELWAN            142           57           .          . | |
| ASSIOUT           504          420         362          . | |
| ASWAN            1022          938         880        518     ; | |
| 
 | |
| param :            impd_barg   impd_road := | |
| 
 | |
| ABU_ZAABAL            210          .1 | |
| ASSIOUT               583         0 | |
| ASWAN                1087        10 | |
| HELWAN                183         0 | |
| KAFR_EL_ZT            104         6 ; | |
| 
 | |
| param io  default 0.0  := | |
| 
 | |
|    [*,AMM_C_GAS]  AMMONIA        1.0 | |
|                   BF_GAS      -609. | |
|                   COKE_GAS      -2.0 | |
|                   ELECTRIC   -1960. | |
|                   STEAM         -4. | |
|                   WATER       -700. | |
| 
 | |
|    [*,AMM_ELEC]   AMMONIA        1.0 | |
|                   EL_ASWAN     -12.0 | |
| 
 | |
|    [*,AMM_SULF]   AMMONIA        -.26 | |
|                   AMM_SULF       1.0 | |
|                   BAGS         -22. | |
|                   ELECTRIC     -19. | |
|                   SULF_ACID      -.76 | |
|                   WATER        -17. | |
| 
 | |
|    [*,CAN_310]    AMMONIA        -.20 | |
|                   BAGS         -23. | |
|                   CAN_310        1.0 | |
|                   LIMESTONE      -.12 | |
|                   NITR_ACID      -.71 | |
|                   STEAM          -.4 | |
|                   WATER        -49. | |
| 
 | |
|    [*,CAN_335]    AMMONIA        -.21 | |
|                   BAGS         -23. | |
|                   CAN_335        1.0 | |
|                   LIMESTONE      -.04 | |
|                   NITR_ACID      -.76 | |
|                   STEAM          -.4 | |
|                   WATER        -49. | |
| 
 | |
|    [*,NITR_ACID]  AMMONIA        -.292 | |
|                   ELECTRIC    -231. | |
|                   NITR_ACID      1.0 | |
|                   WATER          -.6 | |
| 
 | |
|    [*,SSP_155]    BAGS         -22. | |
|                   ELECTRIC     -14. | |
|                   PHOS_ROCK      -.62 | |
|                   SSP_155        1.0 | |
|                   SULF_ACID      -.41 | |
|                   WATER         -6. | |
| 
 | |
|    [*,SULF_A_P]   ELECTRIC     -75. | |
|                   PYRITES        -.826 | |
|                   SULF_ACID      1.0 | |
|                   WATER        -60. | |
| 
 | |
|    [*,SULF_A_S]   ELECTRIC     -50. | |
|                   EL_SULFUR      -.334 | |
|                   SULF_ACID      1.0 | |
|                   WATER        -20. ; | |
| 
 | |
| param util  default 0  := | |
| 
 | |
|    [*,*]   SULF_A_S SULF_A_S    1      SULF_A_P SULF_A_P   1 | |
|            NITR_ACID NITR_ACID  1      AMM_ELEC AMM_ELEC   1 | |
|            AMM_C_GAS AMM_C_GAS  1      SSP SSP_155         1 | |
|            C_AMM_NITR CAN_310   1      C_AMM_NITR CAN_335  1 | |
|            AMM_SULF AMM_SULF    1 ; | |
| 
 | |
| param p_imp  default 0.0  := | |
| 
 | |
|      PYRITES       17.5           AMM_SULF      75. | |
|      EL_SULFUR     55.            DAP          175. | |
|      UREA         150.            SSP_155       80. | |
|      CAN_260       75.            C_250_55     100. | |
|      CAN_310       90.            C_300_100    130. | |
|      CAN_335      100.   ; | |
| 
 | |
| param p_r  default 0.0  := | |
| 
 | |
|      ELECTRIC     .007 | |
|      BF_GAS       .007 | |
|      WATER        .031 | |
|      STEAM       1.25 | |
|      BAGS         .28   ; | |
| 
 | |
| param p_pr  default 0.0  := | |
| 
 | |
|  [HELWAN,COKE_GAS]              16.0 | |
|  [ASWAN,EL_ASWAN]                1.0 | |
| 
 | |
|  [*,LIMESTONE]      ASWAN        1.2 | |
|                     HELWAN       1.2 | |
| 
 | |
|  [*,PHOS_ROCK]      ABU_ZAABAL   4.0 | |
|                     ASSIOUT      3.5 | |
|                     KAFR_EL_ZT   5.0   ; | |
| 
 | |
| param dcap  default 0.0  := | |
| 
 | |
|    [ABU_ZAABAL,*]   SSP          600 | |
|                     SULF_A_P     227 | |
|                     SULF_A_S     242 | |
| 
 | |
|    [ASSIOUT,*]      SSP          600 | |
|                     SULF_A_S     250 | |
| 
 | |
|    [ASWAN,*]        AMM_ELEC     450 | |
|                     C_AMM_NITR  1100 | |
|                     NITR_ACID    800 | |
| 
 | |
|    [HELWAN,*]       AMM_C_GAS    172 | |
|                     AMM_SULF      24 | |
|                     C_AMM_NITR   364 | |
|                     NITR_ACID    282 | |
| 
 | |
|    [KAFR_EL_ZT,*]   SSP          600 | |
|                     SULF_A_P      50 | |
|                     SULF_A_S     200  ; | |
| 
 | |
| end;
 |