代码之家  ›  专栏  ›  技术社区  ›  Luis Ramon Ramirez Rodriguez

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

  •  0
  • Luis Ramon Ramirez Rodriguez  · 技术社区  · 7 年前

    我正在复制这个混合问题的示例: 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
    

    但是应该可以使用存款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"
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Luis Ramon Ramirez Rodriguez    7 年前

    我意识到百分比合同是错误的,我只需要加上我想生产多少的合同:

    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"