2016-01-03 26 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使解算器確實不想要使用該懲罰變量作爲非零。

在模型中的各個位置添加這些鬆弛/懲罰變量可以幫助確定約束條件太緊,並使模型不可行。

不要忽視上面的答案,因爲捕捉錯誤仍然很有價值。