Programação Dinâmica. Aplicação directa - Fibonacci



Documentos relacionados
Técnicas de Desenho de Algoritmos

Algoritmos e Estruturas de Dados I. Recursividade. Pedro O.S. Vaz de Melo

CAL ( ) - MIEIC/FEUP Programação Dinâmica ( )

Matemática Discreta. Leandro Colombi Resendo. Matemática Discreta Bacharel em Sistemas de Informações

PROGRAMAÇÃO LINEAR. Formulação de problemas de programação linear e resolução gráfica

INSTITUTO SUPERIOR TÉCNICO Análise e Síntese de Algoritmos. RESOLUÇÃO DA RESPESCAGEM DO 2 o TESTE

Exercícios: Recursão

Tipos de problemas de programação inteira (PI) Programação Inteira. Abordagem para solução de problemas de PI. Programação inteira

CAPÍTULO O Método Simplex Pesquisa Operacional

Determinantes. Matemática Prof. Mauricio José

Capítulo 5: Repetições

Análise de algoritmos. Parte II

Algoritmos e Estruturas de Dados I. Variáveis Indexadas. Pedro O.S. Vaz de Melo

Metodologias de Programação

ESCOLA SUPERIOR DE TECNOLOGIA DE VISEU

BCC202 - Estrutura de Dados I

ALGA - Eng.Civil - ISE / Matrizes 1. Matrizes

Análise e Síntese de Algoritmos. Programação Dinâmica CLRS, Cap. 15

MANUAL DO USUÁRIO SIMPLEX. Prof. Erico Fagundes Anicet Lisboa, M. Sc.

2) Escreva um algoritmo que leia um conjunto de 10 notas, armazene-as em uma variável composta chamada NOTA e calcule e imprima a sua média.

Ciclo com Contador : instrução for. for de variável := expressão to. expressão do instrução

Definição de determinantes de primeira e segunda ordens. Seja A uma matriz quadrada. Representa-se o determinante de A por det(a) ou A.

Matrizes e Sistemas Lineares. Professor: Juliano de Bem Francisco. Departamento de Matemática Universidade Federal de Santa Catarina.

Disciplina: Álgebra Linear - Engenharias ], C = Basta adicionar elemento a elemento de A e B que ocupam a mesma posição na matriz.

CAP. II RESOLUÇÃO NUMÉRICA DE EQUAÇÕES NÃO LINEARES

Teoria de Jogos. Algoritmo Minimax e Alfa-Beta AED

Análise de Algoritmos

Ficha de Exercícios nº 2

(1, 6) é também uma solução da equação, pois = 15, isto é, 15 = 15. ( 23,

Método Simplex Revisado

Desafios de Programação

4. Álgebra Booleana e Simplificação Lógica. 4. Álgebra Booleana e Simplificação Lógica 1. Operações e Expressões Booleanas. Objetivos.

Semana 7 Resolução de Sistemas Lineares

Estruturas de Repetição

Árvores Parte 1. Aleardo Manacero Jr. DCCE/UNESP Grupo de Sistemas Paralelos e Distribuídos

Álgebra Linear Computacional

Gestão e Teoria da Decisão

COMPUTAÇÃO. O estudante deve ser capaz de apontar algumas vantagens dentre as seguintes, quanto à modalidade EaD:

Árvore de Decisão. 3. Árvore de Decisão

Análise e Projeto de Algoritmos

Sistemas Numéricos. Tiago Alves de Oliveira

GGI026 - Árvore balanceada

Onde: A é a matriz do sistema linear, X, a matriz das incógnitas e B a matriz dos termos independentes da equação

MÉTODO SIMPLEX QUADRO SIMPLEX

Matrizes. Sumário. 1 pré-requisitos. 2 Tipos de matrizes. Sadao Massago a pré-requisitos 1. 2 Tipos de matrizes.

Resolução de sistemas de equações lineares: Método de eliminação de Gauss

Actividade de enriquecimento. Algoritmo da raiz quadrada

Matrizes. matriz de 2 linhas e 2 colunas. matriz de 3 linhas e 3 colunas. matriz de 3 linhas e 1 coluna. matriz de 1 linha e 4 colunas.

INF 1010 Estruturas de Dados Avançadas. Indexação em Espaços Multidimensionais DI, PUC-Rio Estruturas de Dados Avançadas 2012.

Arquitetura de Computadores I

1. Números. MatemáticaI Gestão ESTG/IPB Departamento de Matemática. Números inteiros. Nota: No Brasil costuma usar-se: bilhão para o número

Capítulo VI. Teoremas de Circuitos Elétricos

SOLUÇÕES N item a) O maior dos quatro retângulos tem lados de medida 30 4 = 26 cm e 20 7 = 13 cm. Logo, sua área é 26 x 13= 338 cm 2.

