[英]Pulp Python LP - Wrong Solution
当我运行以下代码时:
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
即第四个约束现在被“删除”。
有任何想法如何解决这个问题吗?
从第一个约束开始,您的程序将尝试自行解决。
从线性代数的角度来看,增强矩阵为:
[ 1 2 | 2
2 3 | 20
1 1 | 1 ]
进一步的限制是两个变量都应> = 0。 从第二行直接减去第一行的两倍,您将得到:
[ 1 2 | 2
0 -1 | 16
.........]
换句话说,为了满足您的第一个约束,您将y变量强制设为-16,这是唯一可行的解决方案。 x变量变为34,以求解第一行。 所有其他约束和目标函数都不再重要。 这是唯一可能的解决方案。
您想要的是如果问题没有解决所有约束的解决方案,系统会向您发出警告。 当前,这尚未在软件包中实现,并且看到了Git,他们不打算更改此行为,因此,如果要警告您一些不可行的问题,请更改软件包。
如果您不想更改软件包,则可以看到违反解决方案的解决方案是不可行的。 您可以编写代码块自己引发警告/异常。
正如您已经说过的:重要的是检查数学优化问题是否可行。 纸浆包含此功能。
包括:
if (problem.status == -1):
print("Your problem is infeasible!")
在您的代码中,您将看到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.