Obecnie próbuję rozwiązać problem minimalizacji ograniczonej nieliniowo, jak zaimplementowano w funkcji matlab „fmincon”. Moje oczekiwania to minimalizacja (fun1, x0, uB, lB, fun2), gdzie x0 to stan początkowy, fun1 to funkcja, którą należy zminimalizować, uB to górne granice, lB to dolne granice, a fun2 to funkcja zapewniająca wektory równości nieliniowych / nierówności opisane w http://www.mathworks.com/help/optim/ug/fmincon.htmljako funkcja nonlcon. Wektory te również zmieniają się przez iteracje (są nieliniowo zależne od x_n, n-ta iteracja wektora rozwiązania). W implementacji Matlab mają one postać c (x) <= 0. Jest to ostatni fragment kodu, który należy przenieść z Matlaba do C ++. Miałem dużo problemów, próbując znaleźć odpowiednią bibliotekę c ++ zawierającą ten algorytm. Dlatego szukam tutaj pomocy i byłbym bardzo wdzięczny, gdybyś mógł udzielić swojej wiedzy.
Dobry przykład tego, co chcę zrobić, to pierwszy na tej stronie http://www.mathworks.com/help/optim/ug/constrained-nonlinear-optimization-examples.html#f10960?s_tid=doc_12b Jedyną różnicą jest to, że ja potrzebuję również granic ...
Z góry dziękuję.
Piotr
źródło
Odpowiedzi:
Jeśli twojej funkcji nie da się rozróżnić, powinieneś uważać na to, jak używasz różnic skończonych. Jeśli chcesz korzystać z informacji pochodnych, najlepszym rozwiązaniem jest prawdopodobnie jakaś półstosowna metoda typu Newtona. Zestaw notatek opisujących takie metody można znaleźć tutaj .
Od dwunastu do trzydziestu zmiennych jest prawdopodobnie na górnym końcu tego, co jest możliwe dzięki metodom wyszukiwania wzorców (zwanym także wyszukiwaniem bezpośrednim). Najnowszy artykuł przeglądowy Riosa i Sahinidisa w Journal of Global Optimization na temat metod optymalizacji wolnych od pochodnych (takich jak metody wyszukiwania wzorców) można znaleźć tutaj , wraz ze stroną towarzyszącą . Mniej aktualny artykuł przeglądowy na temat tych metod autorstwa Kolda, Lewisa i Torczona w SIAM Review można znaleźć tutaj . Metody te działają dość dobrze z kosztownymi ocenami funkcji i niekoniecznie wymagają różnicowania lub informacji pochodnych.
Wiele z tych metod wymaga pewnego rodzaju wypukłości, aby zagwarantować zbieżność z globalnym optimum, więc jeśli miałbyś rygorystycznie rozwiązać swój problem, może być konieczne połączenie tych metod powyżej ze strategią odgałęzienia. Jeśli jednak nie zależy ci na rygorze, takie podejście jak MATLAB
fmincon
może działać wystarczająco dobrze (nie ma już żadnych gwarancji). Skończone różnice najprawdopodobniej dadzą ci członka subfunkcji twojej niezróżnicowanej funkcji, co może wystarczyć dla twojego wystąpienia problemu i określonych danych wejściowych, aby zwrócić wystarczająco dokładny wynik dla twoich celów. W takim przypadku powinieneś prawdopodobnie spojrzeć na biblioteki wymienione w odpowiedziach na pytanie, które Christian powiązał w swoim komentarzu.źródło
Jeśli potrzebujesz tylko biblioteki C ++ do rozwiązywania problemów optymalizacji nieliniowej, możesz użyć RobOptim . Mimo że RobOptim został pierwotnie opracowany z myślą o problemach związanych z optymalizacją robotyki, nadaje się do wszelkich nieliniowych problemów optymalizacji. Zapewnia prosty interfejs C ++ z wtyczkami do wielu solverów nieliniowych ( Ipopt , NAG itp.). Korzystanie z tego rodzaju opakowań ułatwia korzystanie z innego solvera NLP. Jeśli nie możesz podać gradientów, obliczenia różnic skończonych można wykonać automatycznie.
Jest to oprogramowanie typu open source, dzięki czemu możesz sprawdzić kod źródłowy w GitHub: https://github.com/roboptim/
Analiza przeprowadzona przez @Geoff Oxberry jest niezbędna do wyboru solwera nieliniowego, który zostanie wywołany przez RobOptim. Zwróć uwagę, że w przypadku tego rodzaju rozwiązań, modyfikowanie parametrów może mieć ogromny wpływ na wydajność i nadal możesz utknąć w lokalnych minimach (tak naprawdę zależy to od rodzaju problemu, z którym masz do czynienia).
Uwaga: Jestem jednym z twórców tego projektu.
źródło