【发布时间】:2019-01-31 23:20:32
【问题描述】:
我正在复制这个混合问题的例子: https://www.coin-or.org/PuLP/CaseStudies/a_blending_problem.html
有以下数据:
import pulp
from pulp import *
import pandas as pd
food = ["f1","f2","f3","f4"]
KG = [10,20,50,80]
Protein = [18,12,16,18]
Grass = [13,14,13,16]
price_per_kg = [15,11,10,12]
## protein,carbohydrates,kg
df = pd.DataFrame({"tkid":food,"KG":KG,"Protein":Protein,"Grass":Grass,"value":price_per_kg})
这是代码:
deposit = df["tkid"].values.tolist()
factor_volumen = 1
costs = dict((k,v) for k,v in zip(df["tkid"],df["value"]))
Protein = dict((k,v) for k,v in zip(df["tkid"],df["Protein"]))
Grass = dict((k,v) for k,v in zip(df["tkid"],df["Grass"]))
KG = dict((k,v) for k,v in zip(df["tkid"],df["KG"]))
prob = LpProblem("The Whiskas Problem", LpMinimize)
deposit_vars = LpVariable.dicts("Ingr",deposit,0)
prob += lpSum([costs[i]*deposit_vars[i] for i in deposit]), "Total Cost of Ingredients per can"
prob += lpSum([deposit_vars[i] for i in deposit]) == 1.0, "PercentagesSum"
prob += lpSum([Protein[i] * deposit_vars[i] for i in deposit]) >= 17.2, "ProteinRequirement"
prob += lpSum([Grass[i] * deposit_vars[i] for i in deposit]) >= 11.8, "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))
这部分正在工作,但我需要再添加一个约束,即我想生产多少公斤。
我试过做这两个约束:
## total KG produced == 14
prob += lpSum([KG[i] * deposit_vars[i] for i in deposit]) == 14, "KGRequirement"
### Can´t not use more that 8KG from deposit 1
prob += lpSum([KG[i] * deposit_vars[i] for i in deposit[0:1]]) <= 8, "KGRequirement1"
我得到这个错误:
Status: Infeasible
Ingr_f1 = 0.83636364
Ingr_f2 = 0.11818182
Ingr_f3 = 0.045454545
Ingr_f4 = 0.0
Total Cost of Ingredients per can = 14.30000007
但是使用 deposit 4 来满足这一点是可能的,所以我认为约束是不正确的。
我意识到百分比约束是错误的,我只需要添加我想要生产多少的约束:
prob += lpSum([KG[i] * deposit_vars[i] for i in deposit]) == 14, "KGRequirement"
而且成分的加权平均值也符合要求。
prob += lpSum([Protein[i] *KG[i] * deposit_vars[i] for i in deposit]) >= 17.2*14, "ProteinRequirement"
这是现在的严格约束:
prob += lpSum([Protein[i] *KG[i] * deposit_vars[i] for i in deposit]) >= 17.2*14, "ProteinRequirement"
prob += lpSum([Grass[i] *KG[i] * deposit_vars[i] for i in deposit]) >= 11.8*14, "FatRequirement"
prob += lpSum([KG[i] * deposit_vars[i] for i in deposit]) == 14, "KGRequirement"
prob += lpSum([KG[i] * deposit_vars[i] for i in deposit[0:1]]) <= 8, "KGRequirement1"
【问题讨论】:
-
您能否阐明决策变量的含义和单位?在您的目标函数中,您将它们乘以每公斤的价格,这表明
deposit_vars以公斤为单位,但是然后您将它们乘以在最后两个约束中似乎以公斤为单位的另一个变量,表明它们是百分比... -
@kabdulla 我刚刚编辑了问题
-
好的....所以你现在都整理好了?如果是这样,可以发布您自己的答案并接受以避免混淆。也考虑支持我的评论。
标签: python math optimization pulp