2016-01-03 22 views
1

我有一个优化问题,我写了一个python程序来解决它。我用纸浆与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': 
    ... 

回答

2

我想你可以通过内部进行封闭的声明解决这个一个try-exception条款。

例如:

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

return status 
3

是您的“问题”找到一个给定的问题,例如是否可行与否,或者是你真正感兴趣的解决方案是否可行。当模型不可行时,我会考虑你的问题并试图增加一些松弛变量和惩罚成本,以便在问题不可行时给予更多信息。

因此,而不是添加像

sum(x) <= K 

硬约束,你可以尝试像

sum(x) <= K + penaltyVar 

,并加上一个期限到你的目标象1000000 * penaltyVar使解算器确实不想要使用该惩罚变量作为非零。

在模型中的各个位置添加这些松弛/惩罚变量可以帮助确定约束条件太紧,并使模型不可行。

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