当我运行以下代码时:
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
即。第四个约束现在是"掉线"。
任何人都知道如何解决这个问题?
答案 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!")
在您的代码中,您会看到的。