【问题标题】:Linear optimization with PuLP, additional condition on variables使用纸浆进行线性优化,变量的附加条件
【发布时间】:2018-06-25 13:51:06
【问题描述】:

我必须用纸浆解决 Python 中的整数线性优化问题。 我解决了基本问题,现在我必须添加额外的约束。 有没有人可以帮助我添加带有逻辑指示器的条件? 逻辑限制是:B>5 if A>20

这是我的代码:

from pulp import *

prob = LpProblem("The Optimization Problem", LpMaximize)
A = LpVariable("A", 0, 100)
B = LpVariable("B", 0, 200)
C = LpVariable("C", 0, 100)
R1 = LpVariable("R1", 0)
R2 = LpVariable("R2", 0)

R1 = 0.1 * A + 0.2 * B + 0.075 * C
R2 = 0.05 * A + 0.1 * B + 0.05 * C

prob += 2 * A + 3 * B + 2.55 * C - 0.6 * R1 - 0.8 * R2
prob += 0.5 * A + 0.8 * B + C <= 100, "T1"
prob += 0.8 * A + 0.6 * B + 0.2 * C <= 100, "T2"


prob.writeLP("OptimizationModel.lp")

prob.solve()
print("Status:", LpStatus[prob.status])
for v in prob.variables():
    print(v.name, "=", v.varValue)

【问题讨论】:

  • 您能否验证我的想法是否正确?我已经输入了变量 f:f = LpVariable('f', cat="binary") 并添加了条件:prob += A - 20 &lt;= f * 5, prob += B &gt;= f 可以吗?
  • 显然不是你想要的 B >= 5 而不是 B >= f = 0/1。此外,您将需要一些类似 bigM 的常量。
  • ok,但是我要考虑B的下界。我已经更改了f初始化函数f = LpVariable('f',0,1,cat='Integer')和代码prob += A - 20 &lt;= f * M, prob += B &gt;= f*5,但我仍然不知道代码是否正确。

标签: python optimization pulp integer-programming


【解决方案1】:

我认为您在 f 中创建二进制“开关”变量是正确的。

f = LpVariable('f',0,1,cat='Integer')

如果我理解正确,只要 A > 20,您就需要 B > 5,对吧?

那么你需要调整你的代码,比如只要 A 大于 20,f 就设置为 1。

由于 f 是二进制的,你可以这样做:

prob+= f>= (A-20)/80
prob+= B>= 6*f

在第一行中,(A-20)/80 对于从 0 到 19 的 A 值将是负数,当 A 为 20 时将为零。这将确保对于这些 A 值 f 为零。

当 f 为零时,第二个约束只是意味着 B 必须至少为零,这无论如何都是它的下限。

但是,如果 A 大于等于 21,即 A>20,则 (A-20)/80 变为正数,但永远不会大于 1(稍后会详细介绍)。当 A 为 21 及以上时,这将强制 f 至少为 1。由于 f 只能为 1 或 0,因此 f 被设置为 1。

这将导致第二个约束在 B 为 1(即 A 大于 20)时强制 B 至少为 6。简而言之,只要 f 为 1(即 A 大于20.

希望这会有所帮助!如果它不起作用,请告诉我。我自己一直在研究一个纸浆问题,并使用这种方法编写了一些约束。

注意: 我们除以 81 以确保 (A-20)/80 永远不会大于 1。例如,如果 A 为 21,则 (A-20)/80 的计算结果为 1/80。由于 A 只能像 100 一样大,因此 (A-20)/80 只能像 (100-20)/80 一样大,即 1。如果我们将其更改为 (A-20)/X,其中这里的 X 是 (A-20) 的最大值以下的任何其他值,则分数 (A-20)/X 可以大于 1。由于 f 是二进制(1 或 0),因此约束 f>= (A-20)/X 意味着我们实际上会强制 A 小于其他情况。

【讨论】:

    猜你喜欢
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    相关资源
    最近更新 更多