Programação Dinâmica



Documentos relacionados
Pedro Ribeiro 2014/2015

1. A corrida de vetores numa folha de papel.

Resolução de sistemas lineares

Resolverei neste artigo uma prova da fundação VUNESP realizada em 2010.

Exercícios Teóricos Resolvidos

Aula 4 Estatística Conceitos básicos

AV1 - MA (b) Se o comprador preferir efetuar o pagamento à vista, qual deverá ser o valor desse pagamento único? 1 1, , , 980

Objectivos PLANEAR 2/90. O que se pretende comunicar ou expor. Queremos:

Cotagem de dimensões básicas

Notas de Cálculo Numérico

A Torre de Hanói e o Princípio da Indução Matemática

Um jogo de preencher casas

Sistemas de Apoio à Decisão

Cotagem de elementos

Programação em papel quadriculado

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES SISTEMAS DE NUMERAÇÃO: REPRESENTAÇÃO EM PONTO FLUTUANTE. Prof. Dr. Daniel Caetano

Introdução à Programação B Licenciatura em Engenharia Informática. Enunciado do trabalho prático. Quem quer ser milionário? 20 de Dezembro de 2007

Potência, uma coisa mais que complicada Parte V

Escalas. Antes de representar objetos, modelos, peças, A U L A. Nossa aula. O que é escala

Resolvendo problemas com logaritmos

Trabalho 7 Fila de prioridade usando heap para simulação de atendimento

Tabelas vista de estrutura

por séries de potências

Alguns truques do Excel. 1- Títulos com inclinação. 2- Preencha automaticamente células em branco

O Windows também é um programa de computador, mas ele faz parte de um grupo de programas especiais: os Sistemas Operacionais.

Trabalho de Implementação Jogo Reversi

O Manual do ssc. Peter H. Grasch

Exposição Matemática Viva (piso 0)

BREVE INTRODUÇÃO AO SISTEMA DA GESTÃO DE DOCUMENTOS DA CÂMARA MUNICIPAL DE MACAU PROVISÓRIA

A Revolução No Seu Negócio

Versão 1. Identifica claramente, na folha de respostas, a versão do teste (1 ou 2) a que respondes.

Exemplos de Problemas Aplicando o Princípio Fundamental da Contagem. Professor: Flávio dos Reis Moura Skype; mineironegrogalo75

O Princípio da Complementaridade e o papel do observador na Mecânica Quântica

Akropole Catequista. Todos os Ficheiros no Akropole Catequista trabalham com uma simples barra de edição, com 4 botões:

OFICINA DE JOGOS APOSTILA DO PROFESSOR

Educação Patrimonial Centro de Memória

