【问题标题】:Why do I get different result in linear programming problem (using pulp)为什么我在线性规划问题中得到不同的结果(使用纸浆)
【发布时间】:2020-12-29 00:08:04
【问题描述】:

为了解决一个线性问题,我使用纸浆库在 python 中编写了一些代码。但是,如果我将 y 变量的名称更改为 s 或 r 并重新运行程序,我会得到不同的结果。不同的结果是指正在打印的变量 x1,x2 ... x10 和 y1...y10。但是最小值保持不变,为 36650。

代码如下:

from pulp import LpMaximize, LpProblem, LpStatus, lpSum, LpVariable, LpMinimize

model = LpProblem(name="resource", sense=LpMinimize)

x = {i: LpVariable(name=f"x{i}", lowBound=0) for i in range(1, 11)}
y = {i: LpVariable(name=f"y{i}", lowBound=0) for i in range(1, 11)}

model += (x[1] + 50 - y[1] >= 100 , "x1")
model += (x[2] + y[1] - y[2] >= 200 , "x2")
model += (x[3] + y[2] - y[3] >= 150 , "x3")
model += (x[4] + y[3] - y[4] >= 400 , "x4")
model += (x[5] + y[4] - y[5] >= 300 , "x5")
model += (x[6] + y[5] - y[6] >= 400 , "x6")
model += (x[7] + y[6] - y[7] >= 150 , "x7")
model += (x[8] + y[7] - y[8] >= 150 , "x8")
model += (x[9] + y[8] - y[9] >= 200 , "x9")
model += (x[10] + y[9] - y[10] >= 250 , "x10")
model += (0 <= x[1] <= 400 , "ti")
model += (0 <= x[2] <= 500 , "tii")
model += (0 <= x[3] <= 300 , "tiii")
model += (0 <= x[4] <= 400 , "tiv")
model += (0 <= x[5] <= 400 , "tv")
model += (0 <= x[6] <= 300 , "tvi")
model += (0 <= x[7] <= 300 , "tvii")
model += (0 <= x[8] <= 500 , "tviii")
model += (0 <= x[9] <= 500 , "tix")
model += (0 <= x[10] <= 300 , "tx")

model += 13*x[1] + 15*x[2] + 17*x[3] + 19*x[4] + 17*x[5] + 18*x[6] + 14*x[7] + 12*x[8] + 14*x[9] + 15*x[10] + 2*y[1] + 2*y[2] + 2*y[3] + 2*y[4] + 2*y[5] + 2*y[6] + 2*y[7] + 2*y[8] + 2*y[9] + 2*y[10]

status = model.solve()

print(f"The minimal total cost is: {model.objective.value()}")

for var in x.values():
    print(f"{var.name}: {var.value()}")
for var in y.values():
    print(f"{var.name}: {var.value()}")

完整的结果可以在下面看到

【问题讨论】:

  • 看起来很可疑(我希望 obj 会改变)。您可能需要打印两个版本的 LP 文件并进行比较。
  • @ErwinKalvelagen 谢谢你,似乎在使用变量 x 和 y 时,程序首先评估 x 然后评估 y。但是在 x 和 s 中,首先评估 s(因为它在字母表中排在第一位)。因此解决方案的差异
  • 是的。这两个解决方案的 obj 似乎确实相同,因此您的问题有多个最优解决方案。模型中的任何更改(例如更改变量排序)都可能导致求解器找到不同的最优解。

标签: python linear-programming pulp


【解决方案1】:

考虑以下示例

>>> x = pulp.LpVariable('x',0, 3, pulp.LpInteger)
>>> y = pulp.LpVariable('y',0, 3, pulp.LpInteger)
>>> prob = pulp.LpProblem('example', pulp.LpMaximize)
>>> prob += x+y  
>>> prob += x+y <= 3

最佳值是 3,但有几个 (x,y) 对导致了这个最佳值,即(3,0), (2,1), (1,2), (0,3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2021-05-30
    • 2019-09-23
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多