• Nenhum resultado encontrado

PROGRAMAÇÃO DINÂMICA

N/A
N/A
Protected

Academic year: 2021

Share "PROGRAMAÇÃO DINÂMICA"

Copied!
18
0
0

Texto

(1)

PROGRAMAÇÃO DINÂMICA

Programação dinâmica é tipicamente aplicada para

problemas de otimização.

• O desenvolvimento de um algoritmo de programação

dinâmica pode ser divido em 4 etapas

1. Caracterizar uma solução ótima;

2. Define recursivamente a solução ótima;

3. Calcular o valor da solução ótima de forma bottom-up;

4. Construir uma solução ótima das informações

computadas.

Numero de Fibonacci 2 1 1 0 1 0 − − + = = = n n n f f f f f

int fib( int n ) {

if ( n < 2 ) return n;

else return fib(n-1) + fib(n-2); }

(2)

tn: tempo requerido para calcular fn (n-ésimo ordem de numero Fibonacci. tn= tn-1+ tn-2 t1= t2= c, onde c é um constante tn= cfn Então Sabemos que ... 61803 . 1 2 5 1 lim +1 = + = ∞ → n n n f f

Finalmente, tn= O(fn)= O(1.618..n)

int fib( int n ) { int k, f1, f2; if ( n < 2 ) return n; else { f1 = f2 = 1; for(k=2;k<n;k++) { f = f1 + f2; f2 = f1; f1 = f; } return f; } } Algoritmo Iterativo Tn= O(n)

(3)

a1,1 a1,2 a1,3 a1,4 a1,n-1 a1,n a2,1 a2,2 a2,3 a2,4 a2,n-1 a2,n t1,1 t2,1 t1,2 t2,2 t1,3 t2,3

t1,n-1 t2,n-1 x1 x2 e1 e2 S2,1 S2,2 S2,3 S2,4 S2,n-1 S2,n S1,1 S1,2 S1,3 S1,4 S1,n-1 S1,n Entrada Saida Linha de Montagem 1 Linha de Montagem 2

Exemplo 1: Linha de Montagem

Descrição:

1. Duas linhas de montagem, cada uma tem nestações, Si,j, i = 1, 2; j = 1, 2, ..., n.

2. A j-ésima estação na linha 1 tem a mesma função com a j-ésima estação na linha 2;

3. O tempo requerido na estação Si,jé denotado por ai,j, varia de uma a outra;

4. O tempo que leva de uma estação a próxima da mesma linha pode ser ignorado;

5. O tempo que leva para transferir as peças da linha i para j depois de passar a estação Si,j é ti,j.

(4)

Objetivo:

Determinar uma combinação de estações das duas linhas de montagem para minimizar tempo de montagem.

Usando o método de forca brutal, a ordem de complexidade é de O(2n). 7 9 3 4 8 4 8 5 6 4 5 7 2 2 3 1 1 2 4 1 3 2 2 4 S2,1 S2,2 S2,3 S2,4 S2,5 S2,6 S1,1 S1,2 S1,3 S1,4 S1,5 S1,6 Entrada Saida Linha de Montagem 1 Linha de Montagem 2 3 2

(5)

Passo 1:

Estrutura de uma solução ótima

Considera as duas estações S1,j e S2,j. O caminho mais rápido que passa pela estação S1,j é

• O caminho mais rápido que passa pela estação S1,j-1e diretamente avança para a estação S1,j, ou

• O caminho mais rápido que passa pela estação S2,j-1e transfere de linha 2 a linha 1, então passa pela estação S1,j.

Usando um raciocínio simétrico, O caminho mais rápido passando a estação S2,j é

• O caminho mais rápido que passa pela estação S2,j-1e diretamente avança para a estação S2,j, ou

• O caminho mais rápido que passa pela estação S1,j-1e transfere de linha 1 a linha 2, então passa pela estação S2,j.

Passo 2:

Uma solução recursiva

[ ]

[ ]

(

)

[ ]

[ ]

[ ]

(

[ ]

[ ]

)

[ ]

(

[ ]

[ ]

)

   ≥ + + − + − = + =    ≥ + + − + − = + = + = + = + + = − − 2 1 , 1 min 1 2 1 , 1 min 1 1 1 , min * , 2 1 , 1 1 , 2 2 1 , 2 2 2 , 1 1 , 2 2 , 1 1 1 , 1 1 1 1 , 2 2 2 1 , 1 1 1 2 2 1 1 j se a t j f a j f j se a e j f j se a t j f a j f j se a e j f a e f a e f x n f x n f f j j j j j j

f*: O tempo mais rápido que passa pela a fabrica;

fi[j]: O tempo mais rápido que passa pela estação Si,jdo ponto de começo;

(6)

Passo 3:

Calcula o tempo mais rápido Fastest-Way(a, t, e, x, n) • f1[1] ←e1+ a1,1 • f2[1] ←e2+ a2,1 • for j ←2 to n • do if f1[j-1] + a1,j ≤ f2[j-1] + t2,j-1+ a1,j • then f1[j] ←f1[j-1] + a1,j • l[j] = 1else f1[j] ←f2[j-1] + t2,j-1+ a1,j • l[j] = 2if f2[j-1] + a2,j ≤ f1[j-1] + t1,j-1+ a2,j • then f2[j] ←f2[j-1] + a2,j • l[j] = 2else f2[j] ←f1[j-1] + t1,j-1+ a2,j • l[j] = 1if f1[n] + x1 ≤ f2[n] + x2 • then f* ←f1[n] + x1 • l* = 1else f* ←f2[n] + x2 • l* = 2

Passo 4:

Construindo o

caminho mais rápido Print-Stations(l, n) • i ←l*

• print “linha” i, “estacao” n • for j ←ndownto 2 • do i←l[j]

(7)

Exemplo 2: Multiplicação de cadeia de matrizes:

• Multiplicação de matrizes é uma operação associativa, i.e., A1( A2A3) = (A1 A2)A3

• O custo para multiplicar uma matriz de nxmpor uma matriz de mxpé O(nmp)(ou O(n3)para duas matrizes de nxn).

A2A3100x5x50 = 25000 => A2A3(100x50)

A1(A2A3) 10x100x50 = 50000 => A1A2A3(10x50) Total 75000

• Um escolhe de parentização ruim pode ser caro. Por exemplo, Matriz Linhas Colunas

A1 10 100 A2 100 5 A3 5 50 O custo para ( A1A2) A3 é A1A210x100x5 = 5000 => A1A2(10x5) (A1A2) A310x5x50 = 2500 => A1A2A3(10x50) Total 7500 mas, para A1( A2A3) A2A3100x5x50 = 25000 => A2A3(100x50) A1(A2A3) 10x100x50 = 50000 => A1A2A3(10x50) Total 75000

(8)

Dada uma seqüência de matrizes <A1, A2, ..., An>, matriz Ai tem a dimensionalidade pi-1×pi, encontra uma parentização para o produto A1A2...Anminimizando numero escalar de multiplicações.

Exemplo, o produto A1A2A3A4 pode ser calculado pelas seguintes 5 formas: (A1(A2(A3A4))) (A1((A2A3)A4)) ((A1A2)(A3A4)) ((A1(A2A3))A4) (((A1A2)A3)A4)

Objetivo

Algoritmo para multiplicação de duas matrizes:

Matriz-Multiply(A, B) • ifcolumns[A] ≠rows[B]

thenerror “dimensoes imcompativeis” • else fori ←1 to rows[A]

do for j ←1 to columns[B]

do C[i, j] ←0

fork ←1 to columns[A]

doC[i, j] ←C[i, j] + A[i, k]B[k, j]

(9)

• Ai..j: O produto AiAi+1Ai+2...Aj, i ≤j;

• Existe um numero inteiro k (i ≤ k < j) que divide a seqüência em duas sub-cadeias: Ai..kAk+1..j;

• Custo(Ai..j) = Custo(Ai..k)+ Custo(Ak+1..j)

+Custo(multiplicação das duas) • A sub-estrutura ótima é a seguinte:

Suponha que a ótima parentização de AiAi+1Ai+2...Aj divide o produto entre Ak e Ak+1. Então, esta parentização para a sub-cadeia AiAi+1Ai+2...Ak é ótima também.

A afirmação similar para Ak+1Ak+2Ak+k...Ajtambém é verdade.

Passo 1:

Passo 2:

Uma solução recursiva

[ ]

{

[ ] [

]

}



<

+

+

+

=

=

− < ≤

m

i

k

m

k

j

p

p

p

se

i

j

j

i

se

j

i

m

j k i j k i

,

1

,

1

min

0

,

• m[i, j]: numero mínimo de multiplicações escalares necessárias para calcular Ai..j.

(10)

Passo 3:

Calcula o menor custo Matrix-Chain-Order(p) n ←length(p)-1 fori = 1 to n dom[i, i] = 0 for l ←2 to n do for i ←1 to n-l+1 do j ←i+l-1 m[i, j] ← ∞ for k ←i to j-1 doq ←m[i,k]+m[k+1,j]+pi-1pkpj ifq < m[i,j] thenm[i,j] ←q s[i,j] ←k returnm e s p = < p0p1p2...pn>

Exemplo

Matriz Linhas Colunas

A1 30 35 A2 35 15 A3 15 5 A4 5 10 A5 10 20 A6 20 25

(11)

Exemplo

15125 10500 5375 3500 5000 0 11875 7125 2500 1000 0 9375 4375 750 0 7875 2625 0 15750 0 0 6 5 4 3 2 1

i

6 5 4 3 2 1

j

Exemplo

3 3 3 5 5 3 3 3 4 3 3 3 1 2 1 5 4 3 2 1

i

6 5 4 3 2

j

(12)

[ ]

[ ] [ ]

[ ] [ ]

[ ] [ ]

7125

11375

20

10

35

0

4735

5

,

5

4

,

2

7125

20

5

35

1000

2625

5

,

4

3

,

2

13000

20

15

35

2500

0

5

,

3

2

,

2

min

5

,

2

5 4 1 5 3 1 5 2 1

=

=

×

×

+

+

=

+

+

=

×

×

+

+

=

+

+

=

×

×

+

+

=

+

+

=

p

p

p

m

m

p

p

p

m

m

p

p

p

m

m

m

Passo 4:

Construindo uma

solução ótima Print-Optimal-Parens(s, i, j) if i = j

then print “A”i else print “(”

Print-Optimal-Parens(s, i, s[i,j]) Print-Optimal-Parens(s, s[i,j]+1, j) print “)”

(13)

Subseqüência Comum Mais Longa

Dada uma seqüência X = <x1, x2, ..., xm>, outra seqüência z = <z1, z2, ..., zk> é uma subseqüênciade X se existe uma seqüência estritamente crescente <i1, i2, ..., ik> de índices de X tais que, para todo j= 1, 2, ..., k, temos

j i

z

x

j

=

Exemplo, X = <A, B, C, B, D, A, B> e Z = <B, C, D, B> Z é uma subseqüência de X com seqüência de índice Correspondente <2, 3, 5, 7>.

Subseqüência Comum Mais Longa

Dada duas seqüências X e Y, dizemos que uma seqüência z é uma subseqüência comumde X e Y se Z é uma subseqüência de X e de Y ao mesmo tempo.

Exemplo,

X = <A, B, C, B, D, A, B> e Y = <B, D, C, A, B, A> A seqüência <B, C, A> é uma subseqüência comum. A seqüência <B, C, B, A> é uma subseqüência comum mais longa(LCS – longest common subsequence)

(14)

Subseqüência Comum Mais Longa

Objetivo

Dada duas seqüências X = <x1, x2, ..., xm> e Y = <y1, y2, ..., yn>, Desejamos encontrar uma subseqüênciacomumde comprimento máximo de X e Y.

Subseqüência Comum Mais Longa

Exemplo

Em aplicações biológicas, freqüentemente queremos comparar o DNA De dois ou mais organismos diferentes. Uma cadeia de DNA consiste Em uma cadeia de moléculas chamadas bases, na qual as bases possíveis são adenina, guanina, citosina e timina. Então, uma cadeia De DNA pode ser expressa como uma cadeia sobre o conjunto finito {A, C, G, T}.

(15)

Subseqüência Comum Mais Longa

Exemplo

S

1

= ACCGGTCGAGTGCGCGGAAGCCGGCCGAA

S

2

= GTCGTTCGGAATGCCGTTGCTCTGTAAA

Quanto mais longa a cadeia S

3

que podemos encontrar,

Maior será a semelhança entre S

1

e S

2

.

Em nosso exemplo, S

3

= GTCGTCGGAAGCCGGCCGAA

Subseqüência Comum Mais Longa

1) Caracterização da Solução

