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

Documentos relacionados
Divisão-e-Conquista ( ) CAL ( ) MIEIC/FEUP. ./rr (1) Técnicas de Concepção de Algoritmos

CAL ( ) MIEIC/FEUP Técnicas de Concepção de Algoritmos, CAL MIEIC/FEUP, Fev. de Técnicas de Concepção de Algoritmos. .

Desafios de Programação

Programação Dinâmica I SCC0210 Algoritmos Avançados (2/2011) Lucas Schmidt Cavalcante

Técnicas de Desenho de Algoritmos

Técnicas de Desenho de Algoritmos

Técnicas de Desenho de Algoritmos

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

Fernando Lobo. Algoritmos e Estrutura de Dados. Outra técnica de concepção de algoritmos, tal como Divisão e Conquista.

Comparação com Divisão e Conquista

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

Programação Dinâmica. Prof. Anderson Almeida Ferreira

Programação Dinâmica. Prof. Anderson Almeida Ferreira. Adaptado do material elaborado por Andrea Iabrudi Tavares

Algoritmos em Strings

Backtracking( ) CAL ( ) MIEIC/FEUP. ./rr(1) Técnicas de Concepção de Algoritmos

Projeto e Análise de Algoritmos

5. Análise de Complexidade de Algoritmos. João Pascoal Faria (versão original) Ana Paula Rocha (versão 2003/2004) Luís Paulo Reis (versão 2005/2006)

Recursividade. Prof. Jesus José de Oliveira Neto

Análise de Complexidade de Algoritmos

Divisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder

Técnicas de projeto de algoritmos: Indução

Algoritmos e Estruturas de Dados I Linguagem C

Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

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

BCC202 - Estrutura de Dados I

3. Vectores: Algoritmos de Pesquisa. João Pascoal Faria (versão original) Ana Paula Rocha (versão 2004/2005) Luís Paulo Reis (versão 2005/2006)

Complexidade de Algoritmos

Projeto e Análise de Algoritmos

a) Defina uma função para obter o máximo entre dois números

CAL ( ) MIEIC/FEUP Grafos: Introdução (Março, 2011)

Programação I Aula 16 Mais exemplos de recursão

Fundamentos de programação

SCC-601 Introdução à Ciência da Computação II. Ordenação e Complexidade Parte 3. Lucas Antiqueira

Programação Estruturada

Introdução à Programação / Programação I

Recursividade. Objetivos do módulo. O que é recursividade

AULA 15. Algoritmos p.600/637

Problema de seleção de atividades. Aula 14. Exemplo. Algoritmos Gulosos. Algoritmos Gulosos. Intervalo: par ordenado de números

Análise de Problemas Recursivos. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Recursão David Déharbe

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros:

Análise e Complexidade de Algoritmos

Introdução à Programação

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: funções

Algoritmos e Estruturas de Dados II LEIC

AULA TEÓRICA 10. Tema 9. Interface. Tema 10. Recursividade

Estrututas de Dados e Algoritmos. Estrutura de Dados e Algoritmos

Programação dinâmica. CLRS cap 15. = recursão com tabela = transformação inteligente de recursão em iteração

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Técnicas de análise de algoritmos

Técnicas de Concepção de Algoritmos: Branch and Bound

CAL ( ) MIEIC/FEUP Estruturas de Dados ( )

ALGORITMOS E ESTRUTURAS DE DADOS 2011/2012 ANÁLISE DE ALGORITMOS. Armanda Rodrigues 3 de Outubro 2011

Filas de prioridade. Marcelo K. Albertini. 27 de Novembro de 2014

Conceitos Básicos de C

Árvores Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação

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

Estruturas de Dados Aula 14: Recursão

Algoritmos e Estruturas de Dados I 01/2013. Vetores e Recursividade. Pedro O.S. Vaz de Melo

Algoritmos e Estruturas de Dados II

Estruturas de Dados Aula 14: Recursão 19/05/2011

Prova 1 PMR2300 / PMR3201 1o. semestre 2015 Prof. Thiago Martins

Algoritmos e Estruturas de Dados

INF 1010 Estruturas de Dados Avançadas. Árvores binárias

INF1007: Programação 2 6 Ordenação de Vetores. 01/10/2015 (c) Dept. Informática - PUC-Rio 1

Análise da Complexidade de Algoritmos

Ordenação: QuickSort. Prof. Túlio Toffolo BCC202 Aula 15 Algoritmos e Estruturas de Dados I

Fundamentos de Programação

UNIVERSIDADE LUSÍADA DE LISBOA. Programa da Unidade Curricular INTRODUÇÃO AOS ALGORITMOS E ESTRUTURAS DE DADOS Ano Lectivo 2016/2017

Projeto e Análise de Algoritmos

INSTRUÇÕES DE REPETIÇÃO

SCC0601 Projeto de Algoritmos. Recursão

