Применение ограничения к одному из значений словаря в целлюлозе - PullRequest
0 голосов
/ 26 апреля 2019

Мне нужно применить ограничение на часть значения одного из моего словаря, я использовал Pulp для задачи оптимизации. У меня есть данные о продуктах питания, в которых есть информация о продуктах питания, а также информация о питании и стоимости одной порции.

Мой код работает нормально, давая мне порцию каждого блюда и минимизируя стоимость. Мне нужно применять фильтр для каждого количества продуктов питания, где n - это число, в котором должен потребляться конкретный продукт питания.

Ссылка на данные

from pulp import *
import pandas as pd
prob = LpProblem("Simple Diet Problem", LpMinimize)
df = pd.read_excel("diet - medium.xls", nrows=17)
food_items = list(df['Foods'])
costs = dict(zip(food_items, df['Price/Serving']))
calories = dict(zip(food_items, df['Calories']))
fat = dict(zip(food_items, df['Total_Fat (g)']))
carbs = dict(zip(food_items, df['Carbohydrates (g)']))
food_vars = LpVariable.dicts("Food", food_items, lowBound=0, cat='Continuous')

prob += lpSum([costs[i] * food_vars[i] for i in food_items])
prob += lpSum([calories[f] * food_vars[f] for f in food_items]) >= 800.0
prob += lpSum([calories[f] * food_vars[f] for f in food_items]) <= 1300.0

# Need to apply constraint for number of each items to be consumed

prob.solve()
print("Status:", LpStatus[prob.status])
for v in prob.variables():
    if v.varValue > 0:
        print(v.name, "=", v.varValue)
obj = value(prob.objective)
print("The total cost of this balanced diet is: ${}".format(round(obj, 2)))

1 Ответ

0 голосов
/ 27 апреля 2019

Если я правильно понимаю, вы спрашиваете, как добавить ограничения в цикл, а не один за другим.Если это так, общий подход выглядит следующим образом:

for f in food_items:
    prob += food_vars[f] <= max_qty[f]

, где max_qty[f] - максимально допустимое количество пищи f, как считывается из вашего CSV-файла.

...