Escolar Documentos
Profissional Documentos
Cultura Documentos
Programação Dinâmica
• Definição.
• Requisitos
• A idéia geral da técnica
• Exemplo 1: Série de Fibonacci
• Exemplo 2: Problema da Pirâmide
• Exemplo 3: Problema da Mochila
<1> A Otimização Combinatória é um ramo da ciência da computação e da matemática aplicada que estuda problemas de otimização em
conjuntos finitos.
n: 0 1 2 3 4 5 6 7 8 9 10
F(n): 0 1 1 2 3 5 8 13 21 34 55
if n ≤ 1
então F(n) = n
senão F(n) = F(n – 1) + F(n – 2)
fib(2) é chamada 3
vezes!
Para o exemplo, a
solucao é 7 mais o
maximo
entre o valor da
melhor rota de cada
uma das
subpiramides
http://pt.wikipedia.org/wiki/Problema_da_mochila
for w from 0 to W do
m[0, w] := 0
end for
for i from 1 to n do
for j from 0 to W do
if j >= w[i] then
m[i, j] := max(m[i-1, j], m[i-1, j-w[i]] + v[i])
else
m[i, j] := m[i-1, j]
end if
end for
end for
for ( int i=1; i<=n; i++ ) { for ( int j=0; j<=W; j++ ) { System.out.print( " " + m[i][j] ); } System.out.println(); } }
public static int maximo( int a, int b ) { if ( a > b ) { return a; } else { return b; } } }
0 1 2 3 4 5 6 7 8 9
4
w = {2, 3, 4, 5 };
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
0>=2? Não!
m[1][0] = m[0][0];
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
1>=2? Não!
m[1][1] = m[0][1];
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
2>=2? Sim!
m[1][2] = máx (m[0][2] e m[0][2-2]+v[0])
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
2>=2? Sim!
m[1][2] = máx (m[0][2] e m[0][2-2]+v[0])
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
3>=2? Sim!
m[1][3] = máx (m[0][3] e m[0][3-2]+v[0])
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
4>=2? Sim!
m[1][4] = máx (m[0][4] e m[0][4-2]+v[0])
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4
4
w = {2, 3, 4, 5 };
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
0>=3? Não!
M[2][0] = m[1][0];
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
1>=3? Não!
M[2][1] = m[1][1];
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0
4
J>=w[i-1]? w = {2, 3, 4, 5 };
2>=3? Não! v = {4, 7, 6, 8 };
M[2][2] = m[1][2];
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0 4
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
3>=3? Sim!
m[2][3] = máx (m[1][3] e m[1][3-3]+v[1])
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0 4 7
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
4>=3? Sim!
m[2][4] = máx (m[1][4] e m[1][4-3]+v[1])
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0 4 7 7
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
5>=3? Sim!
m[2][5] = máx (m[1][5] e m[1][5-3]+v[1])
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
Comparou
m[1][5] = 4
2 0 0 4 7 7 11 Com
m[1][2]+v[1] = 4+7
Ganhou 4+7=11
3
4
w = {2, 3, 4, 5 };
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0 4 7 7 11 11 11 11 11
4
J>=w[i-1]? w = {2, 3, 4, 5 };
0>=4? Não! v = {4, 7, 6, 8 };
m[3][0] = m[2][0];
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0 4 7 7 11 11 11 11 11
3 0
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
4>=4? Sim!
M[3][4] = máx (m[2][4] e m[2][4-4]+v[2])
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0 4 7 7 11 11 11 11 11
Comparou
m[2][4] = 7
3 0 0 4 7 7 com
m[2][0]+v[2] = 0+6
Ganhou 7
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
5>=4? Sim!
M[3][5] = máx (m[2][5] e m[2][5-4]+v[2])
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0 4 7 7 11 11 11 11 11
3 0 0 4 7 7 11
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
7>=4? Sim!
M[3][7] = máx (m[2][7] e m[2][7-4]+v[2])
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0 4 7 7 11 11 11 11 11
3 0 0 4 7 7 11 11 13
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
8>=4? Sim!
M[3][8] = máx (m[2][8] e m[2][8-4]+v[2])
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0 4 7 7 11 11 11 11 11
3 0 0 4 7 7 11 11 13 13
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
9>=4? Sim!
M[3][9] = máx (m[2][9] e m[2][9-4]+v[2])
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0 4 7 7 11 11 11 11 11
3 0 0 4 7 7 11 11 13 13 17
4
J>=w[i-1]?
w = {2, 3, 4, 5 };
0>=5? Não!
M[4][0] = m[3][0];
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0 4 7 7 11 11 11 11 11
3 0 0 4 7 7 11 11 13 13 17
4 0
w = {2, 3, 4, 5 };
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0 4 7 7 11 11 11 11 11
3 0 0 4 7 7 11 11 13 13 17
4 0 0 4 7 7
J>=w[i-1]?
w = {2, 3, 4, 5 };
5>=5? Sim!
M[4][5] = máx (m[3][5] e m[3][5-5]+v[3])
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0 4 7 7 11 11 11 11 11
3 0 0 4 7 7 11 11 13 13 17
4 0 0 4 7 7 11
w = {2, 3, 4, 5 };
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0 4 7 7 11 11 11 11 11
3 0 0 4 7 7 11 11 13 13 17
4 0 0 4 7 7 11 11 13 15 17
w = {2, 3, 4, 5 };
v = {4, 7, 6, 8 };
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 4 4 4 4 4 4 4
2 0 0 4 7 7 11 11 11 11 11
3 0 0 4 7 7 11 11 13 13 17
4 0 0 4 7 7 11 11 13 15 17
Solução do Problema da Mochila com
Programação Dinâmica
Selecionados então os objetos:
1, 2 e 3