Existe um solucionador de programação não-linear de alta qualidade para Python?

77

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.

David Ketcheson
fonte
2
David, infelizmente, essa é agora uma questão completamente diferente :) A diferença entre o mínimo local e o global é o assunto de um número infinito potencial de PhDs e, pelo Teorema Sem Almoço Gratuito, qualquer solucionador que seja bom para um problema geral de otimização global é comprovadamente ruim para outro. Eu poderia sugerir que você comece a considerar opções de formulação (Existe uma forma inteira mista existe uma aproximação convexo?)
Aron Ahmadia
David, Aron faz um bom argumento. Definitivamente, a formulação é fundamental em termos de obtenção de soluções numéricas de PNL não convexas, sem falar em obter boas soluções rapidamente. Pode valer a pena considerar formulações alternativas e, em seguida, usar a estrutura dessas formulações para orientar sua escolha do solucionador. Usar um solucionador que explora qualquer estrutura (como escassez, programação estocástica em vários estágios, usando restrições para gerar cortes) que você pode induzir no seu problema é essencial para obter boas soluções.
amigos estão dizendo sobre geoff
@ David David Ketcheson: Como você tem uma formulação que deseja usar, você poderia ao menos comentar sobre as características da sua formulação? O jacobiano do lagrangiano é denso ou escasso? Aproximadamente quantas variáveis ​​ele possui? Não adianta recomendar software que implemente métodos de solução inadequados para o seu problema, e essa é a única razão pela qual as pessoas estão falando sobre formulações em primeiro lugar.
Geoff Oxberry
coopr fornece ligação a ipopt usando asl: ipopt
denfromufa

Respostas:

32

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.

Aron Ahmadia
fonte
Andreas faz um bom trabalho, mas seu solucionador também requer informações da matriz jacobiana (ou, pelo menos, informações esparsas para a matriz jacobiana). Quando você diz que deseja um solucionador que não exija uma matriz jacobiana, quer dizer que deseja um solucionador que não exija o fornecimento analítico da matriz jacobiana (para que um cálculo de diferença finita seja suficiente) ou você deseja um solucionador que não requer informações da matriz jacobiana (o que limitaria você a métodos de otimização sem derivadas)?
amigos estão dizendo sobre geoff
Boa pegada. Quero dizer o primeiro; Eu atualizei a pergunta.
David Ketcheson
Finalmente pude aplicar o IPOPT ao meu problema usando o sage.openopt.org . É ótimo!
David Ketcheson
4
Hoje (2017) você também pode usar o IPOPT no Python através do Pyomo . Você obtém uma linguagem de modelagem algébrica e diferenças automáticas para o jacobiano e o hessiano.
Antonello
@Antonello o link corrigido é pyomo.org
Moonwalker
37

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).

Geoff Oxberry
fonte
observe PaGMO é licenciado sob a GPL
denfromufa
14

APM Python

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:

 pip install APMonitor

Também pode ser instalado em um script Python com:

try:
    from APMonitor.apm import *
except:
    # Automatically install APMonitor
    import pip
    pip.main(['install','APMonitor'])
    from APMonitor.apm import *

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:

  • Equações não lineares
  • Programação não linear inteira mista
  • Equações diferenciais e algébricas
  • Modelo de mínimos quadrados
  • Estimação de horizonte móvel
  • Controle preditivo de modelo não linear
  • etc.

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).

Model
  Variables
    x[1] = 1, >=1, <=5
    x[2] = 5, >=1, <=5
    x[3] = 5, >=1, <=5
    x[4] = 1, >=1, <=5
  End Variables

  Equations
    x[1] * x[2] * x[3] * x[4] > 25
    x[1]^2 + x[2]^2 + x[3]^2 + x[4]^2 = 40

    minimize  x[1] * x[4] * (x[1]+x[2]+x[3]) + x[3]
  End Equations
End Model

O problema de otimização é resolvido com o seguinte script Python:

from APMonitor.apm import *
server = 'http://byu.apmonitor.com'

# Application name
app = 'eqn'

# Clear previous application
apm(server,app,'clear all')

# Load model file
apm_load(server,app,'hs71.apm')

