Eu tenho vários problemas desafiadores de otimização global não convexa para resolver. Atualmente, uso o Optimization Toolbox do MATLAB (especificamente, fmincon()
com o algoritmo = 'sqp'
), o que é bastante eficaz . No entanto, a maior parte do meu código está em Python, e eu adoraria fazer a otimização em Python também. Existe um solucionador de PNL com ligações Python que possa competir fmincon()
? Isso deve
- ser capaz de lidar com restrições não-lineares de igualdade e desigualdade
- não exige que o usuário forneça um jacobiano.
Tudo bem se não garantir um ótimo global ( fmincon()
não). Estou procurando por algo que converge de maneira robusta para um ótimo local, mesmo para problemas desafiadores e mesmo que seja um pouco mais lento que isso fmincon()
.
Eu tentei vários dos solucionadores disponíveis no OpenOpt e os achei inferiores aos do MATLAB fmincon/sqp
.
Apenas para enfatizar, eu já tenho uma formulação tratável e um bom solucionador. Meu objetivo é apenas alterar idiomas para ter um fluxo de trabalho mais simplificado.
Geoff ressalta que algumas características do problema podem ser relevantes. Eles são:
- 10-400 variáveis de decisão
- 4-100 restrições de igualdade polinomial (o grau polinomial varia de 1 a cerca de 8)
- Um número de restrições de desigualdade racional igual a cerca do dobro do número de variáveis de decisão
- A função objetivo é uma das variáveis de decisão
O jacobiano das restrições de igualdade é denso, assim como o jacobiano das restrições de desigualdade.
fonte
Respostas:
fmincon()
, como você mencionou, emprega várias estratégias conhecidas na otimização não-linear que tentam encontrar um mínimo local sem muita consideração se o ideal global foi encontrado. Se você concorda com isso, acho que formulou a pergunta corretamente (otimização não linear).O melhor pacote que eu conheço para otimização não linear geral é o IPOPT [1]. Aparentemente, Matthew Xu mantém um conjunto de ligações de Python ao IPOPT , portanto, isso pode ser um ponto de partida.
[1]: Andreas Wachter é um amigo pessoal, então eu posso ser um pouco tendencioso.
fonte
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 que
fmincon
; 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).
fonte
Atualização: veja o novo pacote GEKKO que acabamos de lançar.
O APM Python é uma caixa de ferramentas de otimização gratuita que possui interfaces para APOPT, BPOPT, IPOPT e outros solucionadores. Ele fornece a primeira (jacobiana) e a segunda (hessiana) informações aos solucionadores e fornece uma interface da web opcional para visualizar os resultados. O cliente APM Python é instalado com o pip:
Também pode ser instalado em um script Python com:
Fizemos alguns testes de benchmark e descobrimos que a combinação de APOPT (método de conjunto ativo) e IPOPT (método de ponto interior) pode resolver uma grande porcentagem de problemas de benchmark. Há vários problemas de exemplo incluídos no arquivo zip de download. O que você provavelmente desejará começar é o problema de Hock Schittkowski # 71. É o exemplo mais simples e demonstra como resolver problemas de otimização restritos.
Existe uma interface do navegador e uma API para Python / MATLAB. A API para Python é um script único (apm.py) disponível para download na página inicial do apmonitor.com. Depois que o script é carregado em um código Python, ele oferece a capacidade de resolver problemas de:
Para o novo usuário, o software APM Python possui um fórum dos Grupos do Google onde um usuário pode postar perguntas. Existem webinars que mostram problemas de otimização em pesquisa e engenharia de operações.
Abaixo está um exemplo de um problema de otimização (hs71.apm).
O problema de otimização é resolvido com o seguinte script Python:
O APM Python é um serviço da web gratuito para otimização. Os problemas de otimização são resolvidos em servidores remotos e os resultados são retornados ao script Python local. Um servidor local do APMonitor também está disponível para download, para que não seja necessária uma conexão com a Internet ( servidor de download ). Recentemente, adicionamos suporte ao processamento paralelo para MATLAB e Python. O módulo Python é compatível com Python 2.7 ou Python 3+.
fonte
Embora isso não responda inteiramente à sua pergunta, eu crio um pacote Python para programação não-linear chamado NLPy. A versão mais recente pode ser recuperada em https://github.com/dpo/nlpy
Devo enfatizar que o NLPy é de nível de pesquisa e os solucionadores incluídos não são tão robustos quanto os códigos mais experientes, como o IPOPT. Além disso, eles atualmente exigem que os jacobianos sejam fornecidos. Dito isto, o objetivo do NLPy é fornecer as ferramentas necessárias para que os pesquisadores montem solucionadores personalizados, se necessário. De qualquer forma, estou interessado em ouvir seus comentários off-line, se você tentar. Você também pode encontrar os pacotes relacionados https://github.com/dpo/pykrylov e https://github.com/dpo/pyorder úteis. Atualmente, a documentação do NLPy está definitivamente ausente. Os outros dois devem ser razoáveis.
fonte
pyomo é um ambiente de modelagem completo do tipo GAMS / AMPL para otimização em python. É extremamente poderoso, possui interfaces para todos os solucionadores suportados pela AMPL e gera jacobianos etc. automaticamente. No entanto, devido à execução em um 'ambiente virtual de python', pode não ser trivial vinculá-lo ao código existente.
fonte
Lançamos recentemente (2018) o pacote GEKKO Pythonpara programação não linear com solucionadores como IPOPT, APOPT, BPOPT, MINOS e SNOPT com métodos ativos de set e point interior. Um dos problemas com o uso desses solucionadores é que você normalmente precisa fornecer pelo menos as primeiras derivadas e, opcionalmente, as segundas derivadas. Existem várias linguagens de modelagem agradáveis que podem fazer isso por você, como mencionado em outras respostas. O GEKKO compila as equações para codificar em bytes, para que seja como você escreveu o modelo em Fortran ou C ++ em termos de velocidade. A diferenciação automática fornece as 1ª e 2ª derivadas de forma esparsa para os solucionadores baseados em gradiente. Projetamos o GEKKO para otimizar os problemas de controle, mas também pode resolver problemas semelhantes ao fmincon. Abaixo está um exemplo rápido de um problema de programação não linear com restrições de igualdade e desigualdade. Primeiro você'
O problema de Hock Schittkowski nº 71 é mostrado abaixo como um exemplo de uma função objetiva, restrição de desigualdade, restrição de igualdade e quatro variáveis com limites superior e inferior.
O GEKKO funciona em todas as plataformas (processadores Windows, MacOS, Linux, ARM) e com Python 2.7 e 3+. Uma opção totalmente local está disponível sem conexão à Internet, configurando a opção "remote = False". No momento, a opção local está disponível apenas para Windows e estamos trabalhando em outras versões, como Linux, MacOS, processadores ARM, para execução local sem conexão à Internet. A versão local inclui apenas resolvedores gratuitos que não exigem uma licença. Por padrão, o problema é enviado para um servidor público em que a solução é calculada e retornada ao Python.
Embora essa pergunta seja especificamente sobre a solução de programação não-linear no Python, também destacarei alguns outros tipos de problemas que o GEKKO pode resolver e alguns recursos para aprender a otimizar. O GEKKO também resolve equações algébricas diferenciais e inteiras mistas e possui vários objetos pré-programados para controles avançados (semelhantes ao DMC, RMPCT, etc.). Os modos de operação incluem reconciliação de dados, otimização em tempo real, simulação dinâmica e controle preditivo não linear.
Dou dois cursos de otimização (otimização de design e otimização dinâmica ) e publiquei o material do curso on-line. O curso de otimização dinâmica é oferecido todos os anos a partir de janeiro e usamos o pacote GEKKO Python (e MATLAB) para o curso. O GEKKO é uma extensão do APMonitor Optimization Suite, mas integrou a modelagem e a visualização da solução diretamente no Python. As referências do APMonitor e GEKKO fornecem uma amostra dos tipos de aplicativos que podem ser resolvidos com este pacote. O GEKKO é desenvolvido sob o subsídio de pesquisa da National Science Foundation # 1547110 .
fonte
E quanto ao scipy.fmin_slsqp?
http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_slsqp.html
fonte
O PyGMO contém vários solucionadores, fornecendo a mesma interface para eles. O IPOPT e o scipy slsqp estão incluídos caso você compile o código e faça o download / instale o código de terceiros independentemente.
Como um bônus, o uso paralelo do solucionador é muito fácil (com várias etapas) através da classe arquipélago!
fonte
Existe o cvxmod , um wrapper Python em torno do software de otimização convexa de Stephen Boyd. Faz parte do pacote Sage .
fonte
Agora o fmincon pode ser usado no Python via estrutura OpenOpt, opcionalmente com diferenciação automática densa / esparsa pelo FuncDesigner http://openopt.org/fmincon
fonte
fonte
O salto da bacia via scipy é suficiente para suas necessidades? Se retornar um min local e não um min global, você poderá alterar o número de iterações e / ou aplicar limites.
fonte
E o CMA-ES? Possui ligações Python e é adequado para problemas de otimização não-lineares e não-convexos, e já o usei bastante: https://www.lri.fr/~hansen/cmaesintro.html
Instalação através do pip:
Aqui está um exemplo de código do site:
fonte
Como o MATLAB possui um compilador JIT, enquanto o CPython ainda não (pelo menos até o pypy obter suporte total ao numpy). Parece que você deseja um solucionador gratuito que supere o produzido comercialmente
fmincon
. Não é demais?Segundo o IIRC entre os solucionadores comerciais de PNL, apenas o snopt forneceu uma API Python até agora (embora seja bastante feia).
Quais solucionadores OpenOpt você já tentou? Quantas variáveis e restrições você possui em sua tarefa não-convexa?
Você pode experimentar o IPOPT através da API do OpenOpt / Funcdesigner sem instalar no servidor OpenOpt Sage (preste atenção à imagem "alternar do sage para o python").
fonte
para problemas globais, você pode estar interessado em http://openopt.org/interalg e outros solucionadores globais da openopt (http://openopt.org/GLP) para otimização local O openopt também oferece uma variedade de solucionadores: http://openopt.org / PNL
fonte
É bom mencionar aqui que o solucionador do Google Ceres é realmente um otimizador não linear muito poderoso, usado em muitos projetos.
Há também um wrapper python disponível aqui: https://github.com/rll/cyres
fonte
O KNITRO possui interfaces Python e MATLAB, entre outras. Pense nisso como um substituto do FMINCON, mas com desempenho muito melhor e mais caro. https://www.artelys.com/en/optimization-tools/knitro#doc-tab .
Sou usuário do KNITRO, mas não sou afiliado ao produto.
fonte