Dada uma seqüência X = <x1, x2, ..., xm>, definimos o i-ésimo prefixo de X, para i= 0, 1, ..., m, como Xi= < x1, x2, ..., xi>

Por exemplo, X = <A, B, C, B, D, A, B>, então X4= <A, B, C, B> é 4-ésimo préfixo. X0é uma seqüência vazia.

(16)

Subseqüência Comum Mais Longa

1) Caracterização da Solução

Teorema (Subestrutura ótima de uma LCS)

Seja as seqüências X = <x1, x2, ..., xm> e Y = <y1, y2, ..., yn>, e seja Z = <z1, z2, ..., zl> qualquer LCS de X e Y.

1. Se xm= yn, então zl= xm = yne Zl-1é uma LCS de xm-1e Yn-1; 2. Se xm≠yne zl≠xm, então Z é uma LCS de Xm-1e Y;

3. Se xm≠yne zl≠yn, então Z é uma LCS de X e Yn-1;

Subseqüência Comum Mais Longa

2) Uma Solução Recursiva

[ ] [

]

[

] [

]

(

)

>

=

>

+

=

=

=

j i j i

y

x

e

j

i

se

j

i

c

j

i

c

y

x

e

j

i

se

j

i

c

j

ou

i

se

j

i

c

0

,

