Skip to content

Instantly share code, notes, and snippets.

@stefanthaler
Last active July 3, 2016 14:34
Show Gist options
  • Save stefanthaler/605d90bc1d4584a6092672c234dd6850 to your computer and use it in GitHub Desktop.
Save stefanthaler/605d90bc1d4584a6092672c234dd6850 to your computer and use it in GitHub Desktop.
# sudo pip install pulp
# sudo apt-get install python-glpk gplk-utils
from pulp import *
optimization_problem = LpProblem("Nutrients Optimization", LpMinimize)
# Cost Parameters for Selecting a food
# diversity (minimum amount of certain foods)
# diversity (minimum amount of vegetables)
# multiple cost factors (money, co2, water)
# preferences
# fair trade
# Foods / 100g
foods = {
"Spinache100g" : {"diary":0, "vegetable":100, "price_in_c": 37, "carb_in_g": 15, "protein_in_g":3, "fat_in_g":0, "min_amount": 0 , "preference":0.9},
"Mozzarella100g" : {"diary":100, "vegetable":0, "price_in_c": 39, "carb_in_g": 1, "protein_in_g":12, "fat_in_g":4, "min_amount": 0, "preference":0.8},
"Kidneybeans100g" : {"diary":0,"vegetable":100, "price_in_c": 54, "carb_in_g": 36, "protein_in_g":22, "fat_in_g":0, "min_amount": 0, "preference":0.5},
"Knaeckebrot100g" : {"diary":0, "vegetable":0, "price_in_c": 43, "carb_in_g": 61, "protein_in_g":10, "fat_in_g":8, "min_amount": 0, "preference":0.4}
}
lp_vars = [LpVariable(name, data["min_amount"], None, LpContinuous) for name, data in foods.iteritems()]
"""
Cost Function
price * preference
"""
#TODO normalize price / preference
def cost_function(lp_var):
# cost per 100g * preference
price = foods[lp_var.name]["price_in_c"]
preference = (1 - foods[lp_var.name]["preference"])
return lp_var * ( price * preference )
optimization_problem += lpSum([ cost_function(lp_var) for lp_var in lp_vars] )
"""
Nutritient Constraints
"""
def add_constraint(problem, constraint_name, minimum=None, maximum=None):
if minimum:
problem += lpSum([lp_var*foods[lp_var.name][constraint_name] for lp_var in lp_vars]) >= minimum
if maximum:
problem += lpSum([lp_var*foods[lp_var.name][constraint_name] for lp_var in lp_vars]) <= maximum
return problem
optimization_problem = add_constraint( optimization_problem , "carb_in_g", 200, 275) # carbs (250g)
optimization_problem = add_constraint( optimization_problem , "protein_in_g", 50, 110) # protein (100g)
optimization_problem = add_constraint( optimization_problem , "fat_in_g", 50, 67) # fat (67)
"""
Diversity Constraints
"""
optimization_problem = add_constraint( optimization_problem , "vegetable", 300) # minimum 300g vegetables a day
optimization_problem = add_constraint( optimization_problem , "diary", 200) # minimum 200g diary a day
"""
Solve Linear Programming Problem
"""
# The problem data is written to an .lp file
optimization_problem.writeLP("Nutritiens.lp")
optimization_problem.solve()
print("Status:", LpStatus[optimization_problem.status])
# Solution 4.4067797
for v in optimization_problem.variables():
print v.name, "=", v.varValue
print "objective=", value(optimization_problem.objective)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment