Trabajo en un laboratorio que hace la optimización global de problemas de enteros mixtos y no convexos. Mi experiencia con los solucionadores de optimización de código abierto ha sido que los mejores suelen estar escritos en un lenguaje compilado, y tienen un rendimiento pobre en comparación con los paquetes de optimización comercial.
Si puede formular su problema como un sistema explícito de ecuaciones y necesita un solucionador gratuito, su mejor opción es probablemente IPOPT, como dijo Aron. Se pueden encontrar otros solucionadores gratuitos en el sitio web COIN-OR . Que yo sepa, los solucionadores no lineales no tienen enlaces Python proporcionados por los desarrolladores; cualquier enlace que encuentre sería de terceros. Para obtener buenas soluciones, también deberá envolver cualquier solucionador convexo no lineal que haya encontrado en las heurísticas estocásticas de optimización global apropiadas, o en un algoritmo de optimización global determinista como ramificar y vincular. Alternativamente, podría usar Bonmin o Couenne, los cuales son solucionadores de optimización no convexos deterministas que funcionan muy bien en comparación con el solucionador de vanguardia, BARON .
Si puede comprar un solucionador de optimización comercial, puede considerar mirar el lenguaje de modelado GAMS , que incluye varios solucionadores de optimización no lineales. De particular mención son las interfaces para los solucionadores CONOPT, SNOPT y BARON. (CONOPT y SNOPT son solucionadores convexos). Una solución kludgey que he usado en el pasado es usar los enlaces de lenguaje Fortran (o Matlab) a GAMS para escribir un archivo GAMS y llamar a GAMS desde Fortran (o Matlab) para calcular el Solución de un problema de optimización. GAMS tiene enlaces de lenguaje Python y un personal de soporte muy receptivo dispuesto a ayudar si hay algún problema. (Descargo de responsabilidad: no estoy afiliado a GAMS, pero mi laboratorio posee una licencia de GAMS). Los solucionadores comerciales no deberían ser peores quefmincon
; De hecho, me sorprendería que no fueran mucho mejores. Si sus problemas son lo suficientemente pequeños, entonces es posible que ni siquiera necesite comprar una licencia GAMS y licencias para solucionadores, porque se puede descargar una copia de evaluación de GAMS de su sitio web. De lo contrario, es probable que desee decidir qué solucionadores comprar junto con una licencia GAMS. Vale la pena señalar que BARON requiere un solucionador de programación lineal de enteros mixtos, y que las licencias para los dos mejores solucionadores de programación lineal de enteros mixtos CPLEX y GUROBI son gratuitos para académicos, por lo que es posible que pueda salirse con la compra de las interfaces GAMS. que las interfaces y las licencias de solucionador, que pueden ahorrarle bastante dinero.
Este punto vale la pena repetir: para cualquiera de los solucionadores de optimización deterministas no convexos que he mencionado anteriormente, debe poder formular el modelo como un conjunto explícito de ecuaciones. De lo contrario, los algoritmos de optimización no convexos no funcionarán, porque todos ellos se basan en análisis simbólicos para construir relajaciones convexas para algoritmos similares a ramas y límites.
ACTUALIZACIÓN: Un pensamiento que no se me había ocurrido al principio era que también podría llamar al Kit de herramientas para la optimización avanzada ( TAO ) y PETSc usando tao4py y petsc4py , lo que tendría el beneficio adicional de una paralelización más fácil y una mayor familiaridad con PETSc y las herramientas ACTS .
ACTUALIZACIÓN # 2: Según la información adicional que mencionó, los métodos de programación cuadrática secuencial (SQP) serán su mejor opción. Los métodos SQP generalmente se consideran más robustos que los métodos de punto interior, pero tienen el inconveniente de requerir soluciones lineales densas. Como te importa más la robustez que la velocidad, SQP será tu mejor opción. No puedo encontrar un buen solucionador de SQP por ahí escrito en Python (y aparentemente, tampoco podría Sven Leyffer en Argonne en este informe técnico ). Supongo que los algoritmos implementados en paquetes como SciPy y OpenOpt tienen implementado el esqueleto básico de algunos algoritmos SQP, pero sin la heurística especializada que utilizan los códigos más avanzados para superar los problemas de convergencia. Podrías probar NLopt, escrito por Steven Johnson en el MIT. No tengo muchas esperanzas porque no tengo ninguna reputación que yo sepa, pero Steven Johnson es un tipo brillante que escribe un buen software (después de todo, coescribió FFTW). Implementa una versión de SQP; si es un buen software, hágamelo saber.
Esperaba que TAO tuviera algo en el camino de un solucionador de optimización restringido, pero no lo tiene. Ciertamente podrías usar lo que tienen para construir uno; Tienen muchos componentes allí. Sin embargo, como señaló, sería mucho más trabajo para usted hacer eso, y si tiene ese tipo de problemas, también podría ser un desarrollador de TAO.
Con esa información adicional, es más probable que obtenga mejores resultados llamando a GAMS desde Python (si es que es una opción), o tratando de parchear la interfaz IPOPT Python. Dado que IPOPT utiliza un método de punto interior, no será tan robusto, pero tal vez la implementación de Andreas de un método de punto interior es considerablemente mejor que la implementación de SQP de Matlab, en cuyo caso, es posible que no esté sacrificando la robustez en absoluto. Tendría que ejecutar algunos estudios de caso para saber con certeza.
Ya conoces el truco para reformular las restricciones de desigualdad racional como restricciones de desigualdad polinomiales (está en tu libro); La razón por la que esto ayudaría a BARON y a otros solucionadores no convexos es que puede usar el análisis de términos para generar desigualdades válidas adicionales que puede usar como cortes para mejorar y acelerar la convergencia del solucionador.
Excluyendo los enlaces Python de GAMS y la interfaz de Python a IPOPT, la respuesta es no, todavía no hay solucionadores de programación no lineal de alta calidad para Python. Quizás @Dominique cambie eso con NLPy.
ACTUALIZACIÓN # 3: Más puñaladas salvajes para encontrar un solucionador basado en Python produjeron PyGMO , que es un conjunto de enlaces de Python a PaGMO, un solucionador de optimización multiobjetivo global basado en C ++. Aunque fue creado para la optimización multiobjetivo, también se puede utilizar para la programación no lineal de un solo objetivo, y tiene interfaces Python para IPOPT y SNOPT, entre otros solucionadores. Fue desarrollado dentro de la Agencia Espacial Europea , por lo que es de esperar que haya una comunidad detrás. También fue lanzado relativamente recientemente (24 de noviembre de 2011).