# Option to select solver (1=APOPT, 2=BPOPT, 3=IPOPT)
apm_option(server,app,'nlc.solver',3)

# Solve on APM server
solver_output = apm(server,app,'solve')

# Display solver output
print(solver_output)

# Retrieve results
results = apm_sol(server,app)

# Display results
print('--- Results of the Optimization Problem ---')
print(results)

# Display Results in Web Viewer 
url = apm_var(server,app)
print("Opened Web Viewer: " + url)

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+.

John Hedengren
fonte
2
John, vejo que o APM Python está disponível gratuitamente, mas não consigo descobrir ao analisar o pacote se ele contém solucionadores que ele usa localmente ou requer uma conexão com o site do AP Monitor para fazer os cálculos. Estou curioso para saber qual.
Aron Ahmadia
3
Aron, os scripts MATLAB ou Python requerem uma conexão com a Internet para os servidores APM para resolver os problemas de otimização. Isso tem várias vantagens e desvantagens. Do lado positivo, um serviço da Web para otimização permite compatibilidade entre plataformas, acesso gratuito a alguns solucionadores comerciais e atualizações de software transparentes para o usuário. Por outro lado, o APM não é tão flexível quanto algumas alternativas de código aberto, mas foi projetado para usuários industriais que preferem uma solução pronta para aplicativos de otimização.
John Hedengren
@JohnHedengren Tenho certas pré-computações no MATLAB usando outra biblioteca para construir o problema de otimização em si, principalmente, as restrições envolvem essas chamadas externas. Você acha que o APM ainda é adequado para esse fim?
Gpavanb
Eu acho que o termo comum para isso é otimização de caixa preta.
gpavanb
@gpavanb O pacote APMonitor exige que as equações sejam escritas na linguagem de modelagem. Uma opção para carregar código externo é criar um objeto que forneça resíduos e pelo menos as primeiras derivadas analíticas. Normalmente, codificamos esses objetos no F90 para obter velocidade como as listadas aqui: apmonitor.com/wiki/index.php/Main/Objects Não acho que o APMonitor seja a melhor opção para um aplicativo com otimização de blackbox.
John Hedengren
7

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.

Dominique
fonte
7

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.

Hans
fonte
5

GEKKO Python

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ê'

pip install gekko

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.

from gekko import GEKKO
m = GEKKO() # Initialize gekko
# Initialize variables
x1 = m.Var(value=1,lb=1,ub=5)
x2 = m.Var(value=5,lb=1,ub=5)
x3 = m.Var(value=5,lb=1,ub=5)
x4 = m.Var(value=1,lb=1,ub=5)
# Equations
m.Equation(x1*x2*x3*x4>=25)
m.Equation(x1**2+x2**2+x3**2+x4**2==40)
m.Obj(x1*x4*(x1+x2+x3)+x3) # Objective
m.options.IMODE = 3 # Steady state optimization
m.solve() # Solve
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))    

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 .

John Hedengren
fonte
Você poderia editar sua resposta para explicar como o seu software atende aos requisitos específicos mencionados na publicação? Caso contrário, isso se parecerá mais com uma publicação geral do anúncio do que com uma resposta à pergunta (e provavelmente será fechada).
Christian Clason
Cristão, editei a resposta para ser mais específico à pergunta. Mudei as informações adicionais sobre a GEKKO e os cursos on-line para o final, mas posso removê-las, se necessário.
John Hedengren
4

E quanto ao scipy.fmin_slsqp?

http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_slsqp.html

Alejandro
fonte
1
Obrigado, mas esse foi o que eu tentei (através do OpenOpt, que fornece uma interface adicional). Nunca foi melhor que o fmincon / sqp e falhou em muitos casos em que o último foi bem-sucedido.
David Ketcheson
1
Atualização: Eu tentei este diretamente do SciPy. Ele falha mesmo em problemas nos quais o fmincon é capaz de encontrar consistentemente o ideal global em poucos segundos.
David Ketcheson
4

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!

Dario Izzo
fonte
3

Existe o cvxmod , um wrapper Python em torno do software de otimização convexa de Stephen Boyd. Faz parte do pacote Sage .

