我试图解决一个带有约束的LP问题,该约束是通过变量A除以变量B计算的。
问题的简单版本如下:
目的: A的最低用量是多少?
守则是这样的:
from pulp import *
prob = LpProblem('Simple problem', LpMinimize)
x = LpVariable('x', 0, None, 'Integer')
y = LpVariable('y', 0, None, 'Integer')
prob += x
prob += x / (x + y) > 0.5 # <== Where the error happens
prob += y / (x + y) < 0.4
prob += x + y == 100
prob.solve()
print 'Result: %s' % LpStatus[prob.status]
print 'Amount of A: %s' % value(prob.objective)
但是,我收到一条错误消息,上面写着:
TypeError:表达式不能除以非常量表达式。
看起来,PuLP不支持变量作为除数。https://github.com/coin-or/pulp/blob/master/src/pulp/pulp.py#L800
有什么想法吗?如果PuLP不是适合使用的库,我很乐意切换到适合使用的任何库。
更新2015年11月27日
由于某些原因,上面的示例没有意义(不像预期的那样工作)。我是这个图书馆的新手。也许这根本不适合解决我的问题。因此,如果有人有其他图书馆的建议,我们将不胜感激。
顺便说一下,Koen Peters下面的建议是很棒的。听了他的建议,错误就消失了。谢谢。
发布于 2015-11-26 15:59:19
线性规划不理解除法,因此错误是:)您必须重新编制它,这样除法才是线性的。在这种情况下:
prob += x / (x + y) > 0.5
prob += y / (x + y) < 0.4
相当于:
prob += x > 0.5 * (x + y)
prob += y < 0.4 * (x + y)
它们是线性约束。祝好运!
发布于 2020-04-04 20:39:27
我觉得在我的解决方案中不应该允许零,我还包括了一个变量,它是x
和y
的总和(您认为它是指A
)。
from pulp import LpProblem, LpStatus, LpVariable
from pulp import LpMinimize, LpMaximize, lpSum, value
# I feel like zero shouldn't be allowed for lower bound...
x = LpVariable("x", lowBound=1, cat="Integer")
y = LpVariable("y", lowBound=1, cat="Integer")
z = LpVariable("z", lowBound=1, cat="Integer")
model = LpProblem("Divison problem", LpMinimize)
model += x
model += z == x + y
model += z == 100
# Rather than division, we can use multiplication
model += x >= z * 0.5
model += y <= z * 0.4
model.solve()
print(LpStatus[model.status])
print(f"""
x = {int(x.varValue):>3} # 60
y = {int(y.varValue):>3} # 40
z = {int(z.varValue):>3} # 100
""")
https://stackoverflow.com/questions/33929353
复制相似问题