Fofão da Pérsia

Uma aplicação de Programação Dinâmica

jun/2016

Vinicius de Carvalho | [TGL] Dogg

Vinicius de Carvalho

[TGL] Dogg      |      Vini Dogg LL

• tgl_dogg@outlook.com

• github.com/tgl-dogg

• facebook.com/TGL_Dogg

Siga em frente, olhe para o lado
Se liga no mestiço na batida do cavaco ♪

A lenda da
Carreta Furacão

Seres Extraordinários

Fofão da Pérsia

Líder Supremo

B1

B2

B3

B4

Fi = 5, Si = 2

Fi = 4, Si = 1

Fi = 3
Si = 8

Fi = 2
Si = 2

Fi = 7

Si = 3

Carreta Furacão

Mortal da Felicidade

Solução

Ideia do Algoritmo

  • N é o número de bairros (sendo P partida e D destino);
  • M é o número de ruas;
  • B é o solado do Fofão;
  • Tabela T de tamanho [B][N] (índice começando em 1).
     
  • Cada uma das j (j=1, 2, ..., N) colunas representa um bairro.
     
  • Cada uma das i (i=1, 2, ..., B) linhas vai representar as felicidades acumuladas gastando no máximo i de sola.

Ideia do Algoritmo

  • Para cada i, verifica todos os j bairros
  • Em cada bairro, verifica se há uma rua k cujo Sk < i
    → Se existe, verifica se ela é alcançável
    → Senão, grava -1
     
  • Guarda max(T[i][j], T[i-Sk][k] + Fk)
     
  • A solução estará em T[B][D]

Tabela

B/N B1 B2 B3 B4
1 -1 -1 -1 -1

Tabela

B/N B1 B2 B3 B4
1 -1 -1 -1 -1
2 -1 5 -1 -1

B1 → B2

Tabela

B/N B1 B2 B3 B4
1 -1 -1 -1 -1
2 -1 5 -1 -1
3 -1 5 -1 -1

Tabela

B/N B1 B2 B3 B4
1 -1 -1 -1 -1
2 -1 5 -1 -1
3 -1 5 -1 -1
4 10 5 -1 7

B1 → B2 → B1
B1 → B2 → B4

Tabela

B/N B1 B2 B3 B4
1 -1 -1 -1 -1
2 -1 5 -1 -1
3 -1 5 -1 -1
4 10 5 -1 7
5 10 5 12 7

B1 → B2 → B3

Tabela

B/N B1 B2 B3 B4
1 -1 -1 -1 -1
2 -1 5 -1 -1
3 -1 5 -1 -1
4 10 5 -1 7
5 10 5 12 7
6 10 15 12 16

B1 → B2 → B1 → B2
B1 → B2 → B3 → B4

Tabela

B/N B1 B2 B3 B4
1 -1 -1 -1 -1
2 -1 5 -1 -1
3 -1 5 -1 -1
4 10 5 -1 7
5 10 5 12 7
6 10 15 12 16
7 10 15 12 16

Tabela

B/N B1 B2 B3 B4
1 -1 -1 -1 -1
2 -1 5 -1 -1
3 -1 5 -1 -1
4 10 5 -1 7
5 10 5 12 7
6 10 15 12 16
7 10 15 12 16
8 20 19 12 17

B1 → B2 → B1 → B2 → B1
B1 → B2 → B1 → B2 → B4

Programação
Dinâmica

Recursão com Tabela

  • Princípio da Otimalidade
    (Idéia da Recursão)
     
  • Sobreposição de Subproblemas
    (Reutilização das soluções menores)
     
  • PO sem SS = divisão e conquista

Salvamos os cálculos em uma tabela pra evitar recálculo!

Complexidade

  • Complexidade Assintótica:
  • B * N * M
  • M = (N*(N-1))/2
  • O(B*N³) -- polinomial
    → Nos limites do problema, 4.95 * 10^6 operações
    → Menos de 0.02s em uma CPU moderna
     
  • Força Bruta:
  • O(N^B) -- exponencial
    → Nos limites do problema, 100^1000

Prova de Corretude

  • Análise de Recorrência:
  • Tabela é inicializada com -1
  • T(i, j) = {
        -1, se Sj > B
        max( T(i, j), T(i-Sj, P) + Fj ) se k = P e T(i-Sj,P) = -1
        max( T(i, j), T(i-Sj, k) + Fj )
    }
     
  • Ideia da prova: indução matemática!

Fontes:

  • "Introduction to Algorithms"
    T. Cormen, C. Leiserson, R. Rivest e C. Stein
     
  • "Algorithms"
    S. Dasgupta, C. Papadimitriou, U. Varzirani
     
  • http://cs.stackexchange.com/questions/30219/
    proving-optimality-of-a-dynamic-programming-algorithm
     
  • https://www.cs.oberlin.edu/~asharp/cs280/2012fa/handouts/dp.pdf
     
  • http://web.stanford.edu/class/archive/cs/cs161/cs161.1138/handouts/
    140%20Guide%20to%20Dynamic%20Programming.pdf
     
  • http://stackoverflow.com/questions/27768418/
    dynamic-programming-why-the-need-for-optimal-sub-structure
     
  • https://people.eecs.berkeley.edu/~vazirani/algorithms/chap6.pdf

Fofão da Pérsia

By Vinicius de Carvalho | [TGL] Dogg

Fofão da Pérsia

Apresentação para a disciplina de Análise e Projeto de Algoritmos do curso de Bacharelado em Ciência da Computação do Centro Universitário SENAC - Campus Santo Amaro

  • 734