UNIVERSIDADE LUSÍADA DE LISBOA. Programa da Unidade Curricular INTRODUÇÃO AOS ALGORITMOS E ESTRUTURAS DE DADOS Ano Lectivo 2014/2015

Algoritmos e Estrutura de Dados. Aula 01 Apresentação da Disciplina e Introdução aos Algoritmos Prof. Tiago A. E. Ferreira

Prova de Recuperação PMR3201/PMR2300 1o. semestre 2015 Prof. Thiago Martins

Listas Estáticas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

PROGRAMAÇÃO DINÂMICA

Ordenação: MergeSort. Prof. Túlio Toffolo BCC202 Aula 14 Algoritmos e Estruturas de Dados I

Recursividade. Métodos iterativos. Prof. Cesar Augusto Tacla. Métodos iterativos utilizam estruturas de repetição

Introdução à Programação em C

Estruturas de Repetição

Recursão. Aula 1. Liana Duenha. Faculdade de Computação Universidade Federal de Mato Grosso do Sul

Algoritmos de Ordenação

Programação dinâmica

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

04 Recursão SCC201/501 - Introdução à Ciência de Computação II

controle de fluxo repetições iterativas

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição

6. Pesquisa e Ordenação

Aula 10 Comandos de Repetição

Problema da Mochila Booleana: Uma Solução Usando Programação Dinâmica. Gabriel Rosa Guilherme Alves

5COP088. Aula 2 Linguagem Estruturada Prof. Dr. Sylvio Barbon Junior. Laboratório de Programação. Aula 2 Linguagem Estruturada

Programação Estruturada Prof. Rodrigo Hausen Condicionais e Laços

Programação científica C++

ALGORITMOS I. Procedimentos e Funções

Transcrição:

AL (-) - MIEI/FEUP Programação Dinâmica (--4) Técnicas de oncepção de Algoritmos (ª parte): programação dinâmica R. Rossetti, A.P. Rocha, A. Pereira, P.B. Silva, T. Fernandes AL, MIEI, FEUP Fevereiro de Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de Programação dinâmica (dynamic programming) Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de Técnicas de oncepção de Algoritmos./rr()

AL (-) - MIEI/FEUP Programação Dinâmica (--4) Aplicabilidade e abordagem Problemas resolúveis recursivamente (solução é uma combinação de soluções de subproblemas similares) Mas em que a resolução recursiva directa duplicaria trabalho (resolução repetida do mesmo subproblema) Abordagem: º) Economizar tempo (evitar repetir trabalho), memorizando as soluções parciais dos sub-problemas (gastando memória!) º) Economizar memória, resolvendo sub-problemas por ordem que minimiza nº de soluções parciais a memorizar (bottom-up, começando pelos casos base) Termo Programação vem da Investigação Operacional, no sentido de formular restrições ao problema que tornam um método aplicável Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de Exemplo: n k, versão recursiva 4 int comb(int n, int k) { if (k == k == n) return ; else return comb(n-, k) + comb(n-, k-); } Executa n k - vezes (nº de somas a efectuar é nº de parcelas -) Executa n k vezes (nº de s / parcelas que é preciso somar ) Executa n k - vezes para calcular n k!! Pode-se melhorar muito, evitando repetição de trabalho (cálculos intermédios i j ) Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de Técnicas de oncepção de Algoritmos./rr()

AL (-) - MIEI/FEUP Programação Dinâmica (--4) n k repetição de trabalho 5 5 = 4 4 9 nós/chamadas! 8 chamadas duplicadas! Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de n k - Programação dinâmica 6 Memorização de soluções parciais: n k k= k= K= K= K=4 k=5 n= n= n= i n= j n=4 4 6 4 n=5 5 5 Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de Técnicas de oncepção de Algoritmos./rr()

AL (-) - MIEI/FEUP Programação Dinâmica (--4) Implementação Guardar apenas uma coluna, e calcular da esq. para dir. (também se podia guardar linha e calc. cima p/ baixo): static final int MAXN = 5; static int c[] = new int[maxn+]; T(n,k) = O(k(n-k)) int comb(int n, int k) { S(n,k) = O(n-k) int maxj = n - k; for (int j = ; j <= maxj; j++) c[j] = ; n-k+ vezes for (int i = ; i <= k; i++) for (int j = ; j <= maxj; j++) k(n-k) vezes c[j] += c[j-]; return c[maxj]; } Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de 7 Problema da mochila 8 Um ladrão encontra o cofre cheio de itens de vários tamanhos e valores, mas tem apenas uma mochila de capacidade limitada; qual a combinação de itens que deve levar para maximizar o valor do roubo? Tamanhos e capacidades inteiros Vamos assumir nº ilimitado de itens de cada tipo Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de Técnicas de oncepção de Algoritmos./rr(4)

