Trabalho em um laboratório que otimiza globalmente problemas com números mistos e não convexos. Minha experiência com os solucionadores de otimização de código aberto é que os melhores são tipicamente escritos em uma linguagem compilada e se saem mal em comparação com os pacotes de otimização comercial.
Se você pode formular seu problema como um sistema explícito de equações e precisar de um solucionador gratuito, sua melhor aposta é provavelmente o IPOPT, como disse Aron. Outros solucionadores gratuitos podem ser encontrados no site da COIN-OR . Que eu saiba, os solucionadores não lineares não têm ligações Python fornecidas pelos desenvolvedores; quaisquer ligações encontradas são de terceiros. Para obter boas soluções, você também teria que agrupar qualquer solucionador não linear e convexo encontrado nas heurísticas de otimização global estocástica apropriadas ou em um algoritmo determinístico de otimização global, como branch-and-bound. Como alternativa, você pode usar Bonmin ou Couenne, que são solucionadores determinísticos de otimização não convexos que funcionam de maneira útil em comparação com o solucionador de ponta, BARON .
Se você pode comprar um solucionador de otimização comercial, considere a linguagem de modelagem GAMS , que inclui vários solucionadores de otimização não lineares. De particular menção são as interfaces para os solucionadores CONOPT, SNOPT e BARON. (CONOPT e SNOPT são solucionadores convexos.) Uma solução kludgey que eu usei no passado é usar as ligações da linguagem Fortran (ou Matlab) ao GAMS para gravar um arquivo GAMS e chamar GAMS do Fortran (ou Matlab) para calcular o solução de um problema de otimização. O GAMS tem ligações de linguagem Python e uma equipe de suporte muito responsiva, disposta a ajudar se houver algum problema. (Isenção de responsabilidade: não tenho afiliação com o GAMS, mas meu laboratório possui uma licença do GAMS.) Os solucionadores comerciais não devem ser piores do quefmincon
; na verdade, eu ficaria surpreso se eles não fossem muito melhores. Se seus problemas forem suficientemente pequenos, talvez você nem precise comprar uma licença do GAMS e licenças para solucionadores, porque uma cópia de avaliação do GAMS pode ser baixada do site deles. Caso contrário, você provavelmente desejaria decidir quais solucionadores comprar em conjunto com uma licença do GAMS. Vale a pena notar que o BARON requer um solucionador de programação linear com números mistos e que as licenças dos dois melhores solucionadores de programação linear com números mistos CPLEX e GUROBI são gratuitas para acadêmicos, portanto, você pode se safar comprando apenas as interfaces GAMS. do que as interfaces e as licenças do solucionador, o que pode economizar bastante dinheiro.
Esse ponto merece ser repetido: para qualquer um dos solucionadores de otimização não-convexos determinísticos que mencionei acima, é necessário formular o modelo como um conjunto explícito de equações. Caso contrário, os algoritmos de otimização não convexos não funcionarão, porque todos eles dependem de análise simbólica para construir relaxações convexas para algoritmos de ramificação e vinculação.
ATUALIZAÇÃO: Um pensamento que não me ocorreu a princípio foi que você também poderia chamar o Toolkit for Advanced Optimization ( TAO ) e o PETSc usando tao4py e petsc4py , que teriam o benefício adicional de facilitar a paralelização e aproveitar a familiaridade com o PETSc e as ferramentas ACTS .
ATUALIZAÇÃO # 2: Com base nas informações adicionais que você mencionou, os métodos de programação quadrática seqüencial (SQP) serão sua melhor aposta. Os métodos SQP são geralmente considerados mais robustos que os métodos de pontos internos, mas têm a desvantagem de exigir soluções lineares densas. Como você se preocupa mais com robustez do que velocidade, o SQP será sua melhor aposta. Não consigo encontrar um bom solucionador de SQP por aí escrito em Python (e, aparentemente, nem Sven Leyffer em Argonne neste relatório técnico ). Estou supondo que os algoritmos implementados em pacotes como SciPy e OpenOpt tenham o esqueleto básico de alguns algoritmos SQP implementados, mas sem as heurísticas especializadas que os códigos mais avançados usam para superar problemas de convergência. Você pode tentar o NLopt, escrito por Steven Johnson no MIT. Eu não tenho grandes esperanças, porque ele não tem nenhuma reputação que eu conheço, mas Steven Johnson é um cara brilhante que escreve um bom software (afinal, ele co-escreveu FFTW). Ele implementa uma versão do SQP; se for um bom software, me avise.
Eu esperava que o TAO tivesse algo no caminho de um solucionador de otimização restrito, mas não tem. Você certamente poderia usar o que eles têm para criar um; eles têm muitos componentes lá. Como você apontou, no entanto, seria muito mais trabalhoso fazer isso e, se você estiver enfrentando esse tipo de problema, também poderá ser um desenvolvedor de TAO.
Com essas informações adicionais, é mais provável que você obtenha melhores resultados chamando o GAMS a partir do Python (se é que isso é uma opção) ou tentando corrigir a interface do IPOPT Python. Como o IPOPT usa um método de ponto interior, ele não será tão robusto, mas talvez a implementação de Andreas de um método de ponto interior seja consideravelmente melhor do que a implementação do SQP da Matlab; nesse caso, você pode não estar sacrificando a robustez. Você precisaria executar alguns estudos de caso para ter certeza.
Você já está ciente do truque para reformular as restrições de desigualdade racional como restrições de desigualdade polinomial (está no seu livro); a razão pela qual isso ajudaria a BARON e alguns outros solucionadores não-convexos é que ela pode usar a análise de termos para gerar desigualdades válidas adicionais que podem ser usadas como cortes para melhorar e acelerar a convergência do solucionador.
Excluindo as ligações do GAMS Python e a interface do Python para o IPOPT, a resposta é não, ainda não há nenhum solucionador de programação não-linear de alta qualidade para o Python. Talvez a @Dominique mude isso com o NLPy.
ATUALIZAÇÃO # 3: Mais tentativas malucas de encontrar um solucionador baseado em Python renderam o PyGMO , que é um conjunto de ligações do Python ao PaGMO, um solucionador de otimização multiobjetivo global baseado em C ++. Embora tenha sido criado para otimização multiobjetivo, também pode ser usado para programação não-linear objetiva e possui interfaces Python para IPOPT e SNOPT, entre outros solucionadores. Foi desenvolvido dentro da Agência Espacial Européia , então espero que haja uma comunidade por trás disso. Também foi lançado relativamente recentemente (24 de novembro de 2011).