,

1

,

1

,

max

0

,

1

1

,

1

0

0

0

,

(17)

3) Calculando o comprimento de uma LCS

LCS-LENGTH(X, Y) 1 m ←comprimento [X] 2 n ←comprimento [Y] 3 fori ←0 to m 4 doc[i, 0] ←0 5 forj ←0 to n 6 doc[0, j] ←0 7 for i ←1 to m 8 do forj ←0 to n 9 do ifxi= yj

10 thenc[i,j] ←c[i-1, j-1] + 1

11 b[i, j] ←“ ”

12 else ifc[i-1, j] ≥c[i, j-1]

13 thenc[i, j] ←c[i-1, j]

14 b[i, j] ←“↑” 15 else c[i, j] ←c[i, j-1]

16 b[i, j] ←“←” 17 returnc e b

4) A Construção de uma LCS

PRINT-LCS(b, X, i, j) 1 ifi = 0 ou j = 0 2 then return 3 ifb[i, j] = “ ” 4 thenPRINT-LCS(b, X, i, j) 5 print xi 6 else ifb[i, j] = “↑”

7 thenPRINT-LCS(b, X, i-1, j) 8 else PRINT-LCS(b, X, i-1, j)

(18)

j 0 1 2 3 4 5 6 i yj B D C A B A 0 xi 0 0 0 0 0 0 0 1 A 0 0 0 0 1 1 1 2 B 0 1 1 1 1 2 2 3 C 0 1 1 2 2 2 2 4 B 0 1 1 2 2 3 3 5 D 0 1 2 2 2 3 3 6 A 0 1 2 2 3 3 4 7 B 0 1 2 2 3 4 4

