Сумма переменных не соответствует задаче смешивания

Я пытаюсь воспроизвести этот пример этого смешивания, но с меньшим количеством переменных, эта часть работает нормально:

import pulp
from pulp import *

# Creates a list of the Ingredients
Ingredients = ['CHICKEN', 'BEEF', 'MUTTON', 'RICE']

# A dictionary of the costs of each of the Ingredients is created
costs = {'CHICKEN': 15, 
         'BEEF': 12, 
         'MUTTON': 17, 
         'RICE': 12
        }

# A dictionary of the protein percent in each of the Ingredients is created
proteinPercent = {'CHICKEN': 17, 
                  'BEEF': 2, 
                  'MUTTON': 16, 
                  'RICE': 8
                 }

# A dictionary of the fat percent in each of the Ingredients is created
fatPercent = {'CHICKEN': 10, 
              'BEEF': 14, 
              'MUTTON': 13, 
              'RICE': 16, 
              }

# 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  constraints are added to 'prob'
prob += lpSum([proteinPercent[i] * ingredient_vars[i] for i in Ingredients]) >= 15.5, "ProteinRequirement"
prob += lpSum([fatPercent[i] * ingredient_vars[i] for i in Ingredients]) >= 12.3, "FatRequirement"


prob.writeLP("WhiskasModel.lp")
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))

Он рассчитывает оптимальное количество необходимого каждого ингредиента:

Status: Optimal
Ingr_BEEF = 0.0
Ingr_CHICKEN = 0.77916667
Ingr_MUTTON = 0.0
Ingr_RICE = 0.28177083
Total Cost of Ingredients per can =  15.068750009999999

Но это не составляет 100%, когда я добавляю ограничение для этого в код:

prob += lpSum([ingredient_vars[i] for i in Ingredients]) == 100, "PercentagesSum"

Я получаю этот результат:

Status: Optimal
Ingr_BEEF = 100.0
Ingr_CHICKEN = 0.0
Ingr_MUTTON = 0.0
Ingr_RICE = 0.0
Total Cost of Ingredients per can =  1200.0

Что неверно, поскольку не удовлетворяет другим ограничениям.

ИЗМЕНИТЬ

Кажется, я неправильно интерпретировал это, я думал так: если я хочу произвести 3 единицы, сумма входов должна быть 3.

Я думаю, что тогда это так:

# The constraints are added to 'prob'
prob += lpSum([ingredient_vars[i] for i in Ingredients]) == 3, "PercentagesSum"
prob += lpSum(ingredient_vars["CHICKEN"]) <= 2, "CHICKEN"
prob += lpSum(ingredient_vars["BEEF"]) <= 1, "BEEF"
prob += lpSum(ingredient_vars["MUTTON"]) <= 1, "MUTTON"
prob += lpSum(ingredient_vars["RICE"]) <= 1, "RICE"

Где 2,1,1,1 — это доступное количество каждого сырья.


person Luis Ramon Ramirez Rodriguez    schedule 31.01.2019    source источник
comment
prob += lpSum([ingredient_vars[i] for i in Ingredients]) == 100 должно быть prob += lpSum([ingredient_vars[i] for i in Ingredients]) == 1.0   -  person jeremycg    schedule 31.01.2019
comment
Да, это было то, что я искал.   -  person Luis Ramon Ramirez Rodriguez    schedule 01.02.2019


Ответы (1)


Что неверно, поскольку не удовлетворяет другим ограничениям. [так в оригинале]

Какое ограничение нарушается? Если вы посмотрите, как вы определили ограничения, вы обнаружите, что все они выполняются.

prob += lpSum([proteinPercent[i] * ingredient_vars[i] for i in Ingredients]) >= 15.5, "ProteinRequirement"

Что, учитывая раствор 100 единиц говядины, означает, что у вас есть 2 * 100 = 200 единиц белка - намного больше необходимых 15,5.

prob += lpSum([fatPercent[i] * ingredient_vars[i] for i in Ingredients]) >= 12.3, "FatRequirement"

Что, учитывая раствор 100 единиц говядины, означает, что у вас есть 14 * 100 = 1400 единиц белка, что намного превышает требуемые 12,3.

Настоящая проблема в том, что я думаю, что вы немного перепутали единицы измерения. При умножении процентов нужно делить на 100.

person kabdulla    schedule 31.01.2019
comment
Я разделил его 2 ограничения на 100, сохранил == 100, PercentagesSum и нашел это: Статус: Оптимальный Ingr_BEEF = 0,0 Ingr_CHICKEN = 33,809524 Ingr_MUTTON = 55,714286 Ingr_RICE = 10,47619 Общая стоимость ингредиентов на банку = 1580,000002 Это нормально? - person harmonius cool; 08.01.2020