步长添加到一个线性优化

问题描述 投票:1回答:2

我的工作类似pulp example的混合问题

我有这样的约束,以确保生产的数量是期望一个

prob += lpSum([KG[i] * deposit_vars[i] for i in deposit]) == 64, "KGRequirement"

但我还需要添加另一约束为大于零不同最低限度的值,这是因为不方便我采取例如,一种成分的0.002KG,我必须采取0或至少2公斤,因此有效的情况下是例如0,2,2.3,6,3.23。

我试图让这种方式:

for i in deposit:
    prob += (KG[i] * deposit_vars[i] == 0) or (TM[i] * deposit_vars[i] >= 30)

但是,这不工作,它只是使问题不可行

编辑

这是我当前的代码:

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,22]

##            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] *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]) >= 12.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]) <= 80, "KGRequirement1"

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))

新的约束我想补充的是,在这一部分:

prob += lpSum([KG[i] * deposit_vars[i] for i in deposit]) <= 80, "KGRequirement1"

在我想要的产品KG [I] * deposit_vars [I]是0或为A和B之间

python optimization linear-programming pulp
2个回答
2
投票

在传统的线性规划制剂中,所有变量,目标函数(S),和约束需要是连续的。你所问的是如何使这个变量离散变量,即它只能接受两者之间的值A,B,...而不是任何东西。当你有连续和离散变量的组合,其被称为混合整数规划问题(MIP)。 See PuLP documentation that reflects this explanation.我建议你仔细阅读勾兑问题提到的“整数”;它们散布有关页面。根据纸浆的文档,它可以通过调用外部求解MIP,其中一些已经列入解决MIP问题。

如果没有一个最低工作例子,这是一个有点棘手,解释如何实现这一点。这样做的一个方法是指定变量(S)与它可以作为一个字典值的整数。然后保留默认求解,求解COIN-OR's CBC solver,将解决MIP。同时,这里有一个你前进夫妇的资源:


1
投票

“或”不是东西,你可以在LP / MIP模型直接使用。请记住,一个LP / MIP由一个线性目标和线性约束。

为了模拟x=0 or x≥L可以使用所谓的半连续变量。最先进的求解器支持他们。我不相信然而纸浆支持这一点。作为一种变通方法,你也可以使用一个二元变量δ:

δ*L ≤ x ≤ δ*U

其中qazxsw POI是上qazxsw POI的上限。这是很容易看到这样的作品:

U

半连续变量不需要这些约束。只要告诉解算器变量x是半连续的有界[L,U(或只是L如果没有上界)。

约束

δ = 0   ⇒   x = 0
δ = 1   ⇒   L ≤ x ≤ U 

可改写为

x

这是一个相当标准的制定。半连续变量通常在金融(投资组合模型)用于防止小分配。

所有这一切都保持模型完全线性(未二次的),所以可以使用一个标准的MIP解算器和一个标准LP / MIP建模工具,如纸浆。

© www.soinside.com 2019 - 2024. All rights reserved.