[ \ x Recordemos o caso mais simples de um VLVWHPD de duas HTXDo}HVOLQHDUHV nas duas LQFyJQLWDV [ e \.

Figure 2 - Nós folhas de uma árvore binária representando caracteres ASCII

Segredos dos Psicotécnicos para quem não quer ser surpreendido neste volume:

Programação Dinâmica. Programa do PA. Técnicas Avançadas de Projeto. Aulas Anteriores. Introdução. Plano de Aula. Técnicas de Projeto de Algoritmos

1. Explicando Roteamento um exemplo prático. Através da análise de uns exemplos simples será possível compreender como o roteamento funciona.

x0 = 1 x n = 3x n 1 x k x k 1 Quantas são as sequências com n letras, cada uma igual a a, b ou c, de modo que não há duas letras a seguidas?

Cálculo em Computadores trajectórias 1. Trajectórias Planas. 1 Trajectórias. 4.3 exercícios Coordenadas polares 5

PAINEL DE ADMINISTRADOR

CAPÍTULO 2. Grafos e Redes

Sistemas Lineares. Módulo 3 Unidade 10. Para início de conversa... Matemática e suas Tecnologias Matemática

Os gráficos estão na vida

6+3=2 8+2= = 3. Nesses exemplos, os resultados podem ser facilmente confirmados pela multiplicação, que é a operação inversa da divisão.

ALGORITMOS E FLUXOGRAMAS

7 - Análise de redes Pesquisa Operacional CAPÍTULO 7 ANÁLISE DE REDES. 4 c. Figura Exemplo de um grafo linear.

Calculando RPM. O s conjuntos formados por polias e correias

Criar um formulário do tipo Diálogo modal ; Alterar a cor de fundo de um formulário; Inserir botões de comando e caixas de texto;

Controladores Lógicos Programáveis. Automação e Controlo Industrial. Escola Superior de Tecnologia. Ricardo Antunes, António Afonso

SUB12 Campeonato de Resolução de Problemas de Matemática Edição 2009/2010

Manual do Gestor da Informação do Sistema

Métodos Quantitativos Prof. Ms. Osmar Pastore e Prof. Ms. Francisco Merlo. Funções Exponenciais e Logarítmicas Progressões Matemáticas

UTILIZAÇÃO DE RECURSOS AVANÇADOS DO EXCEL EM FINANÇAS (PARTE II): ATINGIR META E SOLVER

Fração como porcentagem. Sexto Ano do Ensino Fundamental. Autor: Prof. Francisco Bruno Holanda Revisor: Prof. Antonio Caminha M.

Avanço Autor: Dan Troyka, Rastros Autor: Bill Taylor, Material Um tabuleiro quadrado 7 por peças brancas e 14 peças negras.

Ambos têm os algarismos 7854 seguidos, a potência de dez apenas moverá a vírgula, que não afeta a quantidade de algarismos significativos.

Realizando cálculos para o aparelho divisor (I)

8º Campeonato Nacional de Jogos Matemáticos

5 Equacionando os problemas

Programação Funcional. Aula 5. Funções Recursivas. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2011.

4Distribuição de. freqüência

Unidade 5: Sistemas de Representação

ESTRATÉGIA e PROSPECTIVA 2009/2010

Aplicações de Combinatória e Geometria na Teoria dos Números

Exercícios 1. Determinar x de modo que a matriz

JUROS SIMPLES. Onde: n é o número de períodos (number of periods) ou prazo em dias; i é o índice da taxa de juros (index) anual;

Catálogo Nacional de Compras Públicas. Manual de Fornecedores

LÓGICA DE PROGRAMAÇÃO. Professor Celso Masotti

A QUALIDADE DOS PLANOS DE DISCIPLINAS

Aula 1: Conhecendo a Calculadora

Programa Olímpico de Treinamento. Aula 9. Curso de Combinatória - Nível 2. Tabuleiros. Prof. Bruno Holanda

Introdução às Bases de Dados

36ª Olimpíada Brasileira de Matemática GABARITO Segunda Fase

ESTUDO 1 - ESTE É JESUS

MÓDULO 4 DISTRIBUIÇÃO DE FREQÜÊNCIAS

Morfologia Matemática Binária

1. Criar uma nova apresentação

C5. Formação e evolução estelar

5 DICAS DE GESTÃO EM TEMPOS DE CRISE. Um guia prático com 5 dicas primordiais de como ser um bom gestor durante um período de crise.

EXCEL 2013 INTERMEDIÁRIO 2. EFETUANDO CÁLCULOS E PREENCHIMENTOS AUTOMÁTICOS 2.1 CRIANDO FÓRMULAS

Além do Modelo de Bohr

4- PROJETO DE BANCO DE DADOS

Compreendendo o espaço

Material Teórico - Aplicações das Técnicas Desenvolvidas. Exercícios e Tópicos Relacionados a Combinatória. Segundo Ano do Ensino Médio

muito gás carbônico, gás de enxofre e monóxido de carbono. extremamente perigoso, pois ocupa o lugar do oxigênio no corpo. Conforme a concentração

Engenharia do Conhecimento

PROPOSTAS DE TRABALHO PARA OS ALUNOS A PARTIR DE JOGOS 2º ANO. Adriana da Silva Santi Coordenação Pedagógica de Matemática

Planeamento e Seguimento de Projectos

Frações. Números Racionais

Curvas em coordenadas polares

O princípio multiplicativo

Sistemas Digitais Contadores. João Paulo Carvalho

Por que o quadrado de terminados em 5 e ta o fa cil? Ex.: 15²=225, 75²=5625,...

Soluções Nível 1 5 a e 6 a séries (6º e 7º anos) do Ensino Fundamental

Transcrição:

fib(5) fib(4) fib(3) fib(3) fib(2) fib(2) fib(1) fib(2) fib(1) fib(1) fib(0) fib(1) fib(0) fib(1) fib(0) Uma metodologia de resolução de problemas 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

Conteúdo Motivação e conceitos base Exemplos iniciais e cálculos repetidos Definição Características de um problema de PD Passos para chegar a uma solução Exemplos de aplicação PD clássica, de contagem, com jogos e mais complexa 2

Números de Fibonacci Sequência de números muito famosa definida por Leonardo Fibonacci 0,1,1,2,3,5,8,13,21,34,... F(0) = 0 F(1) = 1 F(n) = F(n-1) + F(n-2) 3

Números de Fibonacci Como implementar? Implementação directa a partir da definição: fib(n): Se n=0 ou n=1 então retornar n Senão retornar fib(n-1) + fib(n-2) Pontos negativos desta implementação? 4

Números de Fibonacci Cálculos de fib(5) fib(5) fib(4) fib(3) fib(3) fib(2) fib(2) fib(1) fib(2) fib(1) fib(1) fib(0) fib(1) fib(0) fib(1) fib(0) 5

Números de Fibonacci Cálculos de fib(5) fib(5) fib(4) fib(3) fib(3) fib(2) fib(2) fib(1) fib(2) fib(1) fib(1) fib(0) fib(1) fib(0) fib(1) fib(0) Por exemplo, fib(2) é chamado 3 vezes! 6

Números de Fibonacci Como melhorar? Por exemplo, começando do zero e mantendo sempre em memória os dois últimos números da sequência fib(n): Se n=0 ou n=1 então retornar n Senão f1 = 1 f2 = 0 Para i: 2 até n fazer f = f1 + f2 f2 = f1 f1 = f retornar f 7

Números de Fibonacci Conceitos a reter: Divisão de um problema em subproblemas do mesmo tipo Calcular o mesmo subproblema apenas uma vez Será que estas ideias podem também ser usadas noutros problemas mais complicados? 8

Pirâmide de Números Problema clássico das Olimpíadas Internacionais de Informática de 1994 Problema Calcular a rota, que começa no topo da pirâmide e acaba na base, com maior soma. Em cada passo podemos ir diagonalmente para baixo e para a esquerda ou para baixo e para a direita. 9

Pirâmide de Números Duas possíveis rotas Limites: todos os números da pirâmide são inteiros entre 0 e 99 e o número de linhas do triângulo é no máximo 100. Soma = 21 Soma = 30 10

Pirâmide de Números Como resolver o problema? Ideia: Força Bruta! avaliar todos os caminhos possíveis e ver qual o melhor. Mas quanto tempo demora isto? Quantos caminhos existem? 11

Pirâmide de Números Análise da complexidade Em cada linha podemos tomar duas decisões diferentes: esquerda ou direita Seja n a altura da pirâmide. Uma rota é constituída por n 1 decisões diferentes. Existem 2 n-1 caminhos diferentes. Então, um programa que calculasse todas rotas teria complexidade temporal O(2 n ): crescimento exponencial! Note-se que 2 99 6,34x10 29, que é um número demasiado grande! 633825300114114700748351602688 12

Pirâmide de Números Quando estamos no topo da pirâmide, temos duas decisões possíveis (esquerda ou direita): Em cada um dos casos, temos de ter em conta todas as rotas das respectivas subpirâmides assinaladas a amarelo. 13

Pirâmide de Números Mas o que nos interessa saber sobre estas subpirâmides? Apenas interessa o valor da sua melhor rota interna (que é um instância mais pequena do mesmo problema)! Para o exemplo, a solução é 7 mais o máximo entre o valor da melhor rota de cada uma das subpirâmides 14

Pirâmide de Números Então este problema pode ser resolvido recursivamente. Seja P[i][j] o j-ésimo número da i-ésima linha Seja Max(i,j) o melhor que conseguimos a partir da posição i,j 1 2 3 4 5 1 7 2 3 8 3 8 1 0 4 2 7 4 4 5 4 5 2 6 5 15

Pirâmide de Números Então: Max(i,j): Se i = n então Max(i,j) = P[i][j] Senão Max(i,j) = P[i][j] + máximo(max(i+1,j), Max(i+1,j+1)) 1 7 1 2 3 4 5 2 3 8 3 8 1 0 4 2 7 4 4 Para resolver o problema basta chamar Max(1,1) 5 4 5 2 6 5 16

Pirâmide de Números Continuamos com crescimento exponencial! Max(1,1) Max(2,1) Max(2,2) Max(3,1) Max(3,2) Max(3,2) Max(3,3) Max(4,1) Max(4,2) Max(4,2) Max(4,3) Max(4,2) Max(4,3) Max(4,3) Max(4,4)........................ Estamos a avaliar o mesmo subproblema várias vezes! 17

Pirâmide de Números 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] Será que existe uma ordem para preencher a tabela de modo a que quando precisamos de um valor já o temos? 18