Planificação Anual de Matemática 5º Ano

XXXII Olimpíada Brasileira de Matemática. GABARITO Segunda Fase

MC Teste de Mesa e Comandos Repetitivos

5. O Mapa de Karnaugh

Aula 8 Variações da Eliminação de Gauss/Fatoração LU.

Aula 01 Introdução Custo de um algoritmo, Funções de complexidad e Recursão

2 Casamento Inexato, Alinhamento de Sequências e Programação DRAFT

Representação de Circuitos Lógicos

1.2. Recorrendo a um diagrama em árvore, por exemplo, temos: 1.ª tenda 2.ª tenda P E E

INVESTIGAÇÃO OPERACIONAL. Programação Linear. Exercícios. Cap. III Método Simplex

para x = 111 e y = 112 é: a) 215 b) 223 c) 1 d) 1 e) 214 Resolução Assim, para x = 111 e y = 112 teremos x + y = 223.

12 26, 62, 34, , , 65

Métodos Quantitativos Aplicados

PROFMAT AV3 MA (1,0) (a) Prove isto: Se um número natural não é o quadrado de um outro número natural, sua raiz quadrada é irracional.

Alguns Apontamentos Sobre Cálculo Combinatório

Projecto Delfos: Escola de Matemática Para Jovens 1 TEORIA DOS NÚMEROS

Isomorfismos de Grafos, Grafos Planares e Árvores

Árvores de Derivação para GLC Ambigüidade nas GLC Precedência, Prioridade e Associatividade de operadores

=...= 1,0 = 1,00 = 1,000...

Programação. Folha Prática 4. Lab. 4. Departamento de Informática Universidade da Beira Interior Portugal Copyright 2010 All rights reserved.

Representações de caracteres

Comparação com Divisão e Conquista

Árvores de Decisão Matemática Discreta

GABARITO PROVA AMARELA

Universidade Federal de Santa Maria Centro de Ciências Naturais e Exatas Departamento de Física Laboratório de Teoria da Matéria Condensada

Prof. A. G. Silva. 25 de setembro de Prof. A. G. Silva INE5603 Introdução à POO 25 de setembro de / 35

O termo Programação Dinâmica é um bocado infeliz.

Exercícios de Aprofundamento Mat Polinômios e Matrizes

Algoritmo da raiz quadrada

Introdução à Inteligência Artificial 2007/08

Teoria Básica e o Método Simplex. Prof. Ricardo Santos

Em linguagem matemática, essa proprieade pode ser escrita da seguinte maneira: x. 1 = x Onde x representa um número natural qualquer.

Apontamentos de matemática 5.º ano - Múltiplos e divisores

Álgebra Linear AL. Luiza Amalia Pinto Cantão. Depto. de Engenharia Ambiental Universidade Estadual Paulista UNESP

PHP Estruturas de repetição

INF 1010 Estruturas de Dados Avançadas

Apostila de Matemática 16 Polinômios

Técnicas Digitais A AULA 08. Prof. João Marcos Meirelles da Silva. Sala 425

BC-0504 Natureza da Informação

INF1005: Programação I. Algoritmos e Pseudocódigo

Versão 2 COTAÇÕES pontos pontos pontos pontos pontos pontos

Aula de Hoje. Processamento Estatístico da Linguagem Natural. Decodificação. Decodificação. A treliça do algoritmo Viterbi

Resolução Numérica de Equações Parte I

Capítulo VI Circuitos Aritméticos

MATEMÁTICA II. Aula 12. 3º Bimestre. Determinantes Professor Luciano Nóbrega

Subsequência comum mais longa Em inglês, Longest Common Subsequence (LCS)

Transcrição:

