Pesquisa Operacional 2

Horários das aulas

Ementa e programa

Objetivos da disciplina

Textos de referência

Textos complementares

Canais de acesso

Formas de avaliação

Avaliações

Prova 1

Critérios para aprovação

Listas de exercícios

Conteúdo

A linguagem de programação Julia

Julia é uma linguagem de programação de alto nível surgida em 2012, que implementa várias ferramentas para uso geral em matemática aplicada. Em particular, Julia possui várias ferramentas para otimização. É muito parecida com o Matlab, portanto os códigos são fáceis de entender. Os trabalhos computacionais desta disciplina serão feitos em Julia.

Para uma introdução ao Julia e seu uso em otimização, acesse este link.

Softwares / Interfaces para Julia
  • CPLEX
    O CPLEX é um pacote mantido pela IBM e muito utilizado na academia e indústria. Nele há vários métodos para programação linear inteira mista. É um software proprietário, mas estudantes das universidades podem obter licença de uso mediante preencimento de um cadastro.
  • GLPK
    GLPK é um pacote que implementa vários métodos para programação linear inteira mista. Ao contrário do CPLEX, é software livre, ou seja, você pode instalar e usar sem a necessidade de obter licenças. É uma opção de fácil instalação caso você tenha problemas com o CPLEX.

  • Uso dos pacotes no Julia
    Tanto o CPLEX quando o GLPK podem ser utilizados dentro do Julia. Para tanto, basta instalar os pacotes CPLEX.jl e GLPK.jl no seu Julia.
    • Obs: CPLEX.jl não instala o CPLEX automaticamente, você precisa instalá-lo na sua máquina antes; siga as instruções para download. Já GLPK.jl baixa e instala o GLPK automaticamente.
    • Teste executando o código exemplo para o problema de localização de facilidades não capacitado.
Introdução à programação linear inteira mista
  1. O modelo de programação linear inteira mista
  2. Exemplos de aplicações
    Referência: Goldbarg, M. C.; Luna, H. P. L. Otimização combinatória e programação linear: modelos e algoritmos. Elsevier, 2ed, 2005
  3. Exemplos de problemas e respectivos pacotes/códigos para uso no Julia, veja este link
Métodos em programação linear inteira mista
  1. Relaxação linear e relaxação Lagrangeana
    Referência: Wolsey, L. A. Integer Programming. 2ed, Wiley, 2021

  2. Método de enumeração e poda (Branch-and-bound)
    1. Pré-processamento
      Referências:
      1) Hillier, F. S.; Lieberman, G. J. Introdução à Pesquisa Operacional. McGraw-Hill, 8ed, 2006
      2) Wolsey, L. A. Integer Programming. 2ed, Wiley, 2021
      • Pré-processamento de PL’s: fixação de variáveis, aperto de limitantes das variáveis e identificação de restrições redundantes
      • Identificação de PL’s inviáveis ou ilimitados
      • Estratégias adicionais de pré-processamento para problemas com variáveis inteiras e binárias
    2. Inserção de restrições/cortes no quadro simplex ótimo e o método dual simplex (conteúdo de PO I, revisão)
      Referência: Bazaraa, M. S.; Jarvis, J. J.; Sherali, H. D. Linear Programming and Network Flows. Wiley, 4ed, 2010

    3. Método de enumeração e poda (Branch-and-bound) baseado em relaxação linear
      Referências:
      1) Goldbarg, M. C.; Luna, H. P. L. Otimização combinatória e programação linear: modelos e algoritmos. Elsevier, 2ed, 2005
      2) Wolsey, L. A. Integer Programming. 2ed, Wiley, 2021

    4. Exemplo completo de aplicação do Branch-and-Bound (contém resumo sobre inserção de restrições no quadro simplex ótimo)

    5. GAP: código exemplo de uso dos pacotes CPLEX/GLPK. Para instruções de instalação dos pacotes, veja tópico “Softwares / Interfaces para Julia”

    6. Exemplo de problema inviável em que branch-and-bound fracassa
      Referência: Jeroslow. Trivial integer programs unsolvable by branch-and-bound. Mathematical Programming 6, 105-109 (1974)
    7. EXERCÍCIOS: Veja Lista 1
  3. Método de planos de corte
    Referência: Wolsey, L. A. Integer Programming. 2ed, Wiley, 2021
    1. Desigualdades válidas
    2. Esquema geral do método
    3. Cortes fracionários de Gomory via quadro simplex
    4. EXERCÍCIOS: Veja Lista 2
  4. Método de enumeração e poda com adição de cortes (Branch-and-cut)
    Referências:
    1) Goldbarg, M. C.; Luna, H. P. L. Otimização combinatória e programação linear: modelos e algoritmos. Elsevier, 2ed, 2005
    2) Wolsey, L. A. Integer Programming. 2ed, Wiley, 2021
Otimização em redes

Referência: Bazaraa, M. S.; Jarvis, J. J.; Sherali, H. D. Linear Programming and Network Flows. Wiley, 4ed, 2010

  1. Conceitos básicos sobre grafos
  2. Exemplos: caminho mínimo, fluxo máximo, fluxo de custo mínimo, problemas do transporte e atribuição
  3. Problema de fluxo de custo mínimo
    1. Matriz totalmente unimodular
    2. Obtendo uma base inicial viável
    3. Método simplex de rede
  4. Problema do transporte: resolução via simplex
    1. Caso particular: problema de atribuição
  5. Problema do menor caminho
    1. Algoritmo de Dijkstra para custos não negativos
Programação dinâmica

Referência: Hillier, F. S.; Lieberman, G. J. Introdução à Pesquisa Operacional. McGraw-Hill, 8ed, 2006

  1. Princípios da programação dinâmica
  2. Exemplo simples: sequência de Fibonacci
  3. Problema da mochila 0-1
  4. Exemplo protótipo, seção 10.1 do livro de Hillier e Lieberman
  5. Exemplos da seção 10.3 do livro de Hillier e Lieberman
  6. Outros exemplos
    1. Subset sum
    2. O algoritmo de Dijkstra (tópico anterior) usa conceitos de programação dinâmica