Pirâmide de Números Começar a partir do fim! 19

Pirâmide de Números Começar a partir do fim! 4 5 2 6 5 20

Pirâmide de Números Começar a partir do fim! 7 12 10 10 4 5 2 6 5 21

Pirâmide de Números Começar a partir do fim! 30 23 21 20 13 10 7 12 10 10 4 5 2 6 5 22

Pirâmide de Números Tendo em conta a maneira como preenchemos a tabela, até podemos aproveitar P[][]! Calcular (): Para i: n-1 até 1 fazer Para j: 1 até i fazer P[i][j] = P[i][j] + máximo(p[i+1][j], P[i+1][j+1]) Com isto solução fica em P[1][1]! Agora, o tempo necessário para resolver o problema já só cresce polinomialmente ( O(n 2 ) ) e já temos uma solução admissível para o problema (99 2 =9801) 23

Pirâmide de Números Se fosse necessário saber constituição da melhor solução? Basta usar a tabela já calculada! 30 23 21 20 13 10 7 12 10 10 4 5 2 6 5 24

Pirâmide de Números Para resolver o problema da pirâmide de números usamos (PD) 25

(PD) Definição (adaptado de NIST-DADSP*): uma técnica algorítmica, normalmente usada em problemas de optimização, que é baseada em guardar os resultados de subproblemas, em vez de os recalcular. Técnica algorítmica: método geral para resolver problemas que têm algumas características em comum Problema de optimização: quando se pretende encontrar a melhor solução entre todas as soluções admissíveis, mediante um determinado critério (função objectivo). Clássica troca de espaço por tempo * NIST National Institute of Standarts and Technology DADSP Dictionary of Algorithms, Data Structures, and Problems 26

