Я работаю в лаборатории, которая занимается глобальной оптимизацией смешанно-целочисленных и невыпуклых задач. Мой опыт работы с решателями оптимизации с открытым исходным кодом заключался в том, что лучшие из них, как правило, написаны на скомпилированном языке, и они оказываются хуже по сравнению с коммерческими пакетами оптимизации.
Если вы можете сформулировать свою задачу в виде явной системы уравнений и вам нужен свободный решатель, то, как сказал Арон, вам лучше всего выбрать IPOPT. Другие бесплатные решатели можно найти на веб-сайте COIN-OR . Насколько мне известно, нелинейные решатели не имеют привязки Python, предоставленные разработчиками; любые привязки, которые вы найдете, будут сторонними. Чтобы получить хорошие решения, вы также должны были бы обернуть любой нелинейный выпуклый решатель, который вы нашли в соответствующей стохастической эвристике глобальной оптимизации или в детерминированном алгоритме глобальной оптимизации, таком как ветвление и ограничение. В качестве альтернативы вы могли бы использовать Bonmin или Couenne, оба из которых являются детерминированными невыпуклыми решателями оптимизации, которые хорошо работают по сравнению с современным решателем BARON .
Если вы можете приобрести коммерческий решатель оптимизации, вы можете рассмотреть язык моделирования GAMS , который включает в себя несколько решателей нелинейной оптимизации. Особо следует отметить интерфейсы для решателей CONOPT, SNOPT и BARON. (CONOPT и SNOPT являются выпуклыми решателями.) Клуджевое решение, которое я использовал в прошлом, заключается в использовании привязок языка Fortran (или Matlab) к GAMS для написания файла GAMS и вызова GAMS из Fortran (или Matlab) для вычисления решение задачи оптимизации. GAMS имеет привязки к языку Python и очень отзывчивый персонал поддержки, готовый помочь, если возникнут проблемы. (Отказ от ответственности: я не имею отношения к GAMS, но моя лаборатория действительно имеет лицензию GAMS.) Коммерческие решатели должны быть не хуже, чемfmincon
; на самом деле, я бы удивился, если бы они не были намного лучше. Если ваши проблемы достаточно малы по размеру, вам может даже не понадобиться приобретать лицензию GAMS и лицензии для решателей, поскольку ознакомительную копию GAMS можно загрузить с их веб-сайта. В противном случае вы, вероятно, захотите решить, какие решатели приобрести вместе с лицензией GAMS. Стоит отметить, что BARON требует смешанного целочисленного решения для линейного программирования, и что лицензии на два лучших смешанных целочисленных решения для линейного программирования CPLEX и GUROBI бесплатны для академиков, так что вы можете просто обойтись без покупки только интерфейсов GAMS. чем интерфейсы и решающие лицензии, которые могут сэкономить вам немало денег.
Этот пункт повторяется: для любого из детерминированных невыпуклых решателей оптимизации, о которых я упоминал выше, вы должны быть в состоянии сформулировать модель как явный набор уравнений. В противном случае невыпуклые алгоритмы оптимизации не будут работать, потому что все они полагаются на символический анализ для построения выпуклых релаксаций для алгоритмов типа ветвей и границ.
ОБНОВЛЕНИЕ: Одна мысль, которая сначала не пришла мне в голову, заключалась в том, что вы также можете вызывать Инструментарий для расширенной оптимизации ( TAO ) и PETSc, используя tao4py и petsc4py , что могло бы принести дополнительное преимущество в виде упрощения распараллеливания и использования знакомства с PETSc. и инструменты ACTS .
ОБНОВЛЕНИЕ № 2: На основании упомянутой вами дополнительной информации, методы последовательного квадратичного программирования (SQP) будут вашим лучшим выбором. Методы SQP обычно считаются более надежными, чем методы внутренней точки, но они имеют недостаток, заключающийся в необходимости плотных линейных решений. Так как вы больше заботитесь о надежности, чем о скорости, SQP будет вашим лучшим выбором. Я не могу найти хорошего решателя SQP там, написанного на Python (и, по-видимому, в этом техническом отчете Свен Лейффер из Аргонна тоже не смог ). Я предполагаю, что алгоритмы, реализованные в таких пакетах, как SciPy и OpenOpt, имеют основной каркас некоторых реализованных алгоритмов SQP, но без специальной эвристики, которую используют более продвинутые коды для преодоления проблем сходимости. Вы можете попробовать NLopt, написанный Стивеном Джонсоном в MIT. Я не возлагаю на это больших надежд, потому что у него нет репутации, о которой я знаю, но Стивен Джонсон - замечательный парень, который пишет хорошее программное обеспечение (в конце концов, он соавтор FFTW). Он реализует версию SQP; если это хорошее программное обеспечение, дайте мне знать.
Я надеялся, что у TAO будет что-то вроде ограниченного решения для оптимизации, но это не так. Вы, конечно, можете использовать то, что они должны создать; у них там много компонентов. Однако, как вы указали, для вас было бы гораздо больше работы, и, если вы столкнетесь с подобными проблемами, вы с таким же успехом можете стать разработчиком TAO.
С этой дополнительной информацией вы, скорее всего, получите лучшие результаты, вызывая GAMS из Python (если это вообще возможно) или пытаясь исправить интерфейс Python IPOPT. Поскольку IPOPT использует метод внутренней точки, он не будет таким надежным, но, возможно, реализация Андреасом метода внутренней точки значительно лучше, чем реализация SQP в Matlab, и в этом случае вы можете вообще не жертвовать устойчивостью. Вы должны были бы провести некоторые тематические исследования, чтобы знать наверняка.
Вы уже знаете, как переформулировать ограничения рационального неравенства как ограничения полиномиального неравенства (это в вашей книге); Причина, по которой это поможет BARON и некоторым другим невыпуклым решателям, заключается в том, что он может использовать анализ терминов для генерации дополнительных допустимых неравенств, которые он может использовать в качестве сокращений для улучшения и ускорения сходимости решателя.
Исключая привязки GAMS Python и интерфейс Python к IPOPT, ответ - нет, пока еще нет высококачественных решателей нелинейного программирования для Python. Может быть @Dominique изменит это с NLPy.
ОБНОВЛЕНИЕ № 3: Более неожиданные попытки найти решатель на основе Python привели к появлению PyGMO , который представляет собой набор привязок Python к PaGMO, глобальному многоцелевому решателю оптимизации на основе C ++. Хотя он был создан для многоцелевой оптимизации, он также может быть использован для единого объективного нелинейного программирования и имеет интерфейсы Python для IPOPT и SNOPT, среди других решателей. Он был разработан в рамках Европейского космического агентства , так что, надеюсь, за этим стоит сообщество. Это было также выпущено относительно недавно (24 ноября 2011).