Pulp Python LP - 错误的解决方案

时间:2017-12-09 11:41:31

标签: python linear

当我运行以下代码时:

from pulp import * 

x = pulp.LpVariable("x", 0, None , LpContinuous) 
y = pulp.LpVariable("y", 0, None , LpContinuous)
problem = pulp.LpProblem("A simple max problem", pulp.LpMinimize) 
problem += x + y, "The objective function" 
problem += x + 2*y == 2, "1st constraint"
problem += 2*x + 3*y == 2, "2nd constraint"
problem += x >= 0, "3rd constraint"
problem += y >= 0, "4th constraint"
problem += x + y == 1, "5th constraint"

problem.writeLP("WhiskasModel.lp")
problem.solve()

for variable in problem.variables():
    print variable.name, "=", variable.varValue

print value(problem.objective)

我得到了输出:

x = 0.0
y = 1.0
1.0

这显然是错误的,因为不满足第二个约束。 现在情况是上述问题没有解决方案。所以我希望从纸浆中通知我一些相关的东西("不可行的问题")或类似的东西。相反,我怀疑它随意地删除了一些约束并与其余约束一起工作。同样在以下情况中:

x = pulp.LpVariable("x", 0, None , LpContinuous) 
y = pulp.LpVariable("y", 0, None , LpContinuous)
problem = pulp.LpProblem("A simple max problem", pulp.LpMinimize) 
problem += x + y, "The objective function" 
problem += x + 2*y == 2, "1st constraint"
problem += 2*x + 3*y == 20, "2nd constraint"
problem += x >= 0, "3rd constraint"
problem += y >= 0, "4th constraint"
problem += x + y == 1, "5th constraint"

problem.writeLP("WhiskasModel.lp")
problem.solve()

for variable in problem.variables():
    print variable.name, "=", variable.varValue

print value(problem.objective)

输出

x = 34.0
y = -16.0
18.0

即。第四个约束现在是"掉线"。

任何人都知道如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

你的程序只会尝试解决自己,从第一个约束开始。

从线性代数的角度来看,增广矩阵是:

[ 1 2 | 2
  2 3 | 20
  1 1 | 1 ]

进一步限制两个变量应>> = 0。 从第二行直接减去两倍,最终会得到:

[ 1 2  | 2
  0 -1 | 16
  .........]

换句话说,为了满足你的第一个约束,你强迫你的y变量变成-16,这只是可能的解决方案。为解决第一行,x变量变为34。所有进一步的约束和目标函数都不再重要。这是唯一可行的解​​决方案。

如果问题没有满足所有约束的解决方案,您希望系统发出警告。目前这没有在包中实现并且看到Git,他们不打算改变这种行为,因此如果你想要被警告不可行的问题,请更改包。

如果您不想更改套餐,您可以从违反约束条件的解决方案中看出您的问题不可行。您可以编写一段代码来自行抛出警告/异常。

答案 1 :(得分:0)

您已经说过:重要的是检查数学优化问题是否可行。纸浆包含此功能。

包括:

if (problem.status == -1):
     print("Your problem is infeasible!")

在您的代码中,您会看到的。