apresentacao(t3)
TRANSCRIPT
Programação DinâmicaPrincípios e Aplicações
porJéssica Leleanne e Tiago Pimentel
O que é Programação Dinâmica (PD)?
Embora seja definida como programação, Programação Dinâmica se refere a um método tabular, não a o processo de
escrever um código.
Tem como objetivo resolver um problema grande, dividindo-o em subproblemas
menores.
Programação DinâmicaX
Divisão e Conquista
Divisão e conquista particiona o problema em subproblemas independentes, resolve-os, e então combinam as soluções para resolver o problema
Original
Em contraste, PD é aplicável quando os subproblemas não são independentes, ou seja,
quando subproblemas compartilham sub-subproblemas.
Como funciona?
PD visa evitar o recálculo desnecessário da solução dos subproblemas.
Sendo assim, define-se uma forma de armazenar essas soluções a fim de que,
sendo novamente necessária, não necessite de recalculá-la.
Desenvolvendo um algoritmo de PD
A elaboração de um algoritmo pode ser desmembrado em seqüência de 4 etapas:
1. Caracterizar a estrutura de uma solução ótima;2. Definir recursivamente o valor de uma solução
ótima;3. Calcular o valor de uma solução ótima em um
processo bottom-up;4. Construir uma solução ótima a partir das
informações calculadas.
Aplicabilidade
Pode ser utilizada em problemas onde há:
*Subestrutura Ótima: as soluções ótimas do problema incluem soluções ótimas de subproblemas
*Sobreposição de Subproblemas: O cálculo da solução através de recursão no recálculo de subproblemas.
Vantagens e Desvantagens
Vantagens:• Pode ser utilizada num grande número de
problemas de otimização discreta. • Não necessita de muita precisão
numérica. • Útil para aplicar em problemas que
exigem teste de todas as possibilidades. Desvantagens
• Necessita de grande espaço de memória • A complexidade espacial pode ser
exponencial
Exemplo 1Problema: Corte de Barras
O problema consiste em como cortar barras de aço em pedaços a fim de
maximizar, lucro.Entrada: um comprimento n e a tabela de preços p(i), para i = 1, 2, 3, . . ., n
Saída: o lucro máximo, obtido para barras cujos comprimentos somam n.
Exemplo 1Problema: Corte de Barras
Existem 2n-1 maneiras diferentes de cortar a barra, ou seja, um problema com
complexidade exponencial.
Dado uma barra de comprimento n=4, teremos 8 maneiras diferentes de cortar a
barra.Aparentemente pequeno, mas se
tomarmos um n muito grande, a solução pode se tornar inviável.
Exemplo 1Problema: Corte de Barras
Uma forma de decompor o problema:
•Cada solução ótima tem um corte mais à esquerda.•Há apenas a necessidade de se dividir apenas o pedaço restante.•Deixa apenas um subproblema de resolver, ao invés de dois subproblemas.
Exemplo 1Problema: Corte de Barras
Implementação para obter o lucro máximo:
Exemplo 1Problema: Corte de Barras
Implementação para obter o lucro máximo:
Inviável, pois CUT-ROD chama a si mesmo varias
vezes, até mesmo em subproblemas já resolvidos.
Exemplo 1Problema: Corte de Barras
Tenta resolver cada subproblema apenas uma vez;
Guarda a solução de um subproblema numa tabela e à consulta sempre que rever o problema.
Tenta-se transformar uma solução de tempo Exponencial em uma de tempo
Polinomial
Exemplo 2Problema: Mult. De Cadeias de
MatrizesCalcular o número mínimo de operações de multiplicação necessários para computar M.
M = M1 * M2 * M3 * ..... * Mn
A solução do algoritmo padrão de multiplicação é ineficiente, por ser um algoritmo recursivo, ocorre o recálculo de um mesmo M[i,j]
Exemplo 2Problema: Mult. De Cadeias de
MatrizesUsa-se a PD, pois elimina completamente o uso de recursão
O algoritmo de PD para o problema torna-se trivial se computarmos, para valores crescente de u, o valor ótimo de todas as subcadeia de tamanho u.
Exemplo 2Problema: Mult. De Cadeias de
MatrizesAlgoritmo de PD:
Para i=1 até n faça m[i,i]:=oPara u=1 até n-1 faça
para i=1 até n-u façaj:=i+u;m[i,j]:=infpara k=1 até j-1 faça
q:=m[i,k]+m[k+1,j}+b[i-1]*b[k]*b[j]
se q<m[i,j] entãom[i,j]:=q; s[i,j]:=k
Retorne(m,s)
Exemplo 3Problema: Mochila, ou Container
Dada uma mochila de capacidade W e um conjunto de n itens, cada um com
tamanho w e valor c.
O objetivo é maximizar o valor c levado na mochila, sem ultrapassar a capacidade W.
Existem 2n possíveis subconjuntos de itens.
Exemplo 3Problema: Mochila, ou Container
A complexidade do algoritmos recursivo para este problema no pior caso é dada
pela recorrência:
Há sobreposição de subproblemas: o recálculo de subproblemas pode ser
evitados.
Algoritmo de PD:
para d=0 até W faça z[0,d]:=0para k=1 até n faça z[k,0]:=0para k=1 até n faça
para d=1 até W façaz[k,d]:=z[k-1,d]se wk<=d e ck+z[k-1,d-wk]>z[k,d]
entãoz[k,d]:= ck + z[k-1,d-wk]
Retorne(z[n,W])
Exemplo 3Problema: Mochila, ou Container
Exemplo: c={10,7,25,24}, w={2,1,6,5} e W = 7
Exemplo 3Problema: Mochila, ou Container
k\d 0 1 2 3 4 5 6 7
0 0 0 0 0 0 0 0 0
1 0 0 10 10 10 10 10 10
2 0 7 10 17 17 17 17 17
3 0 7 10 17 17 17 25 32
4 0 7 10 17 17 24 31 34
Problemas da PD
Dois problemas podem surgir na técnica de PD:
• Nem sempre pode ser possível combinar as soluções de subproblemas menores para formar a solução de um problema maior.
•O número de pequenos subproblemas a serem resolvidos pode ser inaceitavelmente grande.
Referências:
• Cormen, Thomas e outros – Algoritmos, teoria e prática;
• Análise e Implementação de Algoritmos, aula 18 – UFRJ
• André Vignatti (DINF - UFPR) – Prog. Dinâmica: Corte de Barrras
• Fernando Nogueira, Programação Dinâmica
• Orlando Júnior – Programação Dinâmica
• Revista Científica da Faculdade Lourenço Filho - v.8, n.1, 2011