72 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""
 | 
						|
The Beer Distribution Problem for the PuLP Modeller
 | 
						|
 | 
						|
Authors: Antony Phillips, Dr Stuart Mitchell  2007
 | 
						|
"""
 | 
						|
 | 
						|
# Import PuLP modeler functions
 | 
						|
from pulp import *
 | 
						|
 | 
						|
# Creates a list of all the supply nodes
 | 
						|
Warehouses = ["A", "B"]
 | 
						|
 | 
						|
# Creates a dictionary for the number of units of supply for each supply node
 | 
						|
supply = {"A": 1000,
 | 
						|
          "B": 4000}
 | 
						|
 | 
						|
# Creates a list of all demand nodes
 | 
						|
Bars = ["1", "2", "3", "4", "5"]
 | 
						|
 | 
						|
# Creates a dictionary for the number of units of demand for each demand node
 | 
						|
demand = {"1":500,
 | 
						|
          "2":900,
 | 
						|
          "3":1800,
 | 
						|
          "4":200,
 | 
						|
          "5":700,}
 | 
						|
 | 
						|
# Creates a list of costs of each transportation path
 | 
						|
costs = [   #Bars
 | 
						|
         #1 2 3 4 5
 | 
						|
         [2,4,5,2,1],#A   Warehouses
 | 
						|
         [3,1,3,2,3] #B
 | 
						|
         ]
 | 
						|
 | 
						|
# The cost data is made into a dictionary
 | 
						|
costs = makeDict([Warehouses,Bars],costs,0)
 | 
						|
 | 
						|
# Creates the 'prob' variable to contain the problem data
 | 
						|
prob = LpProblem("Beer Distribution Problem",LpMinimize)
 | 
						|
 | 
						|
# Creates a list of tuples containing all the possible routes for transport
 | 
						|
Routes = [(w,b) for w in Warehouses for b in Bars]
 | 
						|
 | 
						|
# A dictionary called 'Vars' is created to contain the referenced variables(the routes)
 | 
						|
vars = LpVariable.dicts("Route",(Warehouses,Bars),0,None,LpInteger)
 | 
						|
 | 
						|
# The objective function is added to 'prob' first
 | 
						|
prob += lpSum([vars[w][b]*costs[w][b] for (w,b) in Routes]), "Sum_of_Transporting_Costs"
 | 
						|
 | 
						|
# The supply maximum constraints are added to prob for each supply node (warehouse)
 | 
						|
for w in Warehouses:
 | 
						|
    prob += lpSum([vars[w][b] for b in Bars])<=supply[w], "Sum_of_Products_out_of_Warehouse_%s"%w
 | 
						|
 | 
						|
# The demand minimum constraints are added to prob for each demand node (bar)
 | 
						|
for b in Bars:
 | 
						|
    prob += lpSum([vars[w][b] for w in Warehouses])>=demand[b], "Sum_of_Products_into_Bar%s"%b
 | 
						|
                   
 | 
						|
# The problem data is written to an .lp file
 | 
						|
prob.writeLP("BeerDistributionProblem.lp")
 | 
						|
 | 
						|
# The problem is solved using PuLP's choice of Solver
 | 
						|
prob.solve()
 | 
						|
 | 
						|
# The status of the solution is printed to the screen
 | 
						|
print("Status:", LpStatus[prob.status])
 | 
						|
 | 
						|
# Each of the variables is printed with it's resolved optimum value
 | 
						|
for v in prob.variables():
 | 
						|
    print(v.name, "=", v.varValue)
 | 
						|
 | 
						|
# The optimised objective function value is printed to the screen    
 | 
						|
print("Total Cost of Transportation = ", value(prob.objective))
 |