84 lines
3.0 KiB
Python
84 lines
3.0 KiB
Python
"""
|
|
The Full Whiskas Model Python Formulation for the PuLP Modeller
|
|
|
|
Authors: Antony Phillips, Dr Stuart Mitchell 2007
|
|
"""
|
|
|
|
# Import PuLP modeler functions
|
|
from pulp import *
|
|
|
|
# Creates a list of the Ingredients
|
|
Ingredients = ['CHICKEN', 'BEEF', 'MUTTON', 'RICE', 'WHEAT', 'GEL']
|
|
|
|
# A dictionary of the costs of each of the Ingredients is created
|
|
costs = {'CHICKEN': 0.013,
|
|
'BEEF': 0.008,
|
|
'MUTTON': 0.010,
|
|
'RICE': 0.002,
|
|
'WHEAT': 0.005,
|
|
'GEL': 0.001}
|
|
|
|
# A dictionary of the protein percent in each of the Ingredients is created
|
|
proteinPercent = {'CHICKEN': 0.100,
|
|
'BEEF': 0.200,
|
|
'MUTTON': 0.150,
|
|
'RICE': 0.000,
|
|
'WHEAT': 0.040,
|
|
'GEL': 0.000}
|
|
|
|
# A dictionary of the fat percent in each of the Ingredients is created
|
|
fatPercent = {'CHICKEN': 0.080,
|
|
'BEEF': 0.100,
|
|
'MUTTON': 0.110,
|
|
'RICE': 0.010,
|
|
'WHEAT': 0.010,
|
|
'GEL': 0.000}
|
|
|
|
# A dictionary of the fibre percent in each of the Ingredients is created
|
|
fibrePercent = {'CHICKEN': 0.001,
|
|
'BEEF': 0.005,
|
|
'MUTTON': 0.003,
|
|
'RICE': 0.100,
|
|
'WHEAT': 0.150,
|
|
'GEL': 0.000}
|
|
|
|
# A dictionary of the salt percent in each of the Ingredients is created
|
|
saltPercent = {'CHICKEN': 0.002,
|
|
'BEEF': 0.005,
|
|
'MUTTON': 0.007,
|
|
'RICE': 0.002,
|
|
'WHEAT': 0.008,
|
|
'GEL': 0.000}
|
|
|
|
# Create the 'prob' variable to contain the problem data
|
|
prob = LpProblem("The Whiskas Problem", LpMinimize)
|
|
|
|
# A dictionary called 'ingredient_vars' is created to contain the referenced Variables
|
|
ingredient_vars = LpVariable.dicts("Ingr",Ingredients,0)
|
|
|
|
# The objective function is added to 'prob' first
|
|
prob += lpSum([costs[i]*ingredient_vars[i] for i in Ingredients]), "Total Cost of Ingredients per can"
|
|
|
|
# The five constraints are added to 'prob'
|
|
prob += lpSum([ingredient_vars[i] for i in Ingredients]) == 100, "PercentagesSum"
|
|
prob += lpSum([proteinPercent[i] * ingredient_vars[i] for i in Ingredients]) >= 8.0, "ProteinRequirement"
|
|
prob += lpSum([fatPercent[i] * ingredient_vars[i] for i in Ingredients]) >= 6.0, "FatRequirement"
|
|
prob += lpSum([fibrePercent[i] * ingredient_vars[i] for i in Ingredients]) <= 2.0, "FibreRequirement"
|
|
prob += lpSum([saltPercent[i] * ingredient_vars[i] for i in Ingredients]) <= 0.4, "SaltRequirement"
|
|
|
|
# The problem data is written to an .lp file
|
|
prob.writeLP("WhiskasModel2.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 Ingredients per can = ", value(prob.objective))
|