如何防止Purple和Python出现不可行错误?

问题描述 投票:0回答:3

我有一个优化问题,我编写了一个Python程序来解决它。我将 Pulp 与 CPLEX 求解器一起使用:

import pulp

prob = LpProblem("myProblem", LpMinimize)
x = pulp.LpVariable.dicts("p", range( K ), 0, 1, pulp.LpContinuous)
prob += pulp.lpSum( x[k] for k in range( K ) )
...
# Rest of the constraints

status = prob.solve( pulp.CPLEX( msg = 0 ) )

我收到错误:

  File "C:\Anaconda\lib\site-packages\pulp\solvers.py", line 468, in readsol
    raise PulpSolverError, "Unknown status returned by CPLEX: "+statusString
pulp.solvers.PulpSolverError: Unknown status returned by CPLEX: infeasible

我的问题是:如何测试问题是否不可行?我想阻止这个事件,就像如果问题不可行则返回 0。

我试过了:

if prob.status == 'infeasible':
    ...

我尝试过

if pulp.LpStatusInfeasible == 'infeasible':
    ...
python cplex pulp
3个回答
9
投票

您的“问题”是确定给定的问题实例是否可行,或者您是否真的对可行的解决方案感兴趣。当模型不可行时,我不会仅仅捕获错误,而是会检查您的问题并尝试添加一些松弛变量和惩罚成本,以便在问题不可行时为您提供更多信息。

所以不要添加像这样的硬约束

sum(x) <= K

你可以尝试类似的事情

sum(x) <= K + penaltyVar 

并在您的目标中添加一个项,例如 1000000 *penaltyVar,以便求解器确实不想将该惩罚变量用作非零。

在模型中的各个位置添加这些松弛/惩罚变量可以帮助识别约束太紧并使模型不可行的地方。

不要只是忽略上面的答案,因为捕获错误仍然很有价值。


3
投票

我认为你可以通过将语句放在

try-exception
子句中来解决这个问题。

例如:

# ...
try:
    status = prob.solve(pulp.CPLEX(msg = 0))
except PulpSolverError:
    # infeasible
    return 0

return status

0
投票

这是 8 年前的帖子,但我会为任何寻找更新答案的人添加另一个答案。

OP中尝试的几乎是正确的。 但我发现,即使 PuLP 文档 - pulp.constants.LpStatus - 显示字符串值,

print(prop.status)
是一个数值。

所以用任一数值来做,

if prob.status == -1:

或钥匙。

if prob.status == LpStatusInfeasible:
© www.soinside.com 2019 - 2024. All rights reserved.