Last active
July 3, 2016 14:34
-
-
Save stefanthaler/605d90bc1d4584a6092672c234dd6850 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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