60
Programação Dinâmica fib(1) fib(0) fib(2) fib(1) fib(3) fib(1) fib(0) fib(2) fib(4) fib(1) fib(0) fib(2) fib(1) fib(3) fib(5) Programação Dinâmica Uma metodologia de resolução de problemas Pedro Ribeiro Center for Research in Advanced Computing Systems (CRACS & INESC-Porto LA) Departamento de Ciência de Computadores Faculdade de Ciências da Universidade do Porto

programacao_dinamica

Embed Size (px)

DESCRIPTION

Programação Dinâmica

Citation preview

  • Programao Dinmica

    fib(1) fib(0)

    fib(2) fib(1)

    fib(3)

    fib(1) fib(0)

    fib(2)

    fib(4)

    fib(1) fib(0)

    fib(2) fib(1)

    fib(3)

    fib(5)

    Programao DinmicaUma metodologia de resoluo de problemas

    Pedro Ribeiro

    Center for Research in Advanced Computing Systems (CRACS & INESC-Porto LA)

    Departamento de Cincia de ComputadoresFaculdade de Cincias da Universidade do Porto

  • Contedo

    Motivao e conceitos base Exemplos iniciais e clculos repetidos

    Programao Dinmica Definio

    Caractersticas de um problema de PD

    Passos para chegar a uma soluo

    Pedro Ribeiro

    Exemplos de aplicao PD clssica, de contagem, com jogos e mais complexa

    2Programao Dinmica

  • Nmeros de Fibonacci

    Sequncia de nmeros muito famosa definida por Leonardo Fibonacci

    0,1,1,2,3,5,8,13,21,34,...

    F(0) = 0F(1) = 1

    Pedro Ribeiro

    F(1) = 1F(n) = F(n-1) + F(n-2)

    3Programao Dinmica

  • Nmeros de Fibonacci

    Como implementar?

    Implementao directa a partir da Implementao directa a partir da definio:fib(n):

    Se n=0 ou n=1 entoretornar n

    Seno

    Pedro Ribeiro

    Pontos negativos desta implementao?

    4Programao Dinmica

    Senoretornar fib(n-1) + fib(n-2)

  • Nmeros de Fibonacci

    Clculos de fib(5)

    fib(5)

    fib(2) fib(1)

    fib(3)

    fib(1) fib(0)

    fib(2)

    fib(4)

    fib(1) fib(0)

    fib(2) fib(1)

    fib(3)

    Pedro Ribeiro5Programao Dinmica

    fib(1) fib(0)

    fib(2) fib(1) fib(1) fib(0) fib(1) fib(0)

  • Nmeros de Fibonacci

    Clculos de fib(5)

    fib(5)

    fib(2) fib(1)

    fib(3)

    fib(1) fib(0)

    fib(2)

    fib(4)

    fib(1) fib(0)

    fib(2) fib(1)

    fib(3)

    Pedro Ribeiro

    Por exemplo, fib(2) chamado 3 vezes!6Programao Dinmica

    fib(1) fib(0)

    fib(2) fib(1) fib(1) fib(0) fib(1) fib(0)

  • Nmeros de Fibonacci

    Como melhorar? Por exemplo, comeando do zero e mantendo sempreem memria os dois ltimos nmeros da sequncia

    fib(n):Se n=0 ou n=1 ento

    retornar nSeno

    f1 = 1f2 = 0Para i: 2 at n fazer

    Pedro Ribeiro7Programao Dinmica

    Para i: 2 at n fazerf = f1 + f2f2 = f1f1 = f

    retornar f

  • Nmeros de Fibonacci

    Conceitos a reter: Diviso de um problema em subproblemas do

    mesmo tipomesmo tipo

    Calcular o mesmo subproblema apenas uma vez

    Ser que estas ideias podem tambm

    Pedro Ribeiro

    Ser que estas ideias podem tambm ser usadas noutros problemas mais complicados?

    8Programao Dinmica

  • Pirmide de Nmeros

    Problema clssico das Olimpadas Internacionais de Informtica de 1994

    Calcular a rota, que comea no topo da pirmide e acaba na base, com maior soma . Em cada passo podemos

    Problema

    Pedro Ribeiro9Programao Dinmica

    maior soma . Em cada passo podemos ir diagonalmente para baixo e para a esquerda ou para baixo e para a direita.

  • Pirmide de Nmeros

    Duas possveis rotas

    Pedro Ribeiro

    Limites: todos os nmeros da pirmide so inteiros entre 0 e 99 e o nmero de linhas do tringulo no mximo 100.

    10Programao Dinmica

    Soma = 21 Soma = 30

  • Pirmide de Nmeros

    Como resolver o problema?

    Ideia: Fora Bruta!

    avaliar todos os caminhos possveis e ver qual o melhor.

    Pedro Ribeiro

    Mas quanto tempo demora isto?

    Quantos caminhos existem?

    11Programao Dinmica

  • Pirmide de Nmeros

    Anlise da complexidade Em cada linha podemos tomar duas decises diferentes: esquerda ou direita

    Seja n a altura da pirmide. Uma rota constituda por n1 decises diferentes.

    Existem 2n-1 caminhos diferentes. Ento, um programa que calculasse todas rotas teria complexidade temporal O(2n): crescimento exponencial!

    Note-se que 2996,34x1029, que um nmero

    Pedro Ribeiro

    Note-se que 2 6,34x10 , que um nmero demasiado grande!

    12Programao Dinmica

    633825300114114700748351602688

  • Pirmide de Nmeros

    Quando estamos no topo da pirmide, temos duas decises possveis (esquerda ou direita):

    Em cada um dos casos, temos de ter em conta

    Pedro Ribeiro

    Em cada um dos casos, temos de ter em conta todas as rotas das respectivas subpirmides assinaladas a amarelo.

    13Programao Dinmica

  • Pirmide de Nmeros

    Mas o que nos interessa saber sobre estas subpirmides?

    Apenas interessa o valor da sua melhor rota interna (que um instncia mais pequena do mesmo problema)!

    Pedro Ribeiro

    interna (que um instncia mais pequena do mesmo problema)!

    Para o exemplo, a soluo 7 mais o mximo entre o valor da melhor rota de cada uma das subpirmides

    14Programao Dinmica

  • Pirmide de Nmeros

    Ento este problema pode ser resolvido recursivamente. Seja P[i][j] o j-simo nmero da i-sima linha

    Seja Max(i,j) o melhor que conseguimos a partir da posio i,j

    1 2 3 4 5

    1 7

    2 3 8

    Pedro Ribeiro15Programao Dinmica

    2 3 8

    3 8 1 0

    4 2 7 4 4

    5 4 5 2 6 5

  • Pirmide de Nmeros

    Ento:Max(i,j):

    Se i = n entoMax(i,j) = P[i][j]

    1 2 3 4 5

    1 7

    2 3 8

    Max(i,j) = P[i][j] Seno

    Max(i,j) = P[i][j] + mximo(Max(i+1,j), Max(i+1,j+1))

    Pedro Ribeiro16Programao Dinmica

    2 3 8

    3 8 1 0

    4 2 7 4 4

    5 4 5 2 6 5

    Para resolver o problemabasta chamar Max(1,1)

  • Pirmide de Nmeros

    Continuamos com crescimento exponencial!

    Max(2,1) Max(2,2)

    Max(1,1)

    Estamos a avaliar o mesmo subproblema vrias vezes!

    ...

    Max(4,1)

    ...

    Max(4,2)

    Max(3,1)

    ...

    Max(4,2)

    ...

    Max(4,3)

    Max(3,2)

    ...

    Max(4,2)

    ...

    Max(4,3)

    Max(3,2)

    ...

    Max(4,3)

    ...

    Max(4,4)

    Max(3,3)

    Pedro Ribeiro

    vezes!

    17Programao Dinmica

  • Pirmide de Nmeros

    Temos de reaproveitar o que j calculamos S calcular uma vez o mesmo subproblema!

    Ideia: criar uma tabela com o valor obtido para cada subproblema! Matriz M[i][j]

    Pedro Ribeiro

    Ser que existe uma ordem para preencher a tabela de modo a que quando precisamos de um valor j o temos?

    18Programao Dinmica

  • Pirmide de Nmeros

    Comear a partir do fim!

    Pedro Ribeiro19Programao Dinmica

  • Pirmide de Nmeros

    Comear a partir do fim!

    Pedro Ribeiro20Programao Dinmica

    4 5 2 6 5

  • Pirmide de Nmeros

    Comear a partir do fim!

    7 12 10 10

    Pedro Ribeiro21Programao Dinmica

    4 5 2 6 5

    7 12 10 10

  • Pirmide de Nmeros

    Comear a partir do fim!

    30

    7 12 10 10

    20 13 10

    23 21

    Pedro Ribeiro22Programao Dinmica

    4 5 2 6 5

    7 12 10 10

  • Pirmide de Nmeros

    Tendo em conta a maneira como preenchemos a tabela, at podemos aproveitar P[][]!

    Calcular ():Para i: n-1 at 1 fazer

    Com isto soluo fica em P[1][1]!

    Para i: n-1 at 1 fazerPara j: 1 at i fazer

    P[i][j] = P[i][j] + mximo(P[i+1][j], P[i+1][j+1])

    Pedro Ribeiro

    Agora, o tempo necessrio para resolver o problema j s cresce polinomialmente ( O(n2) ) e j temos uma soluo admissvel para o problema (992=9801)

    23Programao Dinmica

  • Pirmide de Nmeros

    Se fosse necessrio saber constituio da melhor soluo? Basta usar a tabela j calculada!

    20 13 10

    23 21

    30

    Pedro Ribeiro24Programao Dinmica

    4 5 2 6 5

    7 12 10 10

    20 13

  • Pirmide de Nmeros

    Para resolver o problema da pirmide de nmeros usamosnmeros usamos

    Programao Dinmica(PD)

    Pedro Ribeiro25Programao Dinmica

    (PD)

  • Programao Dinmica (PD)

    Definio (adaptado de NIST-DADSP*):

    uma tcnica algortmica, normalmente usada em problemas de optimizao, que baseada em guardar os resultados de subproblemas, em em guardar os resultados de subproblemas, em vez de os recalcular.

    Tcnica algortmica: mtodo geral para resolver problemas que tm algumas caractersticas em comum

    Problema de optimizao: quando se pretende encontrar a melhor soluo entre todas as solues admissveis, mediante

    Pedro Ribeiro

    melhor soluo entre todas as solues admissveis, mediante um determinado critrio (funo objectivo).

    26Programao Dinmica

    * NIST National Institute of Standarts and TechnologyDADSP Dictionary of Algorithms, Data Structures, and Problems

    Clssica troca de espao por tempo

  • PD - Caractersticas

    Quais so ento as caractersticas que um problema deve apresentar para um problema deve apresentar para poder ser resolvido com PD?

    Subestrutura ptima

    Subproblemas coincidentes

    Pedro Ribeiro

    Subproblemas coincidentes

    27Programao Dinmica

  • Subestrutura ptima (optimal substructure):

    Quando a soluo ptima de um problema contm nela prpria solues ptimas para

    PD - Caractersticas

    contm nela prpria solues ptimas para subproblemas do mesmo tipo.

    Quando um problema apresenta esta

    Exemplo: No problema das pirmides de nmeros, a soluo ptima contm nela prpria os melhores percursos de subpirmides, ou seja, solues ptimas de subproblemas.

    Pedro Ribeiro

    Quando um problema apresenta esta caracterstica diz-se que ele respeita o princpio de optimalidade

    (optimality principle).

    28Programao Dinmica

  • PD - Caractersticas

    Subestrutura ptima (optimal substructure):

    preciso ter cuidado porque isto nem sempre acontece!acontece!

    Exemplo: se, no problema das pirmides, o objectivo fosse encontrar a rota que maximizasse o resto da diviso inteira entre 10 e o valor dessa rota.

    Pedro Ribeiro29Programao Dinmica

    1

    5 55 4 5

    15 5

    5 4 5

    A soluo ptima (155) no contm a soluo ptima para a subpirmide assinalada a amarelo (54)

  • PD - Caractersticas

    Subproblemas coincidentes:

    Quando um espao de subproblemas pequeno, isto , no so muitos os subproblemas a resolver pois muitos deles so exactamente iguais uns aos outros.deles so exactamente iguais uns aos outros.

    Tambm esta caracterstica nem sempre acontece, quer porque mesmo com subproblemas coincidentes so muitos subproblemas

    Exemplo: no problema das pirmides, para um determinada instncia do problema, existem apenas n+(n-1)+...+1

  • PD - Metodologia

    Se um problema apresenta estas duas caractersticas, temos uma boa pista de que a PD se pode aplicar. No pista de que a PD se pode aplicar. No entanto, nem sempre isso acontece.

    Que passos devemos ento tomar se

    Pedro Ribeiro

    Que passos devemos ento tomar se quisermos resolver um problema usando PD?

    31Programao Dinmica

  • PD - Metodologia

    (nota: estes passos representam apenas

    um guia de resoluo)

    1) Caracterizar a soluo ptima do problema1) Caracterizar a soluo ptima do problema

    2) Definir recursivamente a soluo ptima, em funo de solues ptimas de subproblemas

    3) Calcular as solues de todos os subproblemas: de trs para a frente ou

    Pedro Ribeiro

    subproblemas: de trs para a frente ou com memoization

    4) Reconstruir a soluo ptima, baseada nos clculos efectuados (opcional)

    32Programao Dinmica

  • PD - Metodologia

    1) Caracterizar a soluo ptima de um problema Compreender bem o problema

    Verificar se um algoritmo que verifique todas as solues fora bruta no suficiente

    Tentar generalizar o problema ( preciso prtica para perceber como generalizar da maneira correcta)

    Procurar dividir o problema em subproblemas do mesmo tipo

    Pedro Ribeiro

    mesmo tipo

    Verificar se o problema obedece ao princpio de optimalidae

    Verificar se existem subproblemas coincidentes

    33Programao Dinmica

  • PD - Metodologia

    2) Definir recursivamente a soluo ptima, em funo de solues ptimas de subproblemas.

    Definir recursivamente o valor da soluo ptima, com rigor e exactido, a partir de subproblemas mais pequenos do mesmo tipo

    Imaginar sempre que os valores das solues ptimas j esto disponveis quando precisamos

    Pedro Ribeiro

    ptimas j esto disponveis quando precisamos deles

    No necessrio codificar. Basta definir matematicamente a recurso.

    34Programao Dinmica

  • PD - Metodologia

    3) Calcular as solues de todos os subproblemas: de trs para a frente

    Descobrir a ordem em que os subproblemas so precisos, a partir dos subproblemas mais pequenos at chegar ao problema global (bottom-up) e codificar, usando uma tabela.

    Normalmente, esta ordem inversa ordem normal da funo recursiva que resolve o problema

    Pedro Ribeiro

    funo recursiva que resolve o problema

    .

    35Programao Dinmica

    Incio Fim

    Ordem de optimizao usando programao dinmica

    Ordem normal de resoluo

  • PD - Metodologia

    3) Calcular as solues de todos os subproblemas: memoization

    Existe uma tcnica, chamada memoization, que permite resolver o problema pela ordem normal (top-down)

    Usar a funo recursiva obtida directamente a partir definio da soluo e ir mantendo uma tabela com

    Pedro Ribeiro

    definio da soluo e ir mantendo uma tabela com os resultados dos subproblemas.

    Quando queremos aceder a um valor pela primeira vez temos de calcul-lo e a partir da basta ver qual .

    36Programao Dinmica

  • PD - Metodologia

    4) Reconstruir a soluo ptima, baseada nos clculos efectuados

    Pode ou no ser requisito do problema

    Duas alternativas: Directamente a partir da tabela dos sub-problemas

    Nova tabela que guarda as decises em cada etapa

    Pedro Ribeiro

    Nova tabela que guarda as decises em cada etapa

    No necessitando de saber qual a melhor soluo, podemos por vezes poupar espao

    37Programao Dinmica

  • Exemplo Subsequncia crescente

    Dada uma sequncia de nmeros inteiros:

    7, 6, 10, 3, 4, 1, 8, 9, 5, 27, 6, 10, 3, 4, 1, 8, 9, 5, 2

    Descobrir qual a maior subsequncia crescente (no necessariamente contgua)

    7, 6, 10, 3, 4, 1, 8, 9, 5, 2 Tamanho 2

    Pedro Ribeiro

    7, 6, 10, 3, 4, 1, 8, 9, 5, 2 Tamanho 2

    7, 6, 10, 3, 4, 1, 8, 9, 5, 2 Tamanho 3

    7, 6, 10, 3, 4, 1, 8, 9, 5, 2 Tamanho 4

    38Programao Dinmica

  • Exemplo Subsequncia crescente

    1. Caracterizar soluo ptima Seja N o tamanho da sequncia, e num[i] o i-simo nmero

    Fora bruta, quantas opes? (binomial theorem: 2n-1)

    Generalizar e resolver com subproblemas iguais: seja best(i) o valor da melhor subsequncia a partir da

    i-sima posio

    Caso fcil: a melhor subsequncia a comear da ltima posio tem tamanho 1!

    Caso geral

    Pedro Ribeiro

    Caso geral: para um dado i, podemos seguir para todos os nmeros entre i+1 e N, desde que sejam maiores

    39Programao Dinmica

    7, 6, 10, 3, 4, 1, 8, 9, 5, 2

  • Exemplo Subsequncia crescente

    1) Caracterizar soluo ptima Caso geral: para um dado i, podemos seguir para

    todos os nmeros entre i+1 e N, desde que sejam maioresmaiores Para esses nmeros, basta-nos saber o melhor a partir

    da! (princpio da optimalidade)

    O melhor a partir de uma posio necessrio para calcular todas as posies de ndice inferior! (subproblemas coincidentes)

    Pedro Ribeiro40Programao Dinmica

    7, 6, 10, 3, 4, 1, 8, 9, 5, 2

  • Exemplo Subsequncia crescente

    2) Definir soluo recursiva em funo de solues ptimas de subproblemas

    N tamanho da sequncia

    num[i] nmero na posio i

    best(i) melhor subsequncia a partir da posio i

    best(N) = 1

    Pedro Ribeiro41Programao Dinmica

    best(N) = 1

    best(i) = 1 + mximo{best(j): inum[i]}para 1i

  • Exemplo Subsequncia crescente

    3) Calcular soluo ptima: trs para a frente Seja best[] tabela para guardar valores de best()

    Calcular ():Calcular ():best[N] = 1Para i: n-1 at 1 fazer

    best[i] = 1Para j: i+1 at N fazer

    Se num[j]>num[i] e 1+best[j]>best[i] entobest[i] = 1+best[j]

    Pedro Ribeiro42Programao Dinmica

    i 1 2 3 4 5 6 7 8 9 10

    num[i] 7 6 10 3 4 1 8 9 5 2

    best[i] 3 3 1 4 3 3 2 1 1 1

  • Exemplo Subsequncia crescente

    4) Reconstruir soluo Exemplo de tabela auxiliar com decies

    Seja next[i] a prxima posio para obter o melhor a partir da posio i (X se a ltima da sequncia)

    i 1 2 3 4 5 6 7 8 9 10

    num[i] 7 6 10 3 4 1 8 9 5 2

    Pedro Ribeiro43Programao Dinmica

    num[i] 7 6 10 3 4 1 8 9 5 2

    best[i] 3 3 1 4 3 3 2 1 1 1

    next[i] 7 7 X 5 7 7 8 X X X

  • Exemplo Obras na estrada

    Cidade com quadriculado de ruas (MIUP2004) Algumas estradas tm obras

    S se pode andar para norte e para este

    N mximo: 30

    Pedro Ribeiro44Programao Dinmica

    N mximo: 30

    De quantas maneiras diferentes se pode ir de (x1,y1) para (x2,y2) ?

  • Exemplo Obras na estrada

    1) Caracterizar o problema Fora bruta? (com N=30, existem ~1,2x1017 caminhos)

    X

    Ir de (x1,y1) para (x2,y2): pode ignorar-setudo o que est fora desse rectngulo

    Nmero de maneiras a partir de uma posio igual ao nmero de maneiras desde a posio a norte mais o nmero de maneiras desde a posio a este!

    Subproblema igual com soluo no dependente do problema maior (equivalente a princpio da optimalidade)

    X

    Pedro Ribeiro

    maior (equivalente a princpio da optimalidade)

    Existem muitos subproblemas coincidentes!

    45Programao Dinmica

    X

    X

    X

    X

    X

    X

    X

    X

  • Exemplo Obras na estrada

    2) Definir soluo recursiva

    L nmero de linhas

    C nmero de colunas

    count(i,j) nmero de maneiras a partir de posio (i,j)

    obra(i,j,D) valor V/F indicando se existe obra a impedir deslocao de (i,j) na direco D (NORTE ou ESTE)

    count(L,C) = 1

    count(i,j) = valor_norte(i,j) + valor_este(i,j)para (i,j)(L,C)onde:

    Pedro Ribeiro46Programao Dinmica

    onde:valor_norte(i,j): 0 se (j=L ou obra(i,j,NORTE))

    count(i+1,j) caso contrrio

    valor_este(i,j): 0 se (j=L ou obra(i,j,ESTE))count(i,j+1) caso contrrio

  • Exemplo Obras na estrada

    3) Calcular soluo ptima: trs para a frente

    Calcular ():Inicializar count[][] com zeroscount[L][C] = 1count[L][C] = 1Para i: L at 1 fazer

    Para j: C at 1 fazerSe i

  • Exemplo Jogo de Pedras

    Existem N pedras numa mesa Dois jogadores

    Em cada jogada retira-se 1, 3 ou 8 pedras(generalizvel para qualquer nmero de peas)

    Quem retirar as ltimas pedras ganha o jogo!

    Pergunta: dado o nmero de pedras, o jogador que

    comea a jogar pode garantidamente ganhar?

    Exemplo:15 pedras na mesa:jogador A retira 8

    Pedro Ribeiro48Programao Dinmica

    15 pedras na mesa:jogador A retira 87 pedras na mesa: jogador B retira 34 pedra na mesa: jogador A retira 13 pedras na mesa: jogador B retira 30 pedras na mesa: ganhou jogador B!

  • Exemplo Jogo de Pedras

    1) Caracterizar soluo ptima Soluo bruta: avaliar todos jogos possveis! O(3^N)

    Como generalizar? Seja win(i) um valor V/F representando se com i pedras conseguimos ganhar(posio ganhadora)

    Claramente win(1), win(3) e win(8) so verdadeiras

    E para os outros casos? Se a nossa jogada for dar a uma posio ganhadora,

    Pedro Ribeiro

    Se a nossa jogada for dar a uma posio ganhadora, ento o adversrio pode forar a nossa derrota

    Ento, a nossa posio ganhadora se conseguirmos chegar a uma posio que no o seja!

    Caso todas as jogadas forem dar a posies ganhadoras, a nossa posio perdedora

    49Programao Dinmica

  • Exemplo Jogo de Pedras

    2) Definir soluo recursiva em funo de solues ptimas de subproblemas

    N nmero de pedras

    win[i] valor V/F indicando se estar com i pedras estar numa posio ganhadora

    win(0) = falso

    Pedro Ribeiro50Programao Dinmica

    win(i) = verdadeiro se ~win[i-1] ou ~win[i-3] ou ~win[i-8]falso caso contrrio

    para 1iN

  • Exemplo Jogo de Pedras

    3) Calcular soluo ptima: trs para a frente

    Calcular ():Para i: 0 at N fazer

    Se (i1 e no(win[i-1])) ouSe (i1 e no(win[i-1])) ou(i3 e no(win[i-3])) ou(i8 e no(win[i-8])) ento

    win[i] = trueSeno

    win[i] = false

    Pedro Ribeiro51Programao Dinmica

    i 0 1 2 3 4 5 6 7 8 9 10 11 12

    win[i] F V F V F V F V V V V F V

  • Exemplo Distncia de Edio

    Vamos a um ltimo exemplo um pouco mais complexo

    Problema: consideremos duas palavras pal1 e pal2. O nosso objectivo transformar pal1 em pal2 usando apenas trs tipos de transformaes:

    1 2

    apenas trs tipos de transformaes:1) Apagar uma letra2) Introduzir uma nova letra3) Substituir uma letra por outra

    Qual o mnimo nmero de transformaes que temos de fazer para transformar uma palavra na outra? Chamemos a esta medida distncia de edio (de).

    Pedro Ribeiro

    Chamemos a esta medida distncia de edio (de).

    Exemplo: para transformar gotas em afoga precisamos de quatro transformaes:

    (1) (3) (3) (2)

    gotas gota_ fota foga afoga

    52Programao Dinmica

  • Exemplo Distncia de Edio

    1) Caracterizar soluo ptima

    Seja de(a,b) a distncia de edio entre as palavras a e b. Seja uma palavra vazia

    Existem alguns casos simples? Claramente de(, ) zero.

    de(,b), para qualquer palavra b? o tamanho da palavra b (porque temos de fazer inseres)

    de(a, ) para qualquer palavra a? o tamanho da

    Pedro Ribeiro

    de(a, ) para qualquer palavra a? o tamanho da palavra a pois temos de apagar todas as letras de a.

    E nos outros casos? Temos de tentar dividir o problema por etapas, onde decidimos de acordo com subproblemas

    53Programao Dinmica

  • Exemplo Distncia de Edio

    Nenhuma das palavras vazia

    Como podemos igualar o final das duas palavras?

    Seja la a ltima letra de a e a o resto da palavra (do mesmo modo definimos l e b).modo definimos lb e b).

    Se la = lb ento s nos falta descobrir a distncia de edio entre a e b (que uma instncia mais pequena do mesmo problema!).

    Caso contrrio podemos fazer trs operaes:

    Substituir la por lb. Gastamos uma operao e precisamos de saber a distncia de edio entre a e b.

    Pedro Ribeiro

    distncia de edio entre a e b.

    Apagar la. Gastamos uma operao e precisamos de saber a distncia de edio entre a e b.

    Inserir lb no final de a. Gastamos uma operao e precisamos de saber a distncia de edio entre a e b.

    54Programao Dinmica

  • Exemplo Distncia de Edio

    2) Definir soluo recursiva|a| e |b| comprimentos das palavras a e b

    a[i] e b[i] letra na posio i a palavra a e b

    de(i,j) distncia de edio entre as palavras formadas pelas primeiras i letras de a e as primeiras j letras de b

    de(i,0) = i, para 0 i |a|de(0,j) = j, para 0 j |b|

    de(i,j) = min(de(i-1,j-1) + {0 se a[i]=b[i], 1 se a[i]b[i]},

    Pedro Ribeiro55Programao Dinmica

    de(i,j) = min(de(i-1,j-1) + {0 se a[i]=b[i], 1 se a[i]b[i]},de(i-1,j)+1,de(i,j-1)+1),

    para 1 i |a| e 1 j |b|

  • Exemplo Distncia de Edio

    Calcular solues de trs para a frente

    Calcular ():Para i: 0 at |a| fazer de[i][0] = iPara i: 0 at |a| fazer de[i][0] = iPara j: 0 at |b| fazer de[0][j] = j

    Para i: 1 at |a| fazerPara j: 1 at |b| fazer

    Se a[i]=b[j] ento valor = 0Seno valor = 1de[i][j] = min( de[i-1][j-1]+value,

    Pedro Ribeiro56Programao Dinmica

    de[i][j] = min( de[i-1][j-1]+value,de[i-1][j],de[i-1][j] )

  • Exemplo Distncia de Edio

    Vejamos a tabela a distncia de edio entre gotas eafoga:

    de(i,0) = i, para 0 i |a|de(0,j) = j, para 0 j |b|

    de(i,j) = min(de(i-1,j-1) +{0 se a[i]=b[i], 1 se a[i]b[i]},

    j 0 1 2 3 4 5

    i A F O G A

    0 0 1 2 3 4 5

    1 G 1 1 2 3 3 4

    2 O 2 2 2 2 3 4

    Pedro Ribeiro57

    Programao Dinmica

    {0 se a[i]=b[i], 1 se a[i]b[i]},de(i-1,j)+1,de(i,j-1)+1),

    para 1i|a| e 0j |b|

    O 2 2 2 2 3 4

    3 T 3 3 3 3 3 4

    4 A 4 3 4 4 4 3

    5 S 5 4 4 5 5 4

  • j 0 1 2 3 4 5

    i A F O G A

    Se fosse preciso reconstruir a soluo?

    Exemplo Distncia de Edio

    0 0 1 2 3 4 5

    1 G 1 1 2 3 3 4

    2 O 2 2 2 2 3 4

    3 T 3 3 3 3 3 4

    Inserir letra

    Apagar letra

    Substituir letra

    Pedro Ribeiro

    T 3 3 3 3 3 4

    4 A 4 3 4 4 4 3

    5 S 5 4 4 5 5 4Manter letra

    58Programao Dinmica

    gotas gota_ gogafoga afogagfoga afoga

  • Concluso

    Nem sempre a PD representa a melhor soluo para um problema, mas no entanto apresenta normalmente ganhos muito significativos sobre algoritmos exponenciais de fora-bruta;

    A PD uma tcnica activamente usada na vida real, tanto no meio empresarial, como no meio acadmico;

    A ideia base da PD muito simples, mas, como foi visto neste ltimo problema, nem sempre fcil chegar sua soluo. Quanto a mim, a parte mais difcil generalizar o problema da maneira correcta, de modo a podermos escrever

    Pedro Ribeiro

    soluo. Quanto a mim, a parte mais difcil generalizar o problema da maneira correcta, de modo a podermos escrever a soluo em funo de solues ptimas de subproblemas;

    S existe uma maneira de dominar a PD: treinar, treinar, treinar!

    59Programao Dinmica

  • Fim

    http://www.dcc.fc.up.pt/~pribeiro/

    [email protected]@dcc.fc.up.pt

    Pedro Ribeiro60Programao Dinmica