用于混合计算器的纸浆/蟒蛇功能



混合图像示例 希望在这个问题上得到一些帮助,因为我是 python 的新手。 问题是:我们希望将目标啤酒与某些参数(颜色、酒精等(混合,并利用现有的"母"啤酒库存来实现这一目标(50% 啤酒 1,20% 啤酒 2,30% 啤酒 3(。我附上了一张图片,希望能更好地解释。 我在 excel 中找不到解决问题的方法,并在纸浆网站上找到了这段代码,这似乎正是我所追求的。

https://pythonhosted.org/PuLP/CaseStudies/a_blending_problem.html

但是,我们不需要最小化成本,我希望简单地输出解决方案是否可行,以及实现它所需的百分比是多少。我确实使用这种方法来建立我的想法。 不过我一直被卡住了。我的产量似乎每次都默认为100%的啤酒,即使我已经知道解决方案的组合,我也无法让混合物起作用。我认为由于缺乏纸浆知识,我犯了一些简单的错误,但任何人都可以帮助我指出正确的方向吗?我看到__dummy添加到我的列表中,但不确定原因。

from pulp import *
Ingredients = ['Beer 1', 'Beer 2', 'Beer 3', 'Beer 4']
RDF = {'Beer 1': 60, 
'Beer 2': 60, 
'Beer 3': 70, 
'Beer 4': 70}
IBU = {'Beer 1': 15, 
'Beer 2': 40, 
'Beer 3': 25, 
'Beer 4': 40}
Colour = {'Beer 1': 6, 
'Beer 2': 40, 
'Beer 3': 6, 
'Beer 4': 15}
prob = LpProblem("BeerTest", LpMinimize)
ingredient_vars = LpVariable.dicts("Ingr",Ingredients,0)
prob += lpSum([ingredient_vars[i] for i in Ingredients]) == 100, "PercentagesSum"
prob += lpSum([RDF[i] * ingredient_vars[i] for i in Ingredients]) ==67, "RDF"
prob += lpSum([IBU[i] * ingredient_vars[i] for i in Ingredients]) ==22, "IBU"
prob.writeLP("BlendTest1")
[Ingr_Beer_1, Ingr_Beer_2, Ingr_Beer_3, Ingr_Beer_4, __dummy]
prob.solve()
-1
print ("Status:"), LpStatus[prob.status]
Status:
(None, 'Infeasible')
for v in prob.variables():
print (v.name),"=",v.varValue

Ingr_Beer_1
(None, '=', 100.0)
Ingr_Beer_2
(None, '=', 0.0)
Ingr_Beer_3
(None, '=', 0.0)
Ingr_Beer_4
(None, '=', 0.0)
__dummy
(None, '=', None)

你已经差不多可以工作了。两个小问题;你的打印语句不太正确(假设Python 3,见下文(,而且你错误地乘以两个百分比 - 你需要除以100。

下面对您的示例进行了细微更改,我得到了以下输出:

Status:Optimal
Ingr_Beer_1=30.0
Ingr_Beer_2=0.0
Ingr_Beer_3=70.0
Ingr_Beer_4=0.0
__dummy=None

使用以下代码:

from pulp import *
Ingredients = ['Beer 1', 'Beer 2', 'Beer 3', 'Beer 4']
RDF = {'Beer 1': 60, 
'Beer 2': 60, 
'Beer 3': 70, 
'Beer 4': 70}
IBU = {'Beer 1': 15, 
'Beer 2': 40, 
'Beer 3': 25, 
'Beer 4': 40}
Colour = {'Beer 1': 6, 
'Beer 2': 40, 
'Beer 3': 6, 
'Beer 4': 15}
prob = LpProblem("BeerTest", LpMinimize)
ingredient_vars = LpVariable.dicts("Ingr",Ingredients,0)
prob += lpSum([ingredient_vars[i] for i in Ingredients]) == 100, "PercentagesSum"
prob += lpSum([RDF[i] * ingredient_vars[i] for i in Ingredients])/100 == 67, "RDF"
prob += lpSum([IBU[i] * ingredient_vars[i] for i in Ingredients])/100 == 22, "IBU"
prob.writeLP("BlendTest1")
prob.solve()

print ("Status:" + str(LpStatus[prob.status]))
for v in prob.variables():
print (v.name + "=" + str(v.varValue))

作为旁注,我建议以分数 [0 - 1.0] 而不是百分比 [0-100] 工作,因为它往往更整洁。

最新更新