Ich arbeite in einem Labor, das globale Optimierungen von gemischt-ganzzahligen und nicht-konvexen Problemen durchführt. Meine Erfahrung mit Open-Source-Optimierungslösern hat gezeigt, dass die besseren in der Regel in einer kompilierten Sprache geschrieben sind und im Vergleich zu kommerziellen Optimierungspaketen schlecht abschneiden.
Wenn Sie Ihr Problem als explizites Gleichungssystem formulieren können und einen freien Löser benötigen, ist IPOPT Ihre beste Wahl, wie Aron sagte. Weitere kostenlose Löser finden Sie auf der COIN-OR -Website. Meines Wissens verfügen die nichtlinearen Löser nicht über Python-Bindungen, die von den Entwicklern bereitgestellt wurden. Alle Bindungen, die Sie finden, sind von Drittanbietern. Um gute Lösungen zu erhalten, müssen Sie auch jeden nichtlinearen, konvexen Solver einschließen, den Sie in einer geeigneten stochastischen globalen Optimierungsheuristik oder in einem deterministischen globalen Optimierungsalgorithmus wie branch-and-bound gefunden haben. Alternativ können Sie Bonmin oder Couenne verwenden. Beide sind deterministische nichtkonvexe Optimierungslöser, die im Vergleich zum aktuellen Löser BARON eine gute Leistung erbringen .
Wenn Sie einen kommerziellen Optimierungslöser erwerben können, sollten Sie sich die GAMS- Modellierungssprache ansehen , die mehrere nichtlineare Optimierungslöser enthält. Besonders hervorzuheben sind die Schnittstellen zu den Lösern CONOPT, SNOPT und BARON. (CONOPT und SNOPT sind konvexe Löser.) Eine kluge Lösung, die ich in der Vergangenheit verwendet habe, besteht darin, die Sprachbindungen von Fortran (oder Matlab) für GAMS zu verwenden, um eine GAMS-Datei zu schreiben und GAMS aus Fortran (oder Matlab) aufzurufen, um die zu berechnen Lösung eines Optimierungsproblems. GAMS verfügt über Python-Sprachbindungen und einen sehr reaktionsschnellen Support, der bereit ist, bei Problemen zu helfen. (Haftungsausschluss: Ich bin nicht mit GAMS verbunden, mein Labor besitzt jedoch eine GAMS-Lizenz.) Die kommerziellen Löser sollten nicht schlechter sein alsfmincon
; Tatsächlich wäre ich überrascht, wenn sie nicht viel besser wären. Wenn Ihre Probleme ausreichend klein sind, müssen Sie möglicherweise nicht einmal eine GAMS-Lizenz und Lizenzen für Löser erwerben, da eine Testversion von GAMS von deren Website heruntergeladen werden kann. Andernfalls möchten Sie wahrscheinlich entscheiden, welche Löser in Verbindung mit einer GAMS-Lizenz erworben werden sollen. Es ist erwähnenswert, dass BARON einen linearen Programmierlöser mit gemischten Ganzzahlen benötigt und dass die Lizenzen für die beiden besten linearen Programmierlöser mit gemischten Ganzzahlen, CPLEX und GUROBI, für Akademiker kostenlos sind, sodass Sie möglicherweise nicht nur die GAMS-Schnittstellen erwerben müssen als die Schnittstellen und die Löser-Lizenzen, die Sie viel Geld sparen können.
Dieser Punkt muss wiederholt werden: Für jeden der oben erwähnten deterministischen nichtkonvexen Optimierungslöser müssen Sie in der Lage sein, das Modell als expliziten Satz von Gleichungen zu formulieren. Andernfalls funktionieren die nichtkonvexen Optimierungsalgorithmen nicht, da alle auf einer symbolischen Analyse beruhen, um konvexe Relaxationen für verzweigungs- und gebundene Algorithmen zu konstruieren.
UPDATE: Ein Gedanke, der mir anfangs nicht in den Sinn kam , war, dass Sie das Toolkit für Advanced Optimization ( TAO ) und PETSc auch mit tao4py und petsc4py aufrufen können , was den potenziellen zusätzlichen Vorteil einer einfacheren Parallelisierung und der Nutzung der Vertrautheit mit PETSc hätte und die ACTS- Tools.
UPDATE 2: Aufgrund der von Ihnen erwähnten zusätzlichen Informationen sind Methoden der sequentiellen quadratischen Programmierung (SQP) die beste Wahl. SQP-Methoden gelten im Allgemeinen als robuster als interne Punktmethoden, haben jedoch den Nachteil, dass dichte lineare Lösungen erforderlich sind. Da Ihnen Robustheit wichtiger ist als Geschwindigkeit, ist SQP die beste Wahl. Ich kann keinen guten SQP-Solver finden, der in Python geschrieben wurde (und Sven Leyffer in Argonne in diesem technischen Bericht anscheinend auch nicht ). Ich vermute, dass die in Paketen wie SciPy und OpenOpt implementierten Algorithmen das Grundgerüst einiger SQP-Algorithmen aufweisen, jedoch ohne die speziellen Heuristiken, die fortgeschrittenere Codes zur Überwindung von Konvergenzproblemen verwenden. Sie könnten NLopt versuchen, geschrieben von Steven Johnson am MIT. Ich habe keine großen Hoffnungen, weil es keinen Ruf hat, den ich kenne, aber Steven Johnson ist ein brillanter Typ, der gute Software schreibt (schließlich hat er FFTW mitgeschrieben). Es implementiert eine Version von SQP. Wenn es eine gute Software ist, lass es mich wissen.
Ich hatte gehofft, dass TAO einen eingeschränkten Optimierungslöser darstellen würde, aber das ist nicht der Fall. Sie könnten sicherlich das gebrauchen, was sie brauchen, um einen aufzubauen; Sie haben viele der Komponenten dort. Sie haben jedoch darauf hingewiesen, dass es viel mehr Arbeit für Sie bedeutet, und wenn Sie in solche Schwierigkeiten geraten, können Sie auch ein TAO-Entwickler sein.
Mit diesen zusätzlichen Informationen erzielen Sie mit größerer Wahrscheinlichkeit bessere Ergebnisse beim Aufrufen von GAMS über Python (falls dies überhaupt eine Option ist) oder beim Versuch, die IPOPT-Python-Oberfläche zu patchen. Da IPOPT eine Innenpunktmethode verwendet, ist sie nicht so robust, aber vielleicht ist die Implementierung einer Innenpunktmethode durch Andreas erheblich besser als die Implementierung von SQP durch Matlab. In diesem Fall müssen Sie möglicherweise überhaupt keine Einbußen bei der Robustheit hinnehmen. Sie müssten einige Fallstudien durchführen, um sicherzugehen.
Sie kennen bereits den Trick, die rationalen Ungleichungsbeschränkungen in polynomiale Ungleichungsbeschränkungen umzuformulieren (das steht in Ihrem Buch). Der Grund, warum dies BARON und einigen anderen nicht konvexen Lösern helfen würde, besteht darin, dass sie Termanalyse verwenden können, um zusätzliche gültige Ungleichungen zu generieren, die sie als Kürzungen verwenden können, um die Konvergenz von Lösern zu verbessern und zu beschleunigen.
Ohne die GAMS-Python-Bindungen und die Python-Schnittstelle zu IPOPT lautet die Antwort: Nein, es gibt noch keine hochwertigen nichtlinearen Programmierlöser für Python. Vielleicht wird @Dominique das mit NLPy ändern.
UPDATE Nr. 3: Mehr wilde Versuche , einen Python-basierten Löser zu finden, führten zu PyGMO , einer Reihe von Python-Bindungen zu PaGMO, einem C ++ -basierten globalen Multiobjektiv-Optimierungslöser. Obwohl es für die multiobjektive Optimierung entwickelt wurde, kann es auch zur nichtlinearen Einzelzielprogrammierung verwendet werden und verfügt unter anderem über Python-Schnittstellen zu IPOPT und SNOPT. Es wurde innerhalb der Europäischen Weltraumorganisation entwickelt , also steht hoffentlich eine Community dahinter. Es wurde auch vor relativ kurzer Zeit (24. November 2011) veröffentlicht.