PD - Características Quais são então as características que um problema deve apresentar para poder ser resolvido com PD? Subestrutura óptima Subproblemas coincidentes 27

PD - Características Subestrutura óptima ( optimal substructure ): Quando a solução óptima de um problema contém nela própria soluções óptimas para subproblemas do mesmo tipo. Exemplo: No problema das pirâmides de números, a solução óptima contém nela própria os melhores percursos de subpirâmides, ou seja, soluções óptimas de subproblemas. Quando um problema apresenta esta característica diz-se que ele respeita o princípio de optimalidade ( optimality principle ). 28

PD - Características Subestrutura óptima ( optimal substructure ): É preciso ter cuidado porque isto nem sempre acontece! Exemplo: se, no problema das pirâmides, o objectivo fosse encontrar a rota que maximizasse o resto da divisão inteira entre 10 e o valor dessa rota. 1 5 5 5 4 5 1 5 5 5 4 5 A solução óptima (1 5 5) não contém a solução óptima para a subpirâmide assinalada a amarelo (5 4) 29

PD - Características Subproblemas coincidentes: Quando um espaço de subproblemas é pequeno, isto é, não são muitos os subproblemas a resolver pois muitos deles são exactamente iguais uns aos outros. Exemplo: no problema das pirâmides, para um determinada instância do problema, existem apenas n+(n-1)+...+1<n 2 subproblemas (crescem polinomialmente) pois, como já vimos, muitos subproblemas que aparecem são coincidentes. Também esta característica nem sempre acontece, quer porque mesmo com subproblemas coincidentes são muitos subproblemas a resolver, quer porque não existem subproblemas coincidentes.. Exemplo: no quicksort, cada chamada recursiva é feita a um subproblema novo, diferente de todos os outros. 30

