Julia para Otimização - Exemplo 7

« voltar para “Julia para Otimização”

Objetivo: resolver modelos de otimização restrita e irrestrita por métodos disponíveis.

Ao longo da disciplina “Otimização 2” utilizamos interfaces para pacotes de otimização com restrições. Sempre que disponível, damos preferência à pacotes que leêm estruturas NLPmodels, com derivadas automáticas, como nosso gradiente do Exemplo 4.

A seguir listo alguns excelentes pacotes. Alguns possuem interface para NLPModels, outros para JuMP, e outros para ambas as estruturas.

Algencan

Algencan é uma implementação do método de Lagrangiano aumentado escrito por E. Birgin e J.M. Martínez. É um software livre implementado em Fortran. Uma interface para Julia com leitura de estruturas NLPmodels foi escrita por P.J.S. Silva.

Obs.: para compilar NLPModelsAlgencan, você precisará instalar a biblioteca de álgebra linear BLAS no seu sistema operacional. No Ubuntu, instale os arquivos de desenvolvimento da biblioteca OpenBLAS (pacotes libopenblas-dev, libopenblas-serial-dev, libopenblas-openmp-dev, libopenblas-pthread-dev, o que estiverem disponíveis).

Ipopt - Interior Point Optimizer

Ipopt é uma implementação do método de pontos interiores, isto é, uma estratégia de penalização interna com barreira logarítmica e Newton nos subproblemas. É um software livre implementado em C++. É mantido pela organização “Computation Infrastructure for Operations Research” (COIN-OR).

Interfaces para softwares proprietários

Existem interfaces para softwares proprietários. Neste caso você precisará obter o software e licença de uso de forma independente. Alguns pacotes são feitos para lidar apenas com modelos em JuMP (i.e., não usam NLPModels). Consulte a documentação do pacote para detalhes de uso.

Pacote Optim

O pacote Optim.jl contém métodos para otimização irrestrita e sobre caixas. Acesse a página do pacote.

Dentre os métodos implementados estão:

Veja a documentação para detalhes.

Outros algoritmos

Pacotes com interface AMPL

Vários pacotes possuem interface para a linguagem de modelagem AMPL. Neste caso, é possível usá-los para resolver modelos na estrutura JuMP com o uso do pacote AmplNLWriter. O trecho a seguir resolve o problema do Exemplo 6 com o pacote WORHP:

using JuMP, AmplNLWriter

P = Model(() -> AmplNLWriter.Optimizer("worhp_ampl"))

@variable(P, x[1:2])
@NLobjective(P, Min, (x[1] - 2.0)^2 + (x[2] - 1.0)^2)
@constraint(P, x[1] + x[2] - 2 <= 0)
@NLconstraint(P, x[1]^2 - x[2] <= 0)

optimize!(P)

A primeira linha cria o modelo JuMP passando a interface AMPL do solver de sua preferência. Você pode inserir o caminho completo do executável AMPL do solver no lugar de worhp_ampl. Isso pode ser feito para qualquer pacote que possua interface AMPL! Ao executar optimize!(P), o problema é resolvido e as informações da execução, tais como solução e valor da função objetivo, são guardadas na própria estrutura JuMP. Para recuperá-las, você pode, após resolver o problema, fazer:

Para mais detalhes, acesse a documentação do Jump.

Sobre o pacote do exemplo: WORHP é uma implementação robusta e eficiente de um método de programação quadrática sequencial. É um software proprietário, mas há licença para uso acadêmico. Você deve instalá-lo em sua máquina separadamente, assim como obter a licença de uso. Para mais detalhes, acesse o site do desenvolvedor.