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.
		
		
		
		
		
			
		
			
				
					
					
						
							127 lines
						
					
					
						
							3.3 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							127 lines
						
					
					
						
							3.3 KiB
						
					
					
				| /* Food Manufacture 1, section 12.1 in | |
|  * Williams, "Model Building in Mathematical Programming" | |
|  * | |
|  * Sebastian Nowozin <nowozin@gmail.com> | |
|  */ | |
| 
 | |
| set oils; | |
| set month; | |
| 
 | |
| /* Buying prices of the raw oils in the next six month. */ | |
| param buyingprices{month,oils}; | |
| 
 | |
| /* Actual amount bought in each month. */ | |
| var buys{month,oils} >= 0; | |
| 
 | |
| /* Stock for each oil. */ | |
| var stock{month,oils} >= 0; | |
| 
 | |
| /* Price of the produced product */ | |
| param productprice >= 0; | |
| param storagecost; | |
| 
 | |
| param oilhardness{oils} >= 0; | |
| 
 | |
| /* Actual amount of output oil produced in each month */ | |
| var production{m in month} >= 0; | |
| var useoil{m in month, o in oils} >= 0; | |
| 
 | |
| maximize totalprofit: | |
|     sum{m in month} productprice*production[m] | |
|     - sum{m in month, o in oils} buyingprices[m,o]*buys[m,o] | |
|     - sum{m in month, o in oils} storagecost*stock[m,o]; | |
| 
 | |
| /* Constraints */ | |
| 
 | |
| /* 1. Starting stock */ | |
| s.t. startstock{o in oils}: | |
|     stock[1,o] = 500; | |
| s.t. endstock{o in oils}: | |
|     stock[6,o] + buys[6,o] - useoil[6,o] >= 500; | |
| 
 | |
| /* 2. Stock constraints */ | |
| s.t. stocklimit{m in month, o in oils}: | |
|     stock[m,o] <= 1000; | |
| 
 | |
| s.t. production1{m in month, o in oils}: | |
|     useoil[m,o] <= stock[m,o] + buys[m,o]; | |
| s.t. production2{m1 in month, m2 in month, o in oils : m2 = m1+1}: | |
|     stock[m2,o] = stock[m1,o] + buys[m1,o] - useoil[m1,o]; | |
| 
 | |
| s.t. production3a{m in month}: | |
|     sum{o in oils} oilhardness[o]*useoil[m,o] >= 3*production[m]; | |
| s.t. production3b{m in month}: | |
|     sum{o in oils} oilhardness[o]*useoil[m,o] <= 6*production[m]; | |
| 
 | |
| s.t. production4{m in month}: | |
|     production[m] = sum{o in oils} useoil[m,o]; | |
| 
 | |
| /* 3. Refining constraints */ | |
| s.t. refine1{m in month}: | |
|     useoil[m,"VEG1"]+useoil[m,"VEG2"] <= 200; | |
| s.t. refine2{m in month}: | |
|     useoil[m,"OIL1"]+useoil[m,"OIL2"]+useoil[m,"OIL3"] <= 250; | |
| 
 | |
| solve; | |
| 
 | |
| for {m in month} { | |
|     printf "Month %d\n", m; | |
|     printf "PRODUCE %4.2f tons, hardness %4.2f\n", production[m], | |
|         (sum{o in oils} oilhardness[o]*useoil[m,o]) / (sum{o in oils} useoil[m,o]); | |
| 
 | |
|     printf "\tVEG1\tVEG2\tOIL1\tOIL2\tOIL3\n"; | |
|     printf "STOCK"; | |
|     printf "%d", m; | |
|     for {o in oils} { | |
|         printf "\t%4.2f", stock[m,o]; | |
|     } | |
|     printf "\nBUY"; | |
|     for {o in oils} { | |
|         printf "\t%4.2f", buys[m,o]; | |
|     } | |
|     printf "\nUSE"; | |
|     printf "%d", m; | |
|     for {o in oils} { | |
|         printf "\t%4.2f", useoil[m,o]; | |
|     } | |
|     printf "\n"; | |
|     printf "\n"; | |
| } | |
| printf "Total profit: %4.2f\n", | |
|     (sum{m in month} productprice*production[m] | |
|     - sum{m in month, o in oils} buyingprices[m,o]*buys[m,o] | |
|     - sum{m in month, o in oils} storagecost*stock[m,o]); | |
| printf "      turnover: %4.2f\n", | |
|     sum{m in month} productprice*production[m]; | |
| printf "      buying costs: %4.2f\n", | |
|     sum{m in month, o in oils} buyingprices[m,o]*buys[m,o]; | |
| printf "      storage costs: %4.2f\n", | |
|     sum{m in month, o in oils} storagecost*stock[m,o]; | |
| 
 | |
| 
 | |
| data; | |
| 
 | |
| param : oils : oilhardness := | |
|     VEG1    8.8 | |
|     VEG2    6.1 | |
|     OIL1    2.0 | |
|     OIL2    4.2 | |
|     OIL3    5.0 ; | |
| 
 | |
| set month := 1 2 3 4 5 6; | |
| 
 | |
| param buyingprices | |
| 
 | |
| :           VEG1    VEG2    OIL1    OIL2    OIL3    := | |
| 
 | |
| 1           110     120     130     110     115 | |
| 2           130     130     110     90      115 | |
| 3           110     140     130     100     95 | |
| 4           120     110     120     120     125 | |
| 5           100     120     150     110     105 | |
| 6           90      100     140     80      135 ; | |
| 
 | |
| param productprice := 150; | |
| param storagecost := 5; | |
| 
 | |
| end;
 |