如何防止 pulp 和 python 出现不可行错误?

How to prevent infeasible error with pulp and python?

我有一个优化问题,我写了一个 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

我的问题是:如何测试问题是否不可行?我想阻止这个事件,如果问题不可行,那么 return 0.

我试过了:

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

我试过了

if pulp.LpStatusInfeasible == 'infeasible':
    ...

我想你可以通过将语句放在 try-exception 子句中来解决这个问题。

例如:

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

return status

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

所以与其添加像

这样的硬约束
sum(x) <= K

你可以试试

sum(x) <= K + penaltyVar 

并在您的 objective 中添加一个项,例如 1000000 * penaltyVar,这样求解器就真的不想将该惩罚变量用作 non-zero。

在模型的不同位置添加这些 slack/penalty 变量可以帮助确定约束太紧以及使模型不可行的地方。

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