C ++ - Bibliothek zur nichtlinearen eingeschränkten Minimierung


9

Ich versuche derzeit, das nichtlineare Problem der eingeschränkten Minimierung zu lösen, wie es in der matlab-Funktion "fmincon" implementiert ist. Meine Erwartungen sind: Minimieren (fun1, x0, uB, lB, fun2), wobei x0 der Anfangszustand ist, fun1 eine Funktion ist, die minimiert werden muss, uB obere Grenzen sind, lB untere Grenzen sind und fun2 eine Funktion ist, die Vektoren nichtlinearer Gleichungen liefert / Ungleichungen wie unter http://www.mathworks.com/help/optim/ug/fmincon.html beschriebenals nonlcon Funktion. Diese Vektoren ändern sich auch durch Iterationen (sie sind nicht linear abhängig von der x_n, n-ten Iteration des Lösungsvektors). In der Matlab-Implementierung haben sie die Form c (x) <= 0. Dies ist der letzte Code, der von matlab nach c ++ portiert werden muss, und ich habe viel Mühe gehabt, eine geeignete c ++ - Bibliothek zu finden, die diesen Algorithmus enthält. Aus diesem Grund suche ich hier Hilfe und würde mich sehr freuen, wenn Sie Ihr Fachwissen zur Verfügung stellen könnten.

Ein gutes Beispiel dafür, was ich tun möchte, ist das erste auf dieser Seite http://www.mathworks.com/help/optim/ug/constrained-nonlinear-optimization-examples.html#f10960?s_tid=doc_12b Der einzige Unterschied besteht darin, dass ich brauche auch Grenzen ...

Danke im Voraus.

Peter


Es besteht die Möglichkeit, NLOPT ab-initio.mit.edu/wiki/index.php/NLopt_C-plus-plus_Reference zu verwenden, aber ich müsste endliche Differenzen mithilfe mehrerer Aufrufe zur "minimierten" Funktionsbewertung aus der Zielfunktion berechnen und war freundlich zu hoffen, dass dies durch den Algorithmus selbst erledigt wird, um die Leistung zu verbessern. Meine minimierte Funktion ist sehr teuer zu berechnen. Zur Verdeutlichung ist die minimierte Funktion die logarithmische Wahrscheinlichkeit eines geschätzten Modells mit Originaldaten in der Zeitreihen-Markov-Switching-Modellschätzung.
Peter Kottas

1
Haben Sie sich die Antworten auf diese Frage angesehen ? Wenn Ihre Anforderungen dort nicht ausreichend berücksichtigt werden, sollten Sie Ihre Frage bearbeiten, um darauf hinzuweisen, um hilfreiche Empfehlungen zu erhalten.
Christian Clason

Danke, dort gibt es einige nützliche Informationen. Derzeit bin ich in der NLOPT-Bibliothek bis zu den Ellbogen, da ich festgestellt habe, dass es auch zu meinem Problem passen könnte. Ich werde dieses Thema auf dem Laufenden halten und eine Lösung anbieten, wenn ich eines finde. Jede Hilfe, die den Prozess beschleunigen könnte, wird weiterhin geschätzt. Tatsächliche Implementierung zum Beispiel usw.
Peter Kottas

1
Mehrere Fragen: 1. Ist Ihr Problem konvex? 2. Sind das Ziel und die Einschränkungen differenzierbar? Wenn ja, wie oft? Einmal? Zweimal? 3. Können Sie diese Derivate leicht berechnen, wenn sie existieren? Wäre die Annäherung an endliche Differenzen einfach zu berechnen, wenn diese Derivate nicht verfügbar sind? 4. Wie viele Entscheidungsvariablen haben Sie? (dh über wie viele Variablen versuchen Sie zu minimieren?) Eine grobe Schätzung würde ausreichen. 5. Sind Funktionsbewertungen teuer? Es wäre hilfreich, alle diese Informationen zu haben, um Ihnen eine bessere Antwort zu geben.
Geoff Oxberry

