1) O documento apresenta algoritmos aproximativos para problemas NP-difíceis como cobertura de vértices, caixeiro viajante e soma de subconjuntos;
2) Para o problema de cobertura de vértices é apresentado um algoritmo 2-aproximativo de tempo polinomial;
3) Para o problema do caixeiro viajante é apresentado um algoritmo que constrói um ciclo hamiltoniano a partir de uma árvore geradora mínima, garantindo que o comprimento do ciclo seja no máximo o comprimento do ciclo ótimo
2. Tópicos
• Introdução
• Conceitos
• O problema de cobertura de vértices
• O problema do caixeiro viajante
• O problema da soma de subconjuntos
• Considerações finais
• Referências
28. COBERTURA-VÉRTICES-APROXIMADO (G)
1
C = ∅
2
E' = G.E
3
enquanto E' ≠ ∅
4
escolha uma aresta (u, v) ∈ E'
5
C = C ∪ {u, v}
6
remover de E' todas as arestas incidentes
em u ou v
7
retorna C
Algoritmo Aproximativo
b dc
e f
a
g h
C = {}
!
E' = {(a,b), (a,e), (b,c), (b,g), (c,d),
(d,g), (d,h), (e,f), (f,g)}
29. COBERTURA-VÉRTICES-APROXIMADO (G)
1
C = ∅
2
E' = G.E
3
enquanto E' ≠ ∅
4
escolha uma aresta (u, v) ∈ E'
5
C = C ∪ {u, v}
6
remover de E' todas as arestas incidentes
em u ou v
7
retorna C
Algoritmo Aproximativo
b dc
e f
a
g h
C = {a, b}
!
E' = {(c,d), (d,g), (d,h), (e,f), (f,g)}
30. COBERTURA-VÉRTICES-APROXIMADO (G)
1
C = ∅
2
E' = G.E
3
enquanto E' ≠ ∅
4
escolha uma aresta (u, v) ∈ E'
5
C = C ∪ {u, v}
6
remover de E' todas as arestas incidentes
em u ou v
7
retorna C
Algoritmo Aproximativo
b dc
e f
a
g h
C = {a, b, c, d}
!
E' = {(e,f), (f,g)}
31. COBERTURA-VÉRTICES-APROXIMADO (G)
1
C = ∅
2
E' = G.E
3
enquanto E' ≠ ∅
4
escolha uma aresta (u, v) ∈ E'
5
C = C ∪ {u, v}
6
remover de E' todas as arestas incidentes
em u ou v
7
retorna C
Algoritmo Aproximativo
b dc
e f
a
g h
C = {a, b, c, d, e, f}
!
E' = {}
32. Algoritmo Aproximativo
b dc
e f
a
g h
Solução Encontrada
b dc
e f
a
g h
C = {b, d, e, f}
Solução Ótima
C = {a, b, c, d, e, f}
33. COBERTURA-VÉRTICES-APROXIMADO (G)
1
C = ∅
2
E' = G.E
3
enquanto E' ≠ ∅
4
escolha uma aresta (u, v) ∈ E'
5
C = C ∪ {u, v}
6
remover de E' todas as arestas incidentes
em u ou v
7
retorna C
Fator de Aproximação
b dc
e f
a
g h
A = { (a, b), (c, d), (e, f) }
A
34. COBERTURA-VÉRTICES-APROXIMADO (G)
1
C = ∅
2
E' = G.E
3
enquanto E' ≠ ∅
4
escolha uma aresta (u, v) ∈ E'
5
C = C ∪ {u, v}
6
remover de E' todas as arestas incidentes
em u ou v
7
retorna C
Fator de Aproximação
b dc
e f
a
g h
A = { (a, b), (c, d), (e, f) }
A
|A| ≤ |C*|
35. COBERTURA-VÉRTICES-APROXIMADO (G)
1
C = ∅
2
E' = G.E
3
enquanto E' ≠ ∅
4
escolha uma aresta (u, v) ∈ E'
5
C = C ∪ {u, v}
6
remover de E' todas as arestas incidentes
em u ou v
7
retorna C
Fator de Aproximação
b dc
e f
a
g h
A = { (a, b), (c, d), (e, f) }
A
|A| ≤ |C*|
|C| = 2|A|
36. COBERTURA-VÉRTICES-APROXIMADO (G)
1
C = ∅
2
E' = G.E
3
enquanto E' ≠ ∅
4
escolha uma aresta (u, v) ∈ E'
5
C = C ∪ {u, v}
6
remover de E' todas as arestas incidentes
em u ou v
7
retorna C
Fator de Aproximação
b dc
e f
a
g h
A = { (a, b), (c, d), (e, f) }
A
|A| ≤ |C*|
|C| = 2|A|
|C| ≤ 2|C*|
37. COBERTURA-VÉRTICES-APROXIMADO (G)
1
C = ∅
2
E' = G.E
3
enquanto E' ≠ ∅
4
escolha uma aresta (u, v) ∈ E'
5
C = C ∪ {u, v}
6
remover de E' todas as arestas incidentes
em u ou v
7
retorna C
Fator de Aproximação
b dc
e f
a
g h
A = { (a, b), (c, d), (e, f) }
A
|A| ≤ |C*|
|C| = 2|A|
|C| ≤ 2|C*|
ρ(n) = 2
38. COBERTURA-VÉRTICES-APROXIMADO (G)
1
C = ∅
2
E' = G.E
3
enquanto E' ≠ ∅
4
escolha uma aresta (u, v) ∈ E'
5
C = C ∪ {u, v}
6
remover de E' todas as arestas incidentes
em u ou v
7
retorna C
Fator de Aproximação
b dc
e f
a
g h
A = { (a, b), (c, d), (e, f) }
A
|A| ≤ |C*|
|C| = 2|A|
|C| ≤ 2|C*|
ρ(n) = 2
Algoritmo 2-aproximativo
de tempo polinomial
43. Algoritmo Aproximativo
𝜣(V2)
CAIXEIRO-VIAJANTE-APROXIMADO (G, c)
1
seleciona vértice r ∈ G.E para ser a raiz
2
T = PRIM(G, c, r)
3
H = vértices ordenados de acordo com sua ordem de
visitação em um percurso de pré-ordem em T
4
retorna ciclo hamiltoniano H
44. CAIXEIRO-VIAJANTE-APROXIMADO (G, c)
1
seleciona vértice r ∈ G.E para ser a raiz
2
T = PRIM(G, c, r)
3
H = vértices ordenados de acordo com sua
ordem de visitação em um percurso de
pré-ordem em T
4
retorna ciclo hamiltoniano H
Algoritmo Aproximativo
b
d
c
e f
a g
45. CAIXEIRO-VIAJANTE-APROXIMADO (G, c)
1
seleciona vértice r ∈ G.E para ser a raiz
2
T = PRIM(G, c, r)
3
H = vértices ordenados de acordo com sua
ordem de visitação em um percurso de
pré-ordem em T
4
retorna ciclo hamiltoniano H
Algoritmo Aproximativo
b
d
c
e f
a g
46. CAIXEIRO-VIAJANTE-APROXIMADO (G, c)
1
seleciona vértice r ∈ G.E para ser a raiz
2
T = PRIM(G, c, r)
3
H = vértices ordenados de acordo com sua
ordem de visitação em um percurso de
pré-ordem em T
4
retorna ciclo hamiltoniano H
Algoritmo Aproximativo
b
d
c
e f
a g
1
5
3
4
6
7
2
H = {a, b, d, e, f, g, c, a}
47. CAIXEIRO-VIAJANTE-APROXIMADO (G, c)
1
seleciona vértice r ∈ G.E para ser a raiz
2
T = PRIM(G, c, r)
3
H = vértices ordenados de acordo com sua
ordem de visitação em um percurso de
pré-ordem em T
4
retorna ciclo hamiltoniano H
Algoritmo Aproximativo
H = {a, b, d, e, f, g, c, a}
b
d
c
e f
a g
49. CAIXEIRO-VIAJANTE-APROXIMADO (G, c)
1
seleciona vértice r ∈ G.E para ser a raiz
2
T = PRIM(G, c, r)
3
H = vértices ordenados de acordo com sua
ordem de visitação em um percurso de
pré-ordem em T
4
retorna ciclo hamiltoniano H
Fator de Aproximação
50. CAIXEIRO-VIAJANTE-APROXIMADO (G, c)
1
seleciona vértice r ∈ G.E para ser a raiz
2
T = PRIM(G, c, r)
3
H = vértices ordenados de acordo com sua
ordem de visitação em um percurso de
pré-ordem em T
4
retorna ciclo hamiltoniano H
Fator de Aproximação
c(T) ≤ c(H*)
52. CAIXEIRO-VIAJANTE-APROXIMADO (G, c)
1
seleciona vértice r ∈ G.E para ser a raiz
2
T = PRIM(G, c, r)
3
H = vértices ordenados de acordo com sua
ordem de visitação em um percurso de
pré-ordem em T
4
retorna ciclo hamiltoniano H
Fator de Aproximação
c(T) ≤ c(H*)
53. CAIXEIRO-VIAJANTE-APROXIMADO (G, c)
1
seleciona vértice r ∈ G.E para ser a raiz
2
T = PRIM(G, c, r)
3
H = vértices ordenados de acordo com sua
ordem de visitação em um percurso de
pré-ordem em T
4
retorna ciclo hamiltoniano H
Fator de Aproximação
c(T) ≤ c(H*)
c(W) = 2c(T)
54. CAIXEIRO-VIAJANTE-APROXIMADO (G, c)
1
seleciona vértice r ∈ G.E para ser a raiz
2
T = PRIM(G, c, r)
3
H = vértices ordenados de acordo com sua
ordem de visitação em um percurso de
pré-ordem em T
4
retorna ciclo hamiltoniano H
Fator de Aproximação
c(T) ≤ c(H*)
c(W) = 2c(T)
c(W) ≤ 2c(H*)
63. CAIXEIRO-VIAJANTE-APROXIMADO (G, c)
1
seleciona vértice r ∈ G.E para ser a raiz
2
T = PRIM(G, c, r)
3
H = vértices ordenados de acordo com sua
ordem de visitação em um percurso de
pré-ordem em T
4
retorna ciclo hamiltoniano H
Fator de Aproximação
c(T) ≤ c(H*)
c(W) = 2c(T)
c(W) ≤ 2c(H*)
64. CAIXEIRO-VIAJANTE-APROXIMADO (G, c)
1
seleciona vértice r ∈ G.E para ser a raiz
2
T = PRIM(G, c, r)
3
H = vértices ordenados de acordo com sua
ordem de visitação em um percurso de
pré-ordem em T
4
retorna ciclo hamiltoniano H
Fator de Aproximação
c(T) ≤ c(H*)
c(W) = 2c(T)
c(W) ≤ 2c(H*)
c(H) ≤ c(W)
65. CAIXEIRO-VIAJANTE-APROXIMADO (G, c)
1
seleciona vértice r ∈ G.E para ser a raiz
2
T = PRIM(G, c, r)
3
H = vértices ordenados de acordo com sua
ordem de visitação em um percurso de
pré-ordem em T
4
retorna ciclo hamiltoniano H
Fator de Aproximação
c(T) ≤ c(H*)
c(W) = 2c(T)
c(W) ≤ 2c(H*)
c(H) ≤ c(W)
c(H) ≤ 2c(H*)
66. CAIXEIRO-VIAJANTE-APROXIMADO (G, c)
1
seleciona vértice r ∈ G.E para ser a raiz
2
T = PRIM(G, c, r)
3
H = vértices ordenados de acordo com sua
ordem de visitação em um percurso de
pré-ordem em T
4
retorna ciclo hamiltoniano H
Fator de Aproximação
c(T) ≤ c(H*)
c(W) = 2c(T)
c(W) ≤ 2c(H*)
c(H) ≤ c(W)
c(H) ≤ 2c(H*)
ρ(n) = 2
67. CAIXEIRO-VIAJANTE-APROXIMADO (G, c)
1
seleciona vértice r ∈ G.E para ser a raiz
2
T = PRIM(G, c, r)
3
H = vértices ordenados de acordo com sua
ordem de visitação em um percurso de
pré-ordem em T
4
retorna ciclo hamiltoniano H
Fator de Aproximação
c(T) ≤ c(H*)
c(W) = 2c(T)
c(W) ≤ 2c(H*)
c(H) ≤ c(W)
c(H) ≤ 2c(H*)
ρ(n) = 2
Algoritmo 2-aproximativo
de tempo polinomial
75. Algoritmo Exato
SOMA-SUBCONJUNTOS (S, t)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
remover de Li todos os elementos maiores que t
6
retorna maior elemento em Ln
76. Algoritmo Exato
SOMA-SUBCONJUNTOS (S, t)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
remover de Li todos os elementos
maiores que t
6
retorna maior elemento em Ln
77. Algoritmo Exato
SOMA-SUBCONJUNTOS (S, t)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
remover de Li todos os elementos
maiores que t
6
retorna maior elemento em Ln
S = {1, 3, 6}, t = 5
78. Algoritmo Exato
SOMA-SUBCONJUNTOS (S, t)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
remover de Li todos os elementos
maiores que t
6
retorna maior elemento em Ln
S = {1, 3, 6}, t = 5
n = 3
79. Algoritmo Exato
SOMA-SUBCONJUNTOS (S, t)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
remover de Li todos os elementos
maiores que t
6
retorna maior elemento em Ln
S = {1, 3, 6}, t = 5
n = 3
80. Algoritmo Exato
SOMA-SUBCONJUNTOS (S, t)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
remover de Li todos os elementos
maiores que t
6
retorna maior elemento em Ln
S = {1, 3, 6}, t = 5
n = 3
L0 = {0}
estado inicial
81. Algoritmo Exato
SOMA-SUBCONJUNTOS (S, t)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
remover de Li todos os elementos
maiores que t
6
retorna maior elemento em Ln
S = {1, 3, 6}, t = 5
n = 3
L0 = {0}
estado inicial
82. Algoritmo Exato
SOMA-SUBCONJUNTOS (S, t)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
remover de Li todos os elementos
maiores que t
6
retorna maior elemento em Ln
S = {1, 3, 6}, t = 5
n = 3
L0 = {0}
estado inicial
L1 = {0, 1}
xi = 1
83. Algoritmo Exato
SOMA-SUBCONJUNTOS (S, t)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
remover de Li todos os elementos
maiores que t
6
retorna maior elemento em Ln
S = {1, 3, 6}, t = 5
n = 3
L0 = {0}
estado inicial
L1 = {0, 1}
xi = 1
84. Algoritmo Exato
SOMA-SUBCONJUNTOS (S, t)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
remover de Li todos os elementos
maiores que t
6
retorna maior elemento em Ln
S = {1, 3, 6}, t = 5
n = 3
L0 = {0}
estado inicial
L1 = {0, 1}
xi = 1
L2 = {0, 1, 3, 4}
xi = 3
85. Algoritmo Exato
SOMA-SUBCONJUNTOS (S, t)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
remover de Li todos os elementos
maiores que t
6
retorna maior elemento em Ln
S = {1, 3, 6}, t = 5
n = 3
L0 = {0}
estado inicial
L1 = {0, 1}
xi = 1
L2 = {0, 1, 3, 4}
xi = 3
86. Algoritmo Exato
SOMA-SUBCONJUNTOS (S, t)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
remover de Li todos os elementos
maiores que t
6
retorna maior elemento em Ln
S = {1, 3, 6}, t = 5
n = 3
L0 = {0}
estado inicial
L1 = {0, 1}
xi = 1
L2 = {0, 1, 3, 4}
xi = 3
L3 = {0, 1, 3, 4, 6, 7, 9, 10}
xi = 6
87. Algoritmo Exato
SOMA-SUBCONJUNTOS (S, t)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
remover de Li todos os elementos
maiores que t
6
retorna maior elemento em Ln
S = {1, 3, 6}, t = 5
n = 3
L0 = {0}
estado inicial
L1 = {0, 1}
xi = 1
L2 = {0, 1, 3, 4}
xi = 3
L3 = {0, 1, 3, 4, 6, 7, 9, 10}
xi = 6
88. Algoritmo Exato
SOMA-SUBCONJUNTOS (S, t)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
remover de Li todos os elementos
maiores que t
6
retorna maior elemento em Ln
S = {1, 3, 6}, t = 5
n = 3
L0 = {0}
estado inicial
L1 = {0, 1}
xi = 1
L2 = {0, 1, 3, 4}
xi = 3
L3 = {0, 1, 3, 4, 6, 7, 9, 10}
xi = 6
Tamanho de Li pode chegar a 2i
94. Algoritmo Aproximativo
Li = {1, 5, 28, 29, 45, 50, 51, 55, 58, 63, 64}
y ≤ z ≤ y
1 + δ
z y
Se y ≤ z(1 + δ), remover y
95. Esquema Aproximativo
TRIM (L, δ)
1
m = |L|
2
L'= ⟨yi⟩
3
z = yi
4
para i = 2 até m
5
se yi > z(1 + δ)
6
adicionar yi a L’
7
z = yi
6
retorna L'
96. Esquema Aproximativo
SOMA-SUBCONJUNTOS-APROXIMADO (S, t, ϵ)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
Li = TRIM(Li, ϵ/2n)
6
remover de Li todos os elementos maiores que t
7
retorna maior elemento em Ln
97. Esquema Aproximativo
SOMA-SUBCONJUNTOS-APROXIMADO (S, t, ϵ)
1
n = |S|
2
L0 = ⟨0⟩
3
para i = 1 até n
4
Li = MERGE-LIST(Li-1, Li-1 + xi)
5
Li = TRIM(Li, ϵ/2n)
6
remover de Li todos os elementos maiores que t
7
retorna maior elemento em Ln
Se n = 4 e ϵ = 0.4 então δ = ϵ / 8 = 0,05
101. Considerações Finais
• Algoritmos aproximativos são aplicáveis para problemas
de otimização da classe NP-difícil;
• Conhecer o fator de aproximação possui importância
prática;
102. Considerações Finais
• Algoritmos aproximativos são aplicáveis para problemas
de otimização da classe NP-difícil;
• Conhecer o fator de aproximação possui importância
prática;
• Provar o fator aproximativo pode ser uma tarefa
complexa;
103. Considerações Finais
• Algoritmos aproximativos são aplicáveis para problemas
de otimização da classe NP-difícil;
• Conhecer o fator de aproximação possui importância
prática;
• Provar o fator aproximativo pode ser uma tarefa
complexa;
• Desenvolvimento de heurísticas.
104. Referências
Cormen, T. H., Leiserson, C. E., Rivest, R. L., and Stein, C.
(2009). Introduction to Algorithms, Third Edition. The MIT
Press, 3rd edition.
!
Vazirani, V. V. (2001). Approximation algorithms. springer.
!
Williamson, D. P. and Shmoys, D. B. (2011). The design of
approximation algorithms. Cambridge University Press.