Professional Documents
Culture Documents
algoritmos heurísticos
para o TSP Simétrico
Guilherme Polo
Disponível em http://goo.gl/rjSw
Reduzindo o tempo de
algoritmos heurísticos
para o TSP Simétrico
Guilherme Polo
Disponível em http://goo.gl/rjSw
Sumário
Problema Bibliografia
Estratégia Extras
Greedy
2-Opt
GRASP
Resultados finais
Problema
1 1
2 2
3 3
6 6
4 4
1 2 3 4 6 5
Algoritmo Greedy 1 naive-greedy-nn(start, n, C)
seja T [1 . . n] um novo array
visitado = ∅ ; atual = start ; custo = 0
for i = 1 to n − 1
T [i] = atual ; visitado = visitado ∪ {atual }
menor = ∞ ; proximo = nil
for j = 1 to n
if j �∈ visitado and C(atual , j) < menor
menor = C(atual , j)
proximo = j
custo = custo + menor
atual = proximo
T [n] = atual
custo = custo + C(atual , start)
return (T, custo)
Problemas com o
NAIVE-GREEDY-NN
1.Considera todos os vizinhos
d2103 vm1084
~0.08
~0.02
s s d18512 ~ 2.94 s
d15112d2103
~5.20 s s
~0.04 pla33810 ~ 8.58 s
d18512d15112
~9.10 s s
~2.15 pla85900 ~56.04 s
0,04 254
d2103 0,01
2,15 122,57
d15112 127
0,04 73,50
53,75
2,94 2,00 4,00
d18512 0,04 1
vm1084 pla85900
8,58
pla33810 0,07
56,04 Naïve
pla85900 0,17 Melhorado
7,5
y = 0,0966x - 0,1196
R² = 0,9988
5,0
2,5
0
pla85900 rl2-1116700 rl2-2147500 rl2-3178300 rl2-4209100
7,5
y = 0,0408x1,4135
R² = 0,9941
5,0
2,5
0
pla85900 rl2-1116700 rl2-2147500 rl2-3178300 rl2-4209100
7,5
5,0
2,5
0
pla85900 rl2-1116700 rl2-2147500 rl2-3178300 rl2-4209100
Operações adequadas:
sort(P, l, u, Y)
node. cut = P [m]. y
node. left = build(P, l, m, d + 1)
node. right = build(P, m + 1, u, d + 1)
return node
Exemplo de construção
arvore = BUILD(<(5;5), (25;10), (20;15), (10;20), (30;25), (10;30)>, 1, 6, 0)
35 l u d m cut val
10,30
30
30,25
25
10,20
20
20,15
15
25,10
10
5,5
5
0
0 5 10 15 20 25 30 35
Y
X
Exemplo de construção
arvore = BUILD(<(5;5), (25;10), (20;15), (10;20), (30;25), (10;30)>, 1, 6, 0)
35 l u d m cut val
10,30
1 6 0 3 NIL
30
30,25
25
10,20
20
20,15
15
25,10
10
5,5
5
0
0 5 10 15 20 25 30 35
Y <(5;5), (25;10),
<(5;5), (10;20), (20,
(10;30),
15), (20;15),
(10;20), (25;10),
(30;25), (30;25)>
(10;30)>
X Ordenado
Ordenar por
porx x
Exemplo de construção
arvore = BUILD(<(5;5), (25;10), (20;15), (10;20), (30;25), (10;30)>, 1, 6, 0)
35 l u d m cut val
10,30
1 6 0 3 10 NIL
30
30,25
25
10,20
20
20,15
15
25,10
10
5,5
5
0
0 5 10 15 20 25 30 35
35 l u d m cut val
10,30
1 6 0 3 10 NIL
30
30,25 1 3 1 2 20 NIL
25
10,20
20
20,15
15
25,10
10
5,5
5
0
0 5 10 15 20 25 30 35
35 l u d m cut val
10,30
1 6 0 3 10 NIL
30
30,25 1 3 1 2 20 NIL
25 1 2 2 1 5 NIL
10,20
20
20,15
15
25,10
10
5,5
5
0
0 5 10 15 20 25 30 35
35 l u d m cut val
10,30
1 6 0 3 10 NIL
30
30,25 1 3 1 2 20 NIL
25 1 2 2 1 5 NIL
10,20
20 1 1 3 NIL NIL (5;5)
20,15
15
25,10
10
5,5
5
0
0 5 10 15 20 25 30 35
35 l u d m cut val
10,30
1 6 0 3 10 NIL
30
30,25 1 3 1 2 20 NIL
25 1 2 2 1 5 NIL
10,20
20 1 1 3 NIL NIL (5;5)
20,15 2 2 3 NIL NIL (10;20)
15
25,10
10
5,5
5
0
0 5 10 15 20 25 30 35
35 l u d m cut val
10,30
1 6 0 3 10 NIL
30
30,25 1 3 1 2 20 NIL
25 1 2 2 1 5 NIL
10,20
20 1 1 3 NIL NIL (5;5)
20,15 2 2 3 NIL NIL (10;20)
15
3 3 2 NIL NIL (10;30)
25,10
10
5,5
5
0
0 5 10 15 20 25 30 35
35 l u d m cut val
10,30
1 6 0 3 10 NIL
30
30,25 1 3 1 2 20 NIL
25 1 2 2 1 5 NIL
10,20
20 1 1 3 NIL NIL (5;5)
20,15 2 2 3 NIL NIL (10;20)
15
3 3 2 NIL NIL (10;30)
25,10
10 4 6 1 5 15 NIL
5,5
5
0
0 5 10 15 20 25 30 35
35 l u d m cut val
10,30
1 6 0 3 10 NIL
30
30,25 1 3 1 2 20 NIL
25 1 2 2 1 5 NIL
10,20
20 1 1 3 NIL NIL (5;5)
20,15 2 2 3 NIL NIL (10;20)
15
3 3 2 NIL NIL (10;30)
25,10
10 4 6 1 5 15 NIL
5,5
4 5 2 4 20 NIL
5
0
0 5 10 15 20 25 30 35
35 l u d m cut val
10,30
1 6 0 3 10 NIL
30
30,25 1 3 1 2 20 NIL
25 1 2 2 1 5 NIL
10,20
20 1 1 3 NIL NIL (5;5)
20,15 2 2 3 NIL NIL (10;20)
15
3 3 2 NIL NIL (10;30)
25,10
10 4 6 1 5 15 NIL
5,5
4 5 2 4 20 NIL
5
4 4 3 NIL NIL (20;15)
0
0 5 10 15 20 25 30 35
35 l u d m cut val
10,30
1 6 0 3 10 NIL
30
30,25 1 3 1 2 20 NIL
25 1 2 2 1 5 NIL
10,20
20 1 1 3 NIL NIL (5;5)
20,15 2 2 3 NIL NIL (10;20)
15
3 3 2 NIL NIL (10;30)
25,10
10 4 6 1 5 15 NIL
5,5
4 5 2 4 20 NIL
5
4 4 3 NIL NIL (20;15)
0 5 5 3 NIL NIL (25;10)
0 5 10 15 20 25 30 35
35 l u d m cut val
10,30
1 6 0 3 10 NIL
30
30,25 1 3 1 2 20 NIL
25 1 2 2 1 5 NIL
10,20
20 1 1 3 NIL NIL (5;5)
20,15 2 2 3 NIL NIL (10;20)
15
3 3 2 NIL NIL (10;30)
25,10
10 4 6 1 5 15 NIL
5,5
4 5 2 4 20 NIL
5
4 4 3 NIL NIL (20;15)
0 5 5 3 NIL NIL (25;10)
0 5 10 15 20 25 30 35
6 6 2 NIL NIL (30;25)
Y <(5;5), (10;20), (10;30), (20;15), (25;10), (30;25)>
X
Exemplo de construção
arvore = BUILD(<(5;5), (25;10), (20;15), (10;20), (30;25), (10;30)>, 1, 6, 0)
35 l u d m cut val
10,30
1 6 0 3 10 NIL
30
30,25 1 3 1 2 20 NIL
25 1 2 2 1 5 NIL
10,20
20 1 1 3 NIL NIL (5;5)
20,15 2 2 3 NIL NIL (10;20)
15
3 3 2 NIL NIL (10;30)
25,10
10 4 6 1 5 15 NIL
5,5
4 5 2 4 20 NIL
5
4 4 3 NIL NIL (20;15)
0 5 5 3 NIL NIL (25;10)
0 5 10 15 20 25 30 35
6 6 2 NIL NIL (30;25)
Y <(5;5), (10;20), (10;30), (20;15), (25;10), (30;25)>
X
Exemplo de construção
arvore = BUILD(<(5;5), (25;10), (20;15), (10;20), (30;25), (10;30)>, 1, 6, 0)
35
10,30 X 10
30
Dimensão de corte
30,25
25
10,20 Y 20 15
20
20,15
15
25,10 10; 30;
X 5 20
10 30 25
5,5
5
5; 10; 20; 25;
0 5 20 15 10
0 5 10 15 20 25 30 35
Y Outra representação
X
rnn(root, d)
if root. val �= NIL
Exemplo de if root. val = = target
algoritmo para return
thisdist = euc-2d(root. val , target)
busca NN if thisdist < dist
dist = thisdist
Top-Down nn = root. val
else
cutval = root. cut
if (d mod 2) = = 0
kdtree-nn(root, nntarget)
thisval = target. x
target = nntarget else thisval = target. y
dist = ∞ if thisval ≤ cutval
nn = NIL rnn(root. left, d + 1)
rnn(root, 0) if (thisval + dist) > cutval
return nn rnn(root. right, d + 1)
else
rnn(root. right, d + 1)
if (thisval − dist) < cutval
rnn(root. left, d + 1)
Exemplo de busca NN
X 10
Y 20 15
10; 30;
X 5 20
30 25
X 10
Y 20 15
10; 30;
X 5 20
30 25
Y 20 15
10; 30;
X 5 20
30 25
Y 20 15
10; 30;
X 5 20
30 25
10; 30;
X 5 20
30 25
X 10
Y 20 15
10; 30;
X 5 20
30 25
0 6523
d15112 1.960.503 1.921.015 2,05%
0 10818
d18512 799.220 779.783 2,49%
11394
0
pla33810 77.332.499 81.131.055 -4,68%
0 38007
pla85900 163.516.994 174.486.522 -6,29%
1
2-exchange 1
9 2 9 2
8 3 8 3
7 4 7 4
6 5 6 5
1 5 4 3 2 6 7 8 9 1 2 3 4 5 6 7 8 9
a b c d a c b d
naive-2opt(T, n, cost, C)
repeat
ganho = 0
Algoritmo 2-Opt
for i = 1 to n
for j = i + 2 to n
if ((j + 1) mod n) = = i
continue
a = T [i]; b = T [(i + 1) mod n]
c = T [j]; d = T [(j + 1) mod n]
novo-ganho = C(a, c) + C(b, d)−
(C(a, b) + C(c, d))
if novo-ganho < ganho
ganho = novo-ganho
melhor = [b, c]
if ganho < 0
cost = cost + ganho
inverte(T, melhor [1], melhor [2])
until ganho = = 0
Problema com o
NAIVE-2OPT
8 3
7 4
6 5
1 1
c a c a
9 2 9 2
x
2-Opt
8 3 8 3
7 4 7 4
6 5 6 5
b d b d
2. -Opt 1/
4
1
c a 1
9 2
9 2
8 3
8 3
7 4
7 4
6 5
6 5
b d
1 2 6 7 8 9 5 4 3
1 2 9 6 7 8 5 4 3
a d
Melhorando o tempo
do 2-Opt
2-Opt 2.1/4 -Opt Prox.
T (s) Trocas Custo T (s) Trocas Custo ~*
vm1084 0,00 153 260.184 0,00 190 254.355 6,29%
d2103 0,00 147 82.751 0,00 174 82.402 2,42%
d15112 0,07 3.564 1.686.957 0,07 4.228 1.666.102 5,91%
d18512 0,08 4.023 692.396 0,09 4.949 680.798 5,51%
pla33810 0,17 6.002 72.031.744 0,24 7.830 70.744.397 7,11%
pla85900 0,64 16.845 153.558.764 0,70 20.844 150.777.638 5,90%
150 150000
y = 1,3369x2 - 7,1294x + 10,326
75000
R² = 0,9936
113 0
pla85900 rl2-515400 rl2-944900
75
Tempo “2-exchange”
5,0E-04 y = 4,722E-6x2 - 1,905E-5x + 7,019E-5
R² = 0,9957
38 3,8E-04
2,5E-04
0 1,3E-04
pla85900 rl2-515400 rl2-944900
0E+00
pla85900 rl2-515400 rl2-944900
2-Opt (s) Tendência 1
Tempo/Troca (s) Tendência 1
Quantidade trocas no 2.1/4-Opt aproximado
300000
y = 25368x - 2354,1
R² = 0,9976
Tempo 2.1/4-Opt aproximado 225000
150 150000
y = 1,7278x2 - 9,8544x + 14,61
75000
R² = 0,9848
113 0
pla85900 rl2-515400 rl2-944900
75
Tempo “2.1/4-exchange”
5,0E-04 y = 4,631E-6x2 - 1,768E-5x + 6,255E-5
R² = 0,9852
38 3,8E-04
2,5E-04
0 1,3E-04
pla85900 rl2-515400 rl2-944900
0E+00
pla85900 rl2-515400 rl2-944900
2.1/4-Opt (s) Tendência 1
Tempo/Troca (s) Tendência 1
Quantidade trocas na busca local
300000
150 150000
75000
113 0
pla85900 rl2-515400 rl2-944900
75
Tempo/Troca
5,0E-04
38 3,8E-04
2,5E-04
0 1,3E-04
pla85900 rl2-515400 rl2-944900
0E+00
pla85900 rl2-515400 rl2-944900
2-Opt (s) 2.1/4-Opt (s)
2-exchange (s) 2.1/4-exchange (s)
Avaliação
2-Opt “real” ganhou do aproximado em
2 das 3 instâncias que executou
Sugestões:
satellite list
two-level tree
movimento 2.1/4
GRASP
kdtree-grasp(n)
seja M [1 . . n] um novo array
menor -custo = ∞
while condições de parada não satisfeitas
GT = kdtree-semigreedy-tour(random(n))
T, custo = kdtree-2opt(GT )
if custo < menor -custo
menor -custo = custo
M =T
return (M, menor -custo)
GRASP
Estratégia
11 9 8 5 3 7 4 2 1
resultados:
An
Friedman, J. H., Bentley, J. L., and Finkel, R. A. (1977).
Heuristic-based
Bresina, J. L. (1996).