PD - Metodologia Se um problema apresenta estas duas características, temos uma boa pista de que a PD se pode aplicar. No entanto, nem sempre isso acontece. Que passos devemos então tomar se quisermos resolver um problema usando PD? 31

PD - Metodologia (nota: estes passos representam apenas um guia de resolução) 1) Caracterizar a solução óptima do problema 2) Definir recursivamente a solução óptima, em função de soluções óptimas de subproblemas 3) Calcular as soluções de todos os subproblemas: de trás para a frente ou com memoization 4) Reconstruir a solução óptima, baseada nos cálculos efectuados (opcional) 32

PD - Metodologia 1) Caracterizar a solução óptima de um problema Compreender bem o problema Verificar se um algoritmo que verifique todas as soluções à força bruta não é suficiente Tentar generalizar o problema (é preciso prática para perceber como generalizar da maneira correcta) Procurar dividir o problema em subproblemas do mesmo tipo Verificar se o problema obedece ao princípio de optimalidae Verificar se existem subproblemas coincidentes 33

PD - Metodologia 2) Definir recursivamente a solução óptima, em função de soluções óptimas de subproblemas. Definir recursivamente o valor da solução óptima, com rigor e exactidão, a partir de subproblemas mais pequenos do mesmo tipo Imaginar sempre que os valores das soluções óptimas já estão disponíveis quando precisamos deles Não é necessário codificar. Basta definir matematicamente a recursão. 34

PD - Metodologia 3) Calcular as soluções de todos os subproblemas: de trás para a frente Descobrir a ordem em que os subproblemas são 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 função recursiva que resolve o problema Início Ordem normal de resolução Fim. Ordem de optimização usando programação dinâmica 35

PD - Metodologia 3) Calcular as soluções de todos os subproblemas: memoization Existe uma técnica, chamada memoization, que permite resolver o problema pela ordem normal ( topdown ) Usar a função recursiva obtida directamente a partir definição da solução 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 é. 36

PD - Metodologia 4) Reconstruir a solução óptima, baseada nos cálculos efectuados Pode ou não ser requisito do problema Duas alternativas: Directamente a partir da tabela dos sub-problemas Nova tabela que guarda as decisões em cada etapa Não necessitando de saber qual a melhor solução, podemos por vezes poupar espaço 37

Exemplo Subsequência crescente Dada uma sequência de números inteiros: 7, 6, 10, 3, 4, 1, 8, 9, 5, 2 Descobrir qual a maior subsequência crescente (não necessariamente contígua) 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 38

Exemplo Subsequência crescente 1. Caracterizar solução óptima Seja N o tamanho da sequência, e num[i] o i-ésimo número Força bruta, quantas opções? (binomial theorem: 2 n-1 ) Generalizar e resolver com subproblemas iguais: seja best(i) o valor da melhor subsequência a partir da i-ésima posição Caso fácil: a melhor subsequência a começar da última posição tem tamanho 1! Caso geral: para um dado i, podemos seguir para todos os números entre i+1 e N, desde que sejam maiores 7, 6, 10, 3, 4, 1, 8, 9, 5, 2 39

Exemplo Subsequência crescente 1) Caracterizar solução óptima Caso geral: para um dado i, podemos seguir para todos os números entre i+1 e N, desde que sejam maiores Para esses números, basta-nos saber o melhor a partir daí! (princípio da optimalidade) O melhor a partir de uma posição é necessário para calcular todas as posições de índice inferior! (subproblemas coincidentes) 7, 6, 10, 3, 4, 1, 8, 9, 5, 2 40