AL (-) - MIEI/FEUP Programação Dinâmica (--4) Exemplo 9 Itens Tamanho 4 7 8 9 apacidade da mochila: 7 Valor 4 Nome A 5 B D E Uma solução óptima: 7 7 Outra solução óptima: 8 9 4 A D E Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de Estratégia de prog. dinâmica alcular a melhor combinação para todas as mochilas de capacidade até M (capacidade pretendida) omeçar por considerar que só se pode usar o item, depois os itens e, etc., e finalmente todos os itens de a N (N = nº de itens) álculo é eficiente em tempo e espaço se efectuado pela ordem apropriada Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de Técnicas de oncepção de Algoritmos./rr(5)

AL (-) - MIEI/FEUP Programação Dinâmica (--4) Dados Entradas: N nº de itens (com nº de cópias ilimitado de cada item) size[i] ( i N) tamanho (inteiro) do item i val[i] ( i N) valor do item i M capacidade da mochila (inteiro) Dados de trabalho, no final de cada iteração i (de a N) cost[k] ( k M) melhor valor que se consegue com mochila de capacidade k, usando apenas itens de a i best[k] ( k M) último item seleccionado p/ obter melhor valor com mochila de capac. k, usando apenas itens de a i Dados de saída: cost[m] melhor valor que se consegue c/ mochila de cap. M best[m], best[m-size[best[m]], size[best[m]], etc. itens seleccionados Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de Formulação recursiva aso base (i = ; k =,, M): cost[ k] best[ k] () () = = aso recursivo (i =,, N; k =,, M) : ( cost[ k] ( best[ k] i) i) size[ i] k ( i) val[ i] + cost[ k -size[ i]], se = ( i) ( val[ i] + cost[ k -size[ i]] > cost[ k] ( i ) cost[ k], no caso contrário i, no primeiro caso acima (usa o item i) = ( i ) best[ k], no segundo caso acima (não usa o item i) Encher o resto i ) Permite usar repetidamente o item i (senão, escrevíamos i-) Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de Técnicas de oncepção de Algoritmos./rr(6)

AL (-) - MIEI/FEUP Programação Dinâmica (--4) odificação Tempo: T(N,M) = O(NM) Espaço: S(N,M) = O(M) int[] cost = new int[m+]; // iniciado c/ s int[] best = new int[m+]; // iniciado c/ s for (int i = ; i <= N; i++ ) for (int k = size[i]; k <= M; k++) if (val[i] + cost[k-size[i]] > cost[k]) { cost[k] = val[i] + cost[k-size[i]]; best[k] = i; omo k é percorrido por ordem crescente } cost[k-size[i]] já tem o valor da iteração i // impressão de resultados (valor e itens) print(cost[m]); for (int k = M; k > ; k -= size[best[k]]) print(best[k]); Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de *Evolução dos dados de trabalho 4 i size val k 4 5 6 7 8 9 4 5 6 7 - - cost[k] best[k] 4 cost[k] 4 4 4 8 8 8 6 6 6 best[k] 4 5 cost[k] 4 5 5 8 9 4 6 7 8 best[k] 7 cost[k] 4 5 5 8 4 5 6 8 4 best[k] 4 8 cost[k] 4 5 5 8 4 5 6 8 4 best[k] 4 4 5 9 cost[k] 4 5 5 8 4 5 7 8 4 best[k] 4 5 5 4 5 Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de Técnicas de oncepção de Algoritmos./rr(7)

AL (-) - MIEI/FEUP Programação Dinâmica (--4) * Subsequência crescente mais comprida 5 Exemplo: Sequência S = (9, 5,, 8, 7,,, 6, 4) Subsequência crescente mais comprida (elem s não necessariamente contíguos): (,, 4) ou (,, 6) Formulação: s,, s n - sequência l i compr. da maior subseq. crescente de (s,, s i ) p i predecessor de s i nessa subsequência crescente l i = + max { l k < k < i s k < s i } (max{ } = ) p i = valor de k escolhido para o máx. na expr. de l i omprimento final: max(l i ) Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de * álculo para o exemplo dado 6 i 4 5 6 7 8 9 Sequência si 9 5 8 7 6 4 Tamanho li Predecessor pi - - - - 6 6 Resposta: (,, 6) Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de Técnicas de oncepção de Algoritmos./rr(8)

AL (-) - MIEI/FEUP Programação Dinâmica (--4) * Números de Fibonacci 7 Formulação recursiva: F() = F() = F(n) = F(n-) + F(n-), n > Para calcular F(n), basta memorizar os dois últimos elementos da sequência para calcular o seguinte: int Fib(int n) { int a =, b = ; // F(-), F() for (int i=; i <= n; i++) {int t = a; a = b; b += t; } return b; } Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de Referências 8 Mark Allen Weiss. Data Structures & Algorithm Analysis in Java. Addison-Wesley, 999 Steven S. Skiena. The Algorithm Design Manual. Springer 998 Robert Sedgewick. Algorithms in ++. Addison-Wesley, 99 Slides de Maria ristina Ribeiro Técnicas de oncepção de Algoritmos, AL MIEI/FEUP, Fev. de Técnicas de oncepção de Algoritmos./rr(9)