John D. Cook
fonte
Mas o OP está perguntando sobre um problema de otimização não convexo.
27411 Alejandro
1
O OP está perguntando sobre um problema de otimização não convexo, mas todos os solucionadores mencionados até agora só garantem encontrar soluções ótimas para epsilon para problemas de otimização convexos sem metaheurísticas adicionais (multipartição ou outros algoritmos de otimização global estocásticos que exigem determinística, resolvedores de otimização convexos não-lineares) ou algoritmos de ramificação e vinculação (como ramificação e ligação, ramificação e corte e ramificação e redução) que exigem relaxamentos da função e das restrições objetivas. Esta resposta não é pior do que qualquer uma das outras mencionadas em 11 de dezembro.
Geoff Oxberry
Geoff, como posso aplicar o cvxmod a um problema não convexo?
David Ketcheson
Eu não usei o software, mas em teoria, como qualquer outro solucionador convexo, você o usaria para encontrar soluções localmente ideais, como se estivesse usando o fmincon agora (que também é um solucionador convexo). Uma maneira de usá-lo seria com várias etapas. Gere uma lista de pontos a serem usados ​​como suposições iniciais para o seu solucionador convexo. Para cada ponto usado como um palpite, registre a solução retornada pelo solucionador. O ponto que corresponde ao valor mínimo da função objetiva em todas as soluções retornadas é a melhor aproximação ao ideal global.
precisa
1
@ Geoff: Sim, estou usando multistart. Quanto ao CVXMOD, ele aceita apenas problemas que podem ser expressos em termos de programação convexa disciplinada. Problemas gerais de programação não linear não podem. Como você diz, eu poderia procurar relaxamentos convexos sucessivos que se aproximam do meu problema, mas o objetivo aqui é trabalhar menos.
David Ketcheson
3

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

user871016
fonte
Isso parece não existir mais.
footwet 5/12
3





denis
fonte
A partir do Release 2014b, isso agora é suportado diretamente pelo Matlab; veja mathworks.de/help/matlab/matlab-engine-for-python.html
Christian Clason
@ Christian Clason, isso parece não fazer nada para Matlab? como python-matlab-bridge faz. (Eu não usei-o embora.)
denis
Não diretamente (parece ter uma classe de matriz matlab personalizada), mas existe uma maneira de converter entre isso e numpy. Obviamente, haverá alguma sobrecarga devido à cópia de dados, mas provavelmente é um problema menor para o tamanho do problema mencionado pelo OP. (Não usei isso mesmo, apenas pensei que eu ia apontar a opção.)
Christian Clason
3

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.

MPath
fonte
2

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:

pip install cma

Aqui está um exemplo de código do site:

import cma
help(cma)  # "this" help message, use cma? in ipython
help(cma.fmin)
help(cma.CMAEvolutionStrategy)
help(cma.CMAOptions)
cma.CMAOptions('tol')  # display 'tolerance' termination options
cma.CMAOptions('verb') # display verbosity options
res = cma.fmin(cma.Fcts.tablet, 15 * [1], 1)
res[0]  # best evaluated solution
res[5]  # mean solution, presumably better with noise
Brian
fonte
Esse otimizador está longe do que o OP solicita. Por exemplo, não há uma maneira clara de como lidar com restrições de igualdade ou desigualdade com o CMA-ES.
ares
1

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").

10300(x0.1)2+10300(y0.2)2(x,y)=(1,1)

Dmitrey
fonte
2
Se você ler atentamente, estou apenas pedindo algo com robustez semelhante ao fmincon. Não precisa ser melhor e pode até ser mais lento.
David Ketcheson
1

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

asd
fonte
Sim, eu tentei alguns deles, mas nenhum mediu até fmincon.
David Ketcheson
1

É 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

Tolga Birdal
fonte
Não é Levenbeg-Marquardt? que, embora agradável, está longe de ser o que o OP quer
denis
Embora ceres seja realmente um bom solucionador, ele não suporta restrições de igualdade e suporta apenas restrições de desigualdade como limites superior / inferior dos parâmetros (como na versão atual 1.12).
precisa saber é o seguinte