Pracuję w laboratorium, które zajmuje się globalną optymalizacją problemów z liczbami całkowitymi i niewypukłymi. Moje doświadczenie z rozwiązaniami optymalizacyjnymi typu open source polegało na tym, że lepsze są zazwyczaj pisane w skompilowanym języku i mają się gorzej w porównaniu z komercyjnymi pakietami optymalizacyjnymi.
Jeśli potrafisz sformułować swój problem jako jawny układ równań i potrzebujesz darmowego rozwiązania, najlepszym wyborem jest prawdopodobnie IPOPT, jak powiedział Aron. Inne bezpłatne solwery można znaleźć na stronie internetowej COIN-OR . Według mojej wiedzy, nieliniowe solwery nie mają powiązań Pythona dostarczonych przez programistów; wszelkie znalezione wiązania byłyby stronami trzecimi. Aby uzyskać dobre rozwiązania, musiałbyś również owinąć dowolny nieliniowy, wypukły solver znaleziony w odpowiedniej stochastycznej heurystyce optymalizacji globalnej lub w deterministycznym algorytmie optymalizacji globalnej, takim jak rozgałęzienie i ograniczenie. Alternatywnie, możesz użyć Bonmin lub Couenne, z których oba są deterministycznymi niewypukłymi solverami optymalizacyjnymi, które działają sprawnie dobrze w porównaniu do najnowocześniejszego solvera BARON .
Jeśli możesz kupić komercyjny solver optymalizacyjny, możesz rozważyć spojrzenie na język modelowania GAMS , który zawiera kilka nieliniowych solverów optymalizacyjnych. Na szczególną uwagę zasługują interfejsy do solverów CONOPT, SNOPT i BARON. (CONOPT i SNOPT są wypukłymi rozwiązaniami.) Kludgey rozwiązaniem, którego użyłem w przeszłości, jest użycie powiązań językowych Fortran (lub Matlab) z GAMS w celu napisania pliku GAMS i wywołania GAMS z Fortran (lub Matlab) w celu obliczenia rozwiązanie problemu optymalizacji. GAMS ma powiązania z językiem Python i bardzo szybko reagujący personel pomocniczy chętny do pomocy w razie problemów. (Oświadczenie: Nie mam powiązań z GAMS, ale moje laboratorium posiada licencję GAMS). Rozwiązania komercyjne nie powinny być gorsze niżfmincon
; w rzeczywistości byłbym zaskoczony, gdyby nie były o wiele lepsze. Jeśli Twoje problemy są wystarczająco małe, może nie być nawet konieczne wykupienie licencji GAMS i licencji na solwery, ponieważ kopię testową GAMS można pobrać z ich witryny internetowej. W przeciwnym razie prawdopodobnie zdecydujesz, które solwery kupić w połączeniu z licencją GAMS. Warto zauważyć, że BARON wymaga rozwiązania do programowania liniowego z mieszanymi liczbami całkowitymi oraz że licencje na dwa najlepsze rozwiązania do programowania liniowego z mieszanymi liczbami całkowitymi CPLEX i GUROBI są bezpłatne dla naukowców, więc możesz być w stanie uciec po prostu kupując interfejsy GAMS niż interfejsy i licencje na solver, co może zaoszczędzić sporo pieniędzy.
Należy powtórzyć ten punkt: w przypadku każdego deterministycznego niewypukłego rozwiązania optymalizacyjnego, o którym wspomniałem powyżej, musisz mieć możliwość sformułowania modelu jako jawnego zestawu równań. W przeciwnym razie nie wypukłe algorytmy optymalizacji nie będą działać, ponieważ wszystkie z nich opierają się na analizie symbolicznej do tworzenia wypukłych relaksacji dla algorytmów rozgałęzionych i powiązanych.
AKTUALIZACJA: Jedną z myśli, które na początku mi nie przyszło do głowy, było to, że można również zadzwonić do Toolkit for Advanced Optimization ( TAO ) i PETSc przy użyciu tao4py i petsc4py , co miałoby potencjalnie dodatkową zaletę łatwiejszej równoległości i wykorzystania znajomości PETSc oraz narzędzia ACTS .
AKTUALIZACJA # 2: W oparciu o dodatkowe informacje, o których wspomniałeś, najlepsze będą metody sekwencyjnego programowania kwadratowego (SQP). Metody SQP są ogólnie uważane za bardziej niezawodne niż metody punktów wewnętrznych, ale mają tę wadę, że wymagają gęstych rozwiązań liniowych. Ponieważ bardziej zależy Ci na solidności niż szybkości, SQP będzie najlepszym wyborem. Nie mogę znaleźć dobrego rozwiązania SQP napisanego w Pythonie (i najwyraźniej Sven Leyffer nie był w Argonne w tym raporcie technicznym ). Zgaduję, że algorytmy zaimplementowane w pakietach takich jak SciPy i OpenOpt mają zaimplementowany podstawowy szkielet niektórych algorytmów SQP, ale bez specjalistycznej heurystyki, której używają bardziej zaawansowane kody w celu przezwyciężenia problemów konwergencji. Możesz spróbować NLopt, napisany przez Stevena Johnsona z MIT. Nie mam na to wielkiej nadziei, ponieważ nie ma żadnej znanej mi reputacji, ale Steven Johnson jest genialnym facetem, który pisze dobre oprogramowanie (w końcu był współautorem FFTW). Implementuje wersję SQP; jeśli to dobre oprogramowanie, daj mi znać.
Miałem nadzieję, że TAO będzie miało coś w rodzaju ograniczonego solvera optymalizacyjnego, ale tak nie jest. Z pewnością możesz użyć tego, co mają zbudować; mają tam wiele komponentów. Jak już zauważyłeś, byłoby to o wiele więcej pracy, a jeśli masz takie kłopoty, równie dobrze możesz być programistą TAO.
Dzięki tym dodatkowym informacjom istnieje większe prawdopodobieństwo, że uzyskasz lepsze wyniki, wywołując GAMS z Pythona (jeśli w ogóle jest to opcja) lub próbując załatać interfejs Python IPOPT. Ponieważ IPOPT używa metody punktu wewnętrznego, nie będzie tak solidna, ale być może implementacja metody punktu wewnętrznego Andreasa jest znacznie lepsza niż implementacja SQP przez Matlaba, w którym to przypadku możesz wcale nie poświęcać solidności. Aby mieć pewność, musiałbyś przeprowadzić kilka studiów przypadku.
Znasz już sztuczkę przeformułowania ograniczeń racjonalnej nierówności jako wielomianowych ograniczeń nierówności (jest to w twojej książce); powodem, dla którego pomogłoby to BARON i niektórym innym niep wypukłym rozwiązaniom jest to, że może on używać analizy terminów do generowania dodatkowych prawidłowych nierówności, które może wykorzystać jako cięcia w celu poprawy i przyspieszenia konwergencji rozwiązania.
Wyłączając powiązania GAMS Python i interfejs Pythona do IPOPT, odpowiedź brzmi nie, nie ma jeszcze wysokiej jakości nieliniowych solverów programistycznych dla Pythona. Może @Dominique zmieni to dzięki NLPy.
AKTUALIZACJA # 3: Więcej dzikich prób znalezienia rozwiązania opartego na Pythonie przyniosło PyGMO , który jest zestawem powiązań Pythona z PaGMO, globalnym wielozadaniowym rozwiązaniem optymalizacyjnym opartym na C ++. Chociaż został stworzony do optymalizacji wieloobiektywowej, może być również używany do jednoprzedmiotowego programowania nieliniowego i ma interfejsy Python do IPOPT i SNOPT, między innymi. Został opracowany w ramach Europejskiej Agencji Kosmicznej , więc mam nadzieję, że stoi za tym społeczność. Został również wydany stosunkowo niedawno (24 listopada 2011 r.).