Referências

Documentos relacionados

O arquivo continha informações de identificação do animal, pai, mãe, data de nascimento, ano e estação da classificação, idade ao parto, produção de leite, gordura e

Cesare Battisti, condenado pela justiça italiana à pena de morte pela prática  de  quatro  homicídios,  fugiu  para  o  Brasil.  Aqui,  em  2007,  o 

Para obter o perfil do expoente de encruamento em função da temperatura de recozimento, o resultado da interpolação por spline é utilizado para que a rede neural artificial seja

Assim, os resultados mostraram que as9 (nove) categorias propostas por Filion puderam ser identificadas pela amostra coletada na pesquisa, bem como a determinação da

Cultural Brasil/Noruega 2014, pela representante do Setor Cultural da Embaixada do Brasil em Oslo.. 20:30 - Intervalo Intervalo Intervalo - Coquetel

O CONPEDI, ao produzir um Grupo de Trabalho dedicado ao estudo sobre a Propriedade Intelectual privilegia os acadêmicos da área em sua totalidade: os que

O trabalho tem como objetivo apresentar a experiência do Projeto de “Fortalecimento do Ensino* Pesquisa e Extensão para a Soberania e Segurança Alimentar e Nutricional na Comunidade

Há muitas mulheres que simplesmente não considerariam fazer sexo com um cara mais velho; elas nunca fantasiaram estar com alguém assim; elas nunca ficaram excitadas por um homem