簡體   English   中英

如何在 PuLP 中使用變量作為除數

[英]How to use a variable as a divisor in PuLP

我試圖通過將變量 A 除以變量 B 來計算約束來解決 LP 問題。

問題的簡單版本如下:

  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)

但是我收到一條錯誤消息說:

類型錯誤:表達式不能被非常量表達式分割

看起來 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)

哪些是線性約束。 祝你好運!

我覺得在我的解決方案中不應該允許零 - 我包含了一個變量,它是xy的總和(認為您將其稱為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
""")

而如果

prob += 5/x + 13/y > 0.5

不工作:

prob += 5*y + 13*x > 0.5*x*y
TypeError: Non-constant expressions cannot be multiplied

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM