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
quelle
Antworten:
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,
fmincon
funktioniert 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.quelle
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.
quelle