2

I have an optimization problem and I write a python program to solve it. I used Pulp with the CPLEX solver:

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 ) )

I get the error:

  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

My question is : How can I test if the problem is infeasible or not? I want to prevent this event like if problem is infeasible then return 0.

I tried :

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

and I tried

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

2 回答 2

7

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

所以不要添加一个硬约束,比如

sum(x) <= K

你可以尝试类似的东西

sum(x) <= K + penaltyVar 

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

在模型的不同位置添加这些松弛/惩罚变量可以帮助确定哪些地方的约束过于严格,从而使您的模型不可行。

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

于 2016-01-04T18:19:45.553 回答
3

我认为您可以通过将语句限制在try-exception子句中来解决此问题。

例如:

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

return status
于 2016-01-03T20:56:52.933 回答