我有一个优化问题,我编写了一个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':
...
答案 0 :(得分:3)
我认为你可以通过在try-exception
子句中包含语句来解决这个问题。
例如:
# ...
try:
status = prob.solve(pulp.CPLEX(msg = 0))
except PulpSolverError:
# infeasible
return 0
return status
答案 1 :(得分:3)
您的“问题”是否发现给定的问题实例是否可行,或者您是否真的对解决方案感兴趣,如果可行的话。我不会在模型不可行时捕获错误,而是会检查您的问题并尝试添加一些松弛变量和惩罚成本,以便在问题不可行时为您提供更多信息。
所以不要添加像
这样的硬约束sum(x) <= K
你可以试试像
这样的东西sum(x) <= K + penaltyVar
并在您的目标中添加一个术语,如1000000 * penaltyVar,以便求解器真的不想将该惩罚变量用作非零值。
在模型的不同位置添加这些松弛/惩罚变量有助于识别约束过于紧密的位置并使模型不可行。
不要忽略上面的答案,因为捕获错误仍然很有价值。