Exemplo Subsequência crescente 2) Definir solução recursiva em função de soluções óptimas de subproblemas N tamanho da sequência num[i] número na posição i best(i) melhor subsequência a partir da posição i best(n) = 1 best(i) = 1 + máximo{best(j): i<j N, num[j]>num[i]} para 1 i<n 41

Exemplo Subsequência crescente 3) Calcular solução óptima: trás para a frente Seja best[] tabela para guardar valores de best() Calcular (): best[n] = 1 Para i: n-1 até 1 fazer best[i] = 1 Para j: i+1 até N fazer Se num[j]>num[i] e 1+best[j]>best[i] então best[i] = 1+best[j] 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 42

Exemplo Subsequência crescente 4) Reconstruir solução Exemplo de tabela auxiliar com decições Seja next[i] a próxima posição para obter o melhor a partir da posição i ( X se é a última da sequência) 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 next[i] 7 7 X 5 7 7 8 X X X 43

Exemplo Obras na estrada Cidade com quadriculado de ruas (MIUP 2004) Algumas estradas têm obras Só se pode andar para norte e para este N máximo: 30 De quantas maneiras diferentes se pode ir de (x 1,y 1 ) para (x 2,y 2 )? 44

Exemplo Obras na estrada 1) Caracterizar o problema Força bruta? (com N=30, existem ~1,2x10 17 caminhos) Ir de (x 1,y 1 ) para (x 2,y 2 ): pode ignorar-se tudo o que está fora desse rectângulo X X Número de maneiras a partir de uma posição é igual ao número de maneiras desde a posição a norte mais o número de maneiras desde a posição a este! Subproblema igual com solução não dependente do problema maior (equivalente a princípio da optimalidade) Existem muitos subproblemas coincidentes! X X X X X X X X 45

Exemplo Obras na estrada 2) Definir solução recursiva L número de linhas C número de colunas count(i,j) número de maneiras a partir de posição (i,j) obra(i,j,d) valor V/F indicando se existe obra a impedir deslocação de (i,j) na direcção 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: valor_norte(i,j): 0 se (j=l ou obra(i,j,norte)) count(i+1,j) caso contrário valor_este(i,j): 0 se (j=l ou obra(i,j,este)) count(i,j+1) caso contrário 46

Exemplo Obras na estrada 3) Calcular solução óptima: trás para a frente Calcular (): Inicializar count[][] com zeros count[l][c] = 1 Para i: L até 1 fazer Para j: C até 1 fazer Se i<l e não(obra(i,j,norte)) então count[i][j] = count[i][j] + count[i+1][j] Se j<c e não(obra(i,j,este)) então count[i][j] = count[i][j] + count[i][j+1] Count[][] 1 1 1 1 1 1 3 2 1 47

Exemplo Jogo de Pedras Existem N pedras numa mesa Dois jogadores Em cada jogada retira-se 1, 3 ou 8 pedras (generalizável para qualquer número de peças) Quem retirar as últimas pedras ganha o jogo! Pergunta: dado o número de pedras, o jogador que começa a jogar pode garantidamente ganhar? Exemplo: 15 pedras na mesa:jogador A retira 8 7 pedras na mesa: jogador B retira 3 4 pedra na mesa: jogador A retira 1 3 pedras na mesa: jogador B retira 3 0 pedras na mesa: ganhou jogador B! 48

Exemplo Jogo de Pedras 1) Caracterizar solução óptima Solução bruta: avaliar todos jogos possíveis! O(3^N) Como generalizar? Seja win(i) um valor V/F representando se com i pedras conseguimos ganhar (posição ganhadora) Claramente win(1), win(3) e win(8) são verdadeiras E para os outros casos? Se a nossa jogada for dar a uma posição ganhadora, então o adversário pode forçar a nossa derrota Então, a nossa posição é ganhadora se conseguirmos chegar a uma posição que não o seja! Caso todas as jogadas forem dar a posições ganhadoras, a nossa posição é perdedora 49

