2016-01-03 1 views
1

J'ai un problème d'optimisation et j'écris un programme python pour le résoudre. J'ai utilisé la pâte avec le solveur CPLEX:Comment prévenir les erreurs irréalisables avec pulpe et python?

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

Je reçois l'erreur:

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 

Ma question est: Comment puis-je tester si le problème est infaisable ou non? Je veux éviter cet événement comme si le problème est infaisable revenir alors 0.

J'ai essayé:

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

et j'ai essayé

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

Répondre

2

Je pense que vous pouvez résoudre ce problème en emprisonnant l'instruction à l'intérieur une clause try-exception.

par exemple:

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

return status 
3

Est-ce votre trouver « problème » si une instance de problème donné est réalisable ou non, ou êtes-vous réellement intéressés par la solution si elle est réalisable. Plutôt que de simplement piéger l'erreur quand le modèle est infaisable, j'examinerais votre problème et j'essaierais d'ajouter quelques variables relâchées et des coûts de pénalité pour vous donner plus d'informations quand le problème serait autrement irréalisable.

Ainsi, plutôt que d'ajouter une contrainte dure comme

sum(x) <= K 

vous pouvez essayer quelque chose comme

sum(x) <= K + penaltyVar 

et ajouter un terme dans votre objectif comme 1000000 * penaltyVar pour que le solveur ne vraiment pas vouloir utiliser cette variable de pénalité comme non nulle. L'ajout de ces variables de slack/penalty à divers endroits dans votre modèle peut aider à identifier où les contraintes sont trop serrées et rendre votre modèle infaisable. Par contre, n'ignorez pas la réponse ci-dessus, car il est toujours utile d'intercepter l'erreur.