2

最適化の問題があり、それを解決するための Python プログラムを作成しています。CPLEX ソルバーで Pulp を使用しました。

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':
    ...
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 に答える