Exemplo Jogo de Pedras 2) Definir solução recursiva em função de soluções óptimas de subproblemas N número de pedras win[i] valor V/F indicando se estar com i pedras é estar numa posição ganhadora win(0) = falso win(i) = verdadeiro se ~win[i-1] ou ~win[i-3] ou ~win[i-8] falso caso contrário para 1 i N 50

Exemplo Jogo de Pedras 3) Calcular solução óptima: trás para a frente Calcular (): Para i: 0 até N fazer Se (i 1 e não(win[i-1])) ou (i 3 e não(win[i-3])) ou (i 8 e não(win[i-8])) então win[i] = true Senão win[i] = false 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 51

Exemplo Distância de Edição Vamos a um último exemplo um pouco mais complexo Problema: consideremos duas palavras pal 1 e pal 2. O nosso objectivo é transformar pal em pal usando apenas três tipos de transformações: 1 2 1) Apagar uma letra 2) Introduzir uma nova letra 3) Substituir uma letra por outra Qual o mínimo número de transformações que temos de fazer para transformar uma palavra na outra? Chamemos a esta medida distância de edição (de). Exemplo: para transformar gotas em afoga precisamos de quatro transformações: (1) (3) (3) (2) gotas gota_ fota foga afoga 52

Exemplo Distância de Edição 1) Caracterizar solução óptima Seja de(a,b) a distância de edição 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 inserções) 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 53

Exemplo Distância de Edição Nenhuma das palavras é vazia Como podemos igualar o final das duas palavras? Seja l a a última letra de a e a o resto da palavra (do mesmo modo definimos l b e b ). Se l a = l b então só nos falta descobrir a distância de edição entre a e b (que é uma instância mais pequena do mesmo problema!). Caso contrário podemos fazer três operações: Substituir l a por l b. Gastamos uma operação e precisamos de saber a distância de edição entre a e b. Apagar l a. Gastamos uma operação e precisamos de saber a distância de edição entre a e b. Inserir l b no final de a. Gastamos uma operação e precisamos de saber a distância de edição entre a e b. 54

Exemplo Distância de Edição 2) Definir solução recursiva a e b comprimentos das palavras a e b a[i] e b[i] letra na posição i a palavra a e b de(i,j) distância de edição 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]}, de(i-1,j)+1, de(i,j-1)+1), para 1 i a e 1 j b 55

Exemplo Distância de Edição Calcular soluções de trás para a frente Calcular (): Para i: 0 até a fazer de[i][0] = i Para j: 0 até b fazer de[0][j] = j Para i: 1 até a fazer Para j: 1 até b fazer Se a[i]=b[j] então valor = 0 Senão valor = 1 de[i][j] = min( de[i-1][j-1]+value, de[i-1][j], de[i-1][j] ) 56

Exemplo Distância de Edição Vejamos a tabela a distância de edição entre gotas e afoga : i j 0 1 2 3 4 5 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 3 T 3 3 3 3 3 4 4 A 4 3 4 4 4 3 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]}, de(i-1,j)+1, de(i,j-1)+1), para 1 i a e 0 j b 5 S 5 4 4 5 5 4 57

Exemplo Distância de Edição Se fosse preciso reconstruir a solução? j 0 1 2 3 4 5 i A F O G A 0 0 1 2 3 4 5 Inserir letra 1 G 1 1 2 3 3 4 2 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 Apagar letra Substituir letra Manter letra gotas gota_ goga foga afoga gfoga afoga 58

Conclusão Nem sempre a PD representa a melhor solução para um problema, mas no entanto apresenta normalmente ganhos muito significativos sobre algoritmos exponenciais de forçabruta; A PD é uma técnica activamente usada na vida real, tanto no meio empresarial, como no meio académico; A ideia base da PD é muito simples, mas, como foi visto neste último problema, nem sempre é fácil chegar à sua solução. Quanto a mim, a parte mais difícil é generalizar o problema da maneira correcta, de modo a podermos escrever a solução em função de soluções óptimas de subproblemas; Só existe uma maneira de dominar a PD: treinar, treinar, treinar! 59

Fim http://www.dcc.fc.up.pt/~pribeiro/ pribeiro@dcc.fc.up.pt 60