Você está na página 1de 13

CCAE

Algoritmos Avanados
Programao Dinmica

Centro de Cincias Aplicadas e Educao

UFPB - Campus IV - Litoral Norte

Reviso: Diviso e Conquista

Particiona o problema em subproblemas independentes; Resolve os problemas recursivamente; Combina suas solues para solucionar o problema original.

Programao Dinmica
Programao dinmica tambm resolve um problema P combinando as solues para subproblemas P Contudo, neste caso, os subproblemas no so necessariamente diferentes:

a soluo de P pode depender de m1 problemas P1, m2 problemas P2 e assim por diante.

Um algoritmo de programao dinmica resolve cada subproblema apenas uma vez e armazena sua resposta em uma tabela, evitando o trabalho de recomputar a resposta toda vez que o subproblema encontrado.

Caractersticas Importantes

A decomposio de P nos subproblemas P deve ser de natureza relativamente simples; Usualmente P e P esto relacionados por uma frmula de recorrncia; A tabela deve ser definida, de modo a tornar simples o acesso aos seus resultados.

Exemplo 1: Sequncia de Fibonacci

Consiste de uma sequncia de inteiros, tal que:


os primeiros dois elementos so 0 e 1, respectivamente; posteriormente, cada elemento da sequncia definido como a soma dos dois imediatamente anteriores;

Fenotamos por F(n) o n-simo elemento da sequncia e o que segue seria um processo natural para a sua determinao: if n <= 1 ento F(n) = n seno F(n) = F(n 1) + F(n 2).

Fatos Importantes
O problema de se determinar F(n) foi decomposto nos subproblemas de se determinar F(n 1) e F(n 2). Alm disto, para calcular F(n 1), com (n 1) > 1, necessitamos dos resultados dos subproblemas F(n 2) e F(n 3).

Objetivo: resolver cada subproblema uma nica vez, armazenar o resultado e recuperar esta informao toda vez que o subproblema for considerado.

Soluo por Programao Dinmica.

Usar um vetor de tamanho (n + 1), sendo F(n) o elemento da sequncia que desejamos calcular. Veja o exemplo para n = 10: n: F(n): 0 1 2 3 4 5 6 7 8 9 10 0 1 1 2 3 5 8 13 21 34 55

Complexidade: O(n) pois cada elemento da sequncia calculado em tempo constante, iniciando em 0 e prosseguindo em ordem crescente at n.

Exemplo 2: Problema da Mochila


Este um problema de otimizao e como tal possui muitas solues possveis, onde cada uma delas tem um valor Desejamos descobrir uma soluo com o valor timo de acordo com um critrio de minimizao ou maximizao. Existem muitas variaes deste problema, consideraremos a mais simples delas:

Definio Mochila(n,K): dados um inteiro K e n itens de tamanhos diferentes tal que o i-simo item tem um tamanho inteiro ki , descobrir um subconjunto de itens cujos tamanhos somam exatamente K, ou determine que nenhum tal subconjunto existe.

Observaes

A mochila pode ser um caminho, navio, chip de silcio, etc. Mochila(i,j) denotar o problema com os primeiros i itens e uma mochila de tamanho j. Por simplicidade, nos concentraremos apenas em descobrir se uma soluo existe.

Algoritmo Mochila (S,K)

Entrada: um vetor S de tamanho n armazenando os tamanhos dos itens e o tamanho K da mochila. Sada: um vetor bidimensional P tal que

P(i,j).existe = true se existe uma soluo com os primeiros i elementos para uma mochila de tamanho j; P(i,j).pertence = true se o i-simo elemento pertence a soluo.

10

Algoritmo Mochila (S,K)


Incio P(0,0).existe = true; para j = 1 at K faa P(0,j).existe = false; para i = 1 at n faa para j = 0 at K faa P(i,j).existe = false; if P(i - 1, j).existe ento P(i,j).existe = true; P(i,j).pertence = false seno se (j S(i) >= 0) ento se P(i 1, j S(i)).existe ento P(i,j).existe = true; P(i,j).pertence = true. Fim

11

O que Programao Dinmica ?

uma maneira inteligente de transformar recurso em iterao com o apoio de uma tabela!

12

Como resolver um programa utilizando Programao Dinmica?


Comece com uma soluo recursiva com ou sem backtracking Verifique quais os sub-problema so resolvidos Evite resolver mais de uma vez um mesmo subproblema salvando os resultados anteriores em uma tabela Antes de calcular um novo resultando consulte a tabela para saber se o problema foi resolvido anteriormente Substitua chamadas recursivas por consultas a elementos da tabela

13

Você também pode gostar