为了账号安全,请及时绑定邮箱和手机立即绑定

在混合优化问题中添加数量作为约束

在混合优化问题中添加数量作为约束

PIPIONE 2021-10-26 16:05:24
我正在复制这个混合问题的例子:https : //www.coin-or.org/PuLP/CaseStudies/a_blending_problem.html使用以下数据:import pulpfrom pulp import *import pandas as pdfood = ["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,kgdf = pd.DataFrame({"tkid":food,"KG":KG,"Protein":Protein,"Grass":Grass,"value":price_per_kg})这是代码:deposit =  df["tkid"].values.tolist()factor_volumen = 1costs =  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 screenprint ("Status:", LpStatus[prob.status])# Each of the variables is printed with it's resolved optimum valuefor v in prob.variables():    print (v.name, "=", v.varValue)# The optimised objective function value is printed to the screenprint ("Total Cost of Ingredients per can = ", value(prob.objective))这部分正在工作,但我需要再添加一个限制,即我想生产多少公斤。我试过做这两个限制:## total KG produced == 14prob += lpSum([KG[i] * deposit_vars[i] for i in deposit]) == 14, "KGRequirement"### Can´t not use more that 8KG from deposit 1prob += lpSum([KG[i] * deposit_vars[i] for i in deposit[0:1]]) <= 8, "KGRequirement1" 我收到此错误:Status: InfeasibleIngr_f1 = 0.83636364Ingr_f2 = 0.11818182Ingr_f3 = 0.045454545Ingr_f4 = 0.0Total Cost of Ingredients per can =  14.30000007但使用存款4来满足这一点应该是可能的,所以我认为约束是不正确的。
查看完整描述

1 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

我意识到百分比限制是错误的,我只需要添加我想要生产多少的限制:


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"


查看完整回答
反对 回复 2021-10-26
  • 1 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信