如何在PuLP中将变量用作除数


问题内容

我正在尝试解决一个LP问题,该问题的约束条件是将变量A除以变量B。

问题的简单版本如下:

  1. 该产品由两种材料(A和B)制成

  2. A的百分比应大于50%

  3. B的百分比应小于40%

  4. A和B的总数是100

目标:最小的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)的以下建议很棒。在征求他的建议后,错误消失了。谢谢。


问题答案:

线性编程不理解除法,因此会出现错误:)您必须重新格式化以使除法运算线性化。在这种情况下:

prob += x / (x + y) > 0.5  
prob += y / (x + y) < 0.4

等效于:

prob += x > 0.5 * (x + y)
prob += y < 0.4 * (x + y)

这是线性约束。祝好运!