Je travaille dans un laboratoire qui optimise globalement les problèmes à nombres entiers et non convexes. Mon expérience avec les solveurs d’optimisation open source a été que les meilleurs sont généralement écrits dans un langage compilé et qu’ils se comparent mal aux packages d’optimisation commerciaux.
Si vous pouvez formuler votre problème comme un système d’équations explicite et que vous avez besoin d’un résolveur gratuit, votre meilleur choix est probablement IPOPT, comme l’a dit Aron. Vous pouvez trouver d’autres solveurs gratuits sur le site Web COIN-OR . À ma connaissance, les solveurs non linéaires ne disposent pas de liaisons Python fournies par les développeurs; toute liaison que vous trouverez serait une tierce partie. Pour obtenir de bonnes solutions, vous devez également envelopper tout solveur convexe et non linéaire que vous avez trouvé dans une heuristique d'optimisation globale stochastique appropriée ou dans un algorithme d'optimisation globale déterministe tel que branch-and-bound. Vous pouvez également utiliser Bonmin ou Couenne, qui sont tous deux des résolveurs d’optimisation déterministes non convexes, dont les performances sont satisfaisantes par rapport au BARON , le solveur à la pointe de la technologie .
Si vous pouvez acheter un solveur d’optimisation commercial, vous pouvez envisager de consulter le langage de modélisation GAMS , qui comprend plusieurs solveurs d’optimisation non linéaires. Les interfaces avec les solveurs CONOPT, SNOPT et BARON sont particulièrement citées. (CONOPT et SNOPT sont des solveurs convexes.) Une solution kludgey que j’ai utilisée par le passé consiste à utiliser les liaisons de langage Fortran (ou Matlab) à GAMS pour écrire un fichier GAMS et appeler GAMS à partir de Fortran (ou Matlab) pour calculer le fichier. solution d'un problème d'optimisation. GAMS dispose de liens en langage Python et d’un personnel d’assistance très réactif, prêt à vous aider en cas de problème. (Avertissement: je n'ai aucune affiliation avec GAMS, mais mon laboratoire possède une licence GAMS.) Les solveurs commerciaux ne devraient pas être pires quefmincon
; En fait, je serais surpris s'ils n'étaient pas beaucoup mieux. Si la taille de vos problèmes est suffisamment petite, vous n’auriez peut-être même pas besoin d’acheter une licence GAMS et des licences pour les solveurs, car une copie d’évaluation de GAMS peut être téléchargée à partir de leur site Web. Sinon, vous voudrez probablement choisir les solveurs à acheter avec une licence GAMS. Il est intéressant de noter que BARON nécessite un solveur de programmation linéaire à nombres entiers mixtes et que les licences pour les deux meilleurs solveurs de programmation linéaire à nombres entiers mélangés CPLEX et GUROBI sont gratuites pour les universitaires. Vous pourrez donc vous en tirer en achetant simplement les interfaces GAMS. que les interfaces et les licences de solveur, ce qui peut vous faire économiser beaucoup d’argent.
Ce point mérite d'être répété: pour tout résolveur d'optimisation non convexe déterministe que j'ai mentionné ci-dessus, vous devez être capable de formuler le modèle comme un ensemble explicite d'équations. Sinon, les algorithmes d'optimisation non convexes ne fonctionneront pas, car ils reposent tous sur une analyse symbolique pour construire des relaxations convexes pour des algorithmes de type ramification et délimitation.
MISE À JOUR: Une idée qui ne me venait pas à l'esprit à première vue était que vous pouviez également appeler la boîte à outils pour l'optimisation avancée ( TAO ) et PETSc en utilisant tao4py et petsc4py , ce qui aurait l'avantage supplémentaire de faciliter la parallélisation et de tirer parti de la familiarité avec PETSc. et les outils ACTS .
MISE À JOUR # 2: Sur la base des informations supplémentaires que vous avez mentionnées, les méthodes de programmation séquentielle quadratique (SQP) seront votre meilleur choix. Les méthodes SQP sont généralement considérées comme plus robustes que les méthodes à point intérieur, mais présentent l'inconvénient de nécessiter des solutions linéaires denses. Puisque vous vous souciez plus de la robustesse que de la vitesse, SQP sera votre meilleur pari. Je ne trouve pas de bon solutionneur de SQP écrit en Python (et apparemment, Sven Leyffer d’Argonne ne le pouvait pas non plus dans ce rapport technique ). Je suppose que les algorithmes implémentés dans des packages tels que SciPy et OpenOpt ont le squelette de base de certains algorithmes SQP, mais sans l'heuristique spécialisée que des codes plus avancés utilisent pour surmonter les problèmes de convergence. Vous pouvez essayer NLopt, écrit par Steven Johnson au MIT. Je n'ai pas beaucoup d'espoir, car il n'a aucune réputation à ma connaissance, mais Steven Johnson est un type brillant qui écrit de bons logiciels (après tout, il a co-écrit FFTW). Il implémente une version de SQP; si c'est un bon logiciel, faites le moi savoir.
J'espérais que TAO aurait un rôle de résolveur d'optimisation contraint, mais ce n'est pas le cas. Vous pouvez certainement utiliser ce qu'ils ont pour en construire un; ils ont beaucoup de composants là-bas. Comme vous l'avez fait remarquer, cependant, il vous demanderait beaucoup plus de travail. Si vous rencontrez ce type de problème, vous pourriez aussi bien être un développeur TAO.
Avec ces informations supplémentaires, vous obtiendrez de meilleurs résultats en appelant GAMS à partir de Python (si c'est une option du tout) ou en essayant de corriger l'interface Python IPOPT. Etant donné qu'IPOPT utilise une méthode de point intérieur, elle ne sera pas aussi robuste, mais la mise en œuvre par Andreas d'une méthode de point intérieur est considérablement meilleure que celle de Matlab avec SQP. Dans ce cas, vous ne sacrifiez peut-être pas la robustesse. Il faudrait mener des études de cas pour en être certain.
Vous êtes déjà au courant de l'astuce pour reformuler les contraintes d'inégalité rationnelles en contraintes d'inégalité polynomiales (c'est dans votre livre); La raison pour laquelle cela aiderait BARON et certains autres solveurs non-convexes est qu’il peut utiliser l’analyse par terme pour générer d’autres inégalités valides qu’il peut utiliser pour réduire et améliorer la convergence des solveurs.
Si l'on exclut les liaisons GAMS Python et l'interface Python vers IPOPT, la réponse est non, il n'y a pas encore de solutionneur de programmation non linéaire de haute qualité pour Python. Peut-être que @Dominique changera cela avec NLPy.
MISE À JOUR # 3: Des solutions plus sauvages pour trouver un solutionneur basé sur Python ont abouti à PyGMO , un ensemble de liaisons Python à PaGMO, un solutionneur d'optimisation multiobjectif global basé sur C ++. Bien qu'il ait été créé pour l'optimisation multiobjectif, il peut également être utilisé pour la programmation non linéaire à objectif unique et possède des interfaces Python pour IPOPT et SNOPT, entre autres solutions. Il a été développé au sein de l' Agence spatiale européenne , alors espérons qu'il y a une communauté derrière cela. Il a également été publié relativement récemment (24 novembre 2011).