Programação Dinâmica Divisão e conquista: problema é partido em subproblemas que se resolvem separadamente; solução obtida por combinação das soluções Programação dinâmica: resolvem-se os problemas de pequena dimensão e guardam-se as soluções; solução de um problema é obtida combinando as de problemas de menor dimensão Divisão e conquista é top-down Programação dinâmica é bottom-up Abordagem é usual na Investigação Operacional Programação é aqui usada com o sentido de formular restrições ao problema que tornam um método aplicável Quando é aplicável a programação dinâmica: estratégia óptima para resolver um problema continua a ser óptima quando este é subproblema de um problema de maior dimensão Aplicação directa - Fibonacci Problemas expressos recursivamente que podem ser reescritos em formulação iterativa Exemplo: números de Fibonacci /** Números de Fibonacci * versão recursiva */ n >= 0 int fib( const unsigned int n ) if( n <= 1 ) return 1; else return fib( n-1 ) + fib( n-2 ); /** Números de Fibonacci * versão iterativa */ int fibonacci(int n ) int last=1, nexttolast=1, answer=1; if( n <= 1 ) return 1; for( int i = 2; i<=n; i++ ) answer = last + nexttolast; nexttolast = last; last = answer; return answer; Cristina Ribeiro Programação Dinâmica - 1

Fibonacci Expressão recursiva: algoritmo exponencial Expressão iterativa: algoritmo linear Problema na formulação recursiva: repetição de chamadas iguais F6 F5 F4 F4 F3 F3 F2 F3 F2 F2 F2 F0 F2 F0 F0 F0 F0 Exemplo: Equação de recorrência n 1 C(n) = 2 C(i) + n Para resolver numericamente, n i =0 expressão recursiva é directa double eval( int n ) double sum = 0.0; if( n == 0 ) return 1.0; for( int i = 0; i < n; i++ ) Sum += eval( i ); return 2.0 * sum / n + n; Algoritmo recursivo é exponencial! Problema: repetição de chamadas Cristina Ribeiro Programação Dinâmica - 2

Chamadas Repetidas C5 C4 C3 C2 C3 C2 C2 C2 Solução iterativa 1 double eval(int n ) double [ ] c = new double [n+1]; c[0] = 1.0; for( int i = 1; i <= n; i++ ) double sum = 0.0; for( int j = 0; j < i; j++ ) sum += c[j]; Algoritmo iterativo O(n 2 ) c[i] = 2.0 * sum / i + i; return c[n]; Evita chamadas recursivas guardando tabela de C(n) Cristina Ribeiro Programação Dinâmica - 3

Solução iterativa 2 double eval(int n ) double sum = 0.0; double [ ] a = new double [n+1]; a[0] = 1.0; for( int i = 1; i <= n; i++ ) a[i] = a[i-1] + 2.0 * a[i-1] / i + i; Algoritmo iterativo O(n) double answer = 2.0 * a[n] / n + n; return answer; Tabela de A(n) guarda valor dos somatórios; para cada entrada basta acrescentar 1 termo Problema da mochila Enunciado: O ladrão encontra o cofre cheio de items de vários tamanhos e valores, mas tem apenas uma mochila de capacidade limitada; qual a combinação de items que deve levar para maximizar o valor do roubo? Exemplo Tamanho: 3 4 7 8 Valor: 4 5 10 11 13 Nome: A B C D E 9 Mochila: capacidade 17 4 item tipo A: valor 20 1 item tipo D e 1 item tipo E: valor 24... qual a melhor combinação? Cristina Ribeiro Programação Dinâmica - 4

Mochila como Programação Dinâmica Muitas situações de interesse comercial melhor forma de carregar um camião ou avião Tem variantes: número de items de cada tipo pode ser limitado Abordagem programação dinâmica: calcular a melhor combinação para todas as mochilas de tamanho até M cálculo é eficiente se feito pela ordem apropriada for( j = 1; j <= N; j++ ) for( i=1; i <= M; i++ ) if ( i >= size[j] ) if ( cost[i] < cost[i-size[j]] + val[j] ) cost[i] = cost[i-size[j]] + val[j]; best[i] = j; Análise do Algoritmo cost[i] maior valor que se consegue com mochila de capacidade i best[i] último item acrescentado para obter o máximo Calcula-se o melhor valor que se pode obter usando só items tipo A, para todos os tamanhos de mochila Repete-se usando só A s e B s, e assim sucessivamente Quando um item j é escolhido para a mochila: o melhor valor que se pode obter é val[j] (do item) mais cost[i-size[j]] (para encher o resto) Se o valor assim obtido é superior ao que se consegue sem usar o item j, actualiza-se cost[i] e best[i]; senão mantêm-se. Conteúdo da mochila óptima: recuperado através do array best[i]; best[i] indica o último item da mochila; o restante é o indicado para a mochila de tamanho M-size[best[M]] Eficiência: A solução em programação dinâmica gasta tempo proporcional a NM. Cristina Ribeiro Programação Dinâmica - 5