Hallo! Zunächst einmal vielen Dank für die Antwort. 1. Schwer zu sagen, aber höchstwahrscheinlich nein, da die minimierte Funktion die logarithmische Wahrscheinlichkeit zwischen der Schätzung des Markov-Schaltmodells von Zeitreihen in der Finanzanwendung ist und von der Art der Schätzung eine verrauschte Ausgabe ausgeht. 2.keine 3.nur endliche Differenzen verwenden 4.Lösungsvektor besteht aus n Variablen, wobei n von gewünschten Modellparametern abhängt, im Allgemeinen von 12 bis beispielsweise 30 5.log-Wahrscheinlichkeit zwischen Modell- und Originaldaten ist teuer, zusätzliche nichtlineare Ungleichungen sind billig zu berechnen
Peter Kottas

Antworten:


2

Wenn Ihre Funktion nicht differenzierbar ist, sollten Sie vorsichtig sein, wie Sie endliche Differenzen verwenden. Wenn Sie abgeleitete Informationen verwenden möchten, ist Ihre beste Wahl wahrscheinlich eine Art halbglatte Newton-Methode. Eine Reihe von Hinweisen, die solche Methoden beschreiben, finden Sie hier .

Zwölf bis dreißig Variablen befinden sich wahrscheinlich am oberen Ende dessen, was mit Mustersuchmethoden (auch Direktsuche genannt) möglich ist. Ein kürzlich veröffentlichtes Übersichtsartikel von Rios und Sahinidis im Journal of Global Optimization über derivatfreie Optimierungsmethoden (z. B. Mustersuchmethoden) sowie eine begleitende Webseite finden Sie hier . Ein weniger aktuelles Übersichtsartikel zu diesen Methoden von Kolda, Lewis und Torczon in SIAM Review finden Sie hier . Diese Methoden funktionieren ziemlich gut mit teuren Funktionsbewertungen und erfordern nicht unbedingt Differenzierbarkeit oder abgeleitete Informationen.

Viele dieser Methoden erfordern eine Art Konvexität, um die Konvergenz zum globalen Optimum zu gewährleisten. Wenn Sie Ihr Problem also rigoros lösen möchten, müssen Sie diese Methoden möglicherweise oben mit einer branch-and-bound-Strategie koppeln. Wenn Sie sich jedoch nicht für Strenge interessieren, fminconfunktioniert ein Ansatz wie der von MATLAB möglicherweise gut genug (es gibt keine Garantien mehr). Endliche Unterschiede geben Ihnen höchstwahrscheinlich ein Mitglied der Subdifferenz Ihrer nicht differenzierbaren Funktion, was für Ihre Probleminstanz und bestimmte Eingabedaten ausreichen könnte, um ein ausreichend genaues Ergebnis für Ihre Zwecke zurückzugeben. In diesem Fall sollten Sie sich wahrscheinlich die Bibliotheken ansehen, die in den Antworten auf die Frage erwähnt sind, die Christian in seinem Kommentar verlinkt hat.


2

Wenn Sie lediglich eine C ++ - Bibliothek benötigen, um nichtlineare Optimierungsprobleme zu lösen, können Sie RobOptim verwenden . Obwohl RobOptim ursprünglich für Probleme der Robotikoptimierung entwickelt wurde, eignet es sich für alle nichtlinearen Optimierungsprobleme. Es bietet eine einfache C ++ - Schnittstelle mit Plugins für mehrere nichtlineare Löser ( Ipopt , NAG usw.). Die Verwendung dieser Art von Wrappern erleichtert die Verwendung eines anderen NLP-Lösers. Wenn Sie keine Farbverläufe angeben können, kann die Finite-Differenzen-Berechnung automatisch durchgeführt werden.

Es ist Open Source, sodass Sie den Quellcode auf GitHub überprüfen können: https://github.com/roboptim/

Die von @Geoff Oxberry durchgeführte Analyse ist für die Auswahl des nichtlinearen Lösers, der von RobOptim aufgerufen wird, von entscheidender Bedeutung. Beachten Sie, dass die Parameteranpassung beim Umgang mit dieser Art von Lösern einen großen Einfluss auf die Leistung haben kann und Sie möglicherweise immer noch in lokalen Minima stecken bleiben (dies hängt wirklich von der Art des Problems ab, mit dem Sie sich befassen).

Hinweis: Ich bin einer der Entwickler dieses Projekts.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.