EXECUÇÃO j=1 k 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 cost[k] 4 4 4 8 8 8 12 12 12 16 16 16 20 20 20 best[k] A A A A A A A A A A A A A A A j=2 j=3 j=4 j=4 cost[k] best[k] cost[k] best[k] cost[k] best[k] cost[k] best[k] 4 5 5 8 9 10 12 13 14 16 17 18 20 21 22 A B B A B B A B B A B B A B B 4 5 5 8 10 10 12 14 15 16 18 20 20 22 24 A B B A C B A C C A C C A C C 4 5 5 8 10 11 12 14 15 16 18 20 21 22 24 A B B A C D A C C A C C D C C 4 5 5 8 10 11 13 14 15 17 18 20 21 23 24 A B B A C D E C C E C C D E C Produto de matrizes em cadeia Enunciado: Dada uma sequência de matrizes de dimensões diversas, como fazer o seu produto minimizando o esforço computacional Exemplo: a 11 a 12 a 21 a 22 b 11 b 12 b 13 a 31 a 32 b 21 b 22 b 23 a 41 a 42 c 11 c 21 c 31 d 11 d 12 [ ] e 11 e 12 f 11 f 12 f 13 e 21 e 22 f 21 f 22 f 23 Multiplicando da esquerda para a direita: 84 operações Multiplicando da direita para a esquerda: 69 operações Qual a melhor sequência? Cristina Ribeiro Programação Dinâmica - 6

Multiplicação de matrizes N matrizes a multiplicar M 1 M 2 M 3... M N, M i tem r i linhas e r i+1 colunas Multiplicação de matriz pxq por matriz qxr produz matriz pxr, requerendo q produtos para cada entrada - total é pqr operações Algoritmo em programação dinâmica: Problemas de dimensão 2: só há 1 maneira de multiplicar, regista-se custo Problemas de dimensão 3:o menor custo de realizar M 1 M 2 M 3 é calculado comparando os custos de multiplicar M 1 M 2 por M 3 e de multiplicar M 2 M 3 por M 1 ; o menor é registado. O procedimento repete-se para sequências de tamanho crescente Em geral: para 1 j N-1 encontra-se o custo mínimo de calcular M i M i+1... M i+j encontrando, para 1 i N-j e para cada k entre i e i+j os custos de obter M i M i+1... M k-1 e M k M k+1... M i+j somando o custo de multiplicar estes resultados Código for( i=1; i <= N; i++ ) for( j = i+1; j <= N; j++ ) cost[i][j] = INT_MAX; for( i=1; i <= N; i++ ) cost[i][i] = 0; for( j=1; j < N; j++ ) for( i=1; i <= N-j; i++ ) for( k= i+1; k <= i+j; k++ ) t = cost[i][k-1] + cost[k][i+j] + r[i]*r[k]*r[i+j+1]; if( t < cost[i][i+j] ) cost[i][i+j] = t; best[i][i+j] = k; Cristina Ribeiro Programação Dinâmica - 7

Caso geral para 1 j N-1 encontra-se o custo mínimo de calcular M i M i+1... M i+j para 1 i N-j e para cada k entre i e i+j calculam-se os custos para obter M i M i+1... M k-1 e M k M k+1... M i+j soma-se o custo de multiplicar estes 2 resultados Cada grupo é partido em grupos mais pequenos -> custos mínimos para os 2 grupos são vistos numa tabela Sendo cost[l][r] o mínimo custo para M l M l+1... M r,, o custo do 1º grupo em cima é cost[i][k-1] e o do segundo é cost[k][i+j]. Custo da multiplicação final: M i M i+1... M k-1 é uma matriz r i x r k e M k M k+1... M i+j é uma matriz r k x r i+j+1, o custo de multiplicar as duas é r i r k r i+j+k. Programa obtém cost[i][i+j] para 1 i N-j, com j de 1 a N-1. Chegando a j=n-1, tem-se o custo de calcular M 1 M 2... M N. Recuperar a sequência óptima: array best guarda o rasto das decisões feitas para cada dimensão Permite recuperar a sequência de custo mínimo Exemplo - Solução B C D E F A 24 14 22 26 36 [A][B] [A][BC] [ABC][D] [ABC][DE] [ABC][DEF] B 6 10 14 22 [B][C] [BC][D] [BC][DE] [BC] [DEF] C 6 10 19 [C][D] [C][DE] [C] [DEF] D 4 10 [D][E] [DE] [F] E 12 [E] [F] Cristina Ribeiro Programação Dinâmica - 8

Árvores de pesquisa binária óptimas Em pesquisa, as chaves ocorrem com frequências diversas; exemplos: verificador ortográfico: encontra mais frequentemente as palavras mais comuns compilador de Java: encontra mais frequentemente if e for que goto ou main Usando uma árvore de pesquisa binária: é vantajoso ter mais perto do topo as chaves mais usadas Algoritmo de programação dinâmica pode ser usado para organizar as chaves de forma a minimizar o custo total da pesquisa Problema tem semelhança com o dos códigos de Huffman (minimização do tamanho do caminho externo); mas esse não requer a manutenção da ordem das chaves; na árvore de pesquisa binária os nós à esquerda de cada nó têm chaves menores que a deste. Problema é semelhante ao da ordem de multiplicação das matrizes Exemplo C A 1 F 4 B D 2 G 2 3 E 1 5 Custo da árvore: - multiplicar a frequência de cada nó pela sua distância à raiz - somar para todos os nós É o comprimento de caminho interno pesado da árvore Cristina Ribeiro Programação Dinâmica - 9

Dados: chaves K1 < K2 <... < Kn frequências respectivas r0, r1,..., rn Algoritmo Pretende-se árvore de pesquisa que minimize a soma, para todas as chaves, dos produtos das frequências pelas distâncias à raiz Abordagem em programação dinâmica: calcular, para cada j de 1 a N-1, a melhor maneira de construir subárvore contendo Ki, Ki+1,..., Ki+j, para 1 i N-j Para cada j, tenta-se cada nó como raiz e usam-se os valores já computados para determinar as melhores escolhas para as subárvores. Para cada k entre i e i+j, pretende-se a árvore óptima contendo Ki, Ki+1,..., Ki+j com Kk na raiz; esta árvore é formada usando a árvore óptima para Ki, Ki+1,..., Kk-1 como subárvore esquerda e a árvore óptima para Kk+1, Kk+2,... Ki+j como subárvore direita. Algoritmo for( i=1; i <= N; i++ ) for( j = i+1; j <= N+1; j++ ) cost[i][j] = INT_MAX; for( i=1; i <= N; i++ ) cost[i][i] = f[i]; for( i=1; i <= N+1; i++ ) cost[i][i-1] = 0; for( j=1; j < N-1; j++ ) for( i=1; i <= N-j; i++ ) for( k= i; k <= i+j; k++ ) t = cost[i][k-1] + cost[k+1][i+j]; if( t < cost[i][i+j] ) cost[i][i+j] = t; best[i][i+j] = k; for( k= i; k <= i+j; cost[i][i+j] += f[k++] ); Cristina Ribeiro Programação Dinâmica - 10

Árvore binária óptima D A 3 E 4 B 5 F 2 C 2 G 1 1 Peso da árvore: 41 Eficiência O método para determinar uma árvore de pesquisa binária óptima em programação dinâmica gasta tempo O(N 3 ) e espaço O(N 2 ) Examinando o código: O algoritmo trabalha com uma matriz de dimensão N 2 e gasta tempo proporcional a N em cada entrada, É possível melhorar: usando o facto de que a posição óptima para a raiz da árvore não pode ser muito distante da posição óptima para uma árvore um pouco menor, no programa dado k não precisa de cobrir todos os valores de i a i+j Cristina Ribeiro Programação Dinâmica - 11