43
SMA* Fernando Simeone Mestrado em Ciência da Computação Universidade Federal de Lavras Projeto e Análise de Algoritmos (2014/2)

Algoritmo SMA*

Embed Size (px)

Citation preview

Page 1: Algoritmo SMA*

SMA*Fernando Simeone

Mestrado em Ciência da Computação Universidade Federal de Lavras

!Projeto e Análise de Algoritmos (2014/2)

Page 2: Algoritmo SMA*

Tópicos • Introdução

• O algoritmo

• Desempenho

• Considerações finais

• Referências

Page 3: Algoritmo SMA*

Introdução

Page 4: Algoritmo SMA*

Introdução

Page 5: Algoritmo SMA*

Introdução• O problema de memória do algoritmo A*;

Page 6: Algoritmo SMA*

Introdução• O problema de memória do algoritmo A*;

• SMA* (Simplified Memory-Bounded);

Page 7: Algoritmo SMA*

Introdução• O problema de memória do algoritmo A*;

• SMA* (Simplified Memory-Bounded);

• Principais dificuldades:

Page 8: Algoritmo SMA*

Introdução• O problema de memória do algoritmo A*;

• SMA* (Simplified Memory-Bounded);

• Principais dificuldades:

• Garantir a solução ótima;

Page 9: Algoritmo SMA*

Introdução• O problema de memória do algoritmo A*;

• SMA* (Simplified Memory-Bounded);

• Principais dificuldades:

• Garantir a solução ótima;

• Evitar expansão repetida de nós esquecidos.

Page 10: Algoritmo SMA*

Introdução• O algoritmo estima o custo de uma solução

A

B

C

D

E

G H

K

10

10

10

10

10

8

8

168

8

f(n) = g(n) + h(n)

Page 11: Algoritmo SMA*

O algoritmo

Page 12: Algoritmo SMA*

EntradasSMA*(grafo, v_inicial, v_final)

A

B

C

D

E

G H

K

10

10

10

10

10

8

8

168

8

Page 13: Algoritmo SMA*

HeurísticaDistância mínima entre dois pontos:

A

B

C

D

E

G H

K

10

10

10

10

10

8

8

168

8

12

Page 14: Algoritmo SMA*

SMA* (grafo, v_inicial, v_final) 1 adicionar v_inicial na fila 2 loop do 3 if fila está vazia return falha 4 n = nó mais profundo de menor custo na fila 5 if n == v_final return sucesso 6 s = próximo sucessor de n 7 if s != v_final and está na maxima profundidade 8 f(s) = +∞ 9 else 10 f(s) = max( f(n), g(s) + h(s) )

11 if todos sucessores de n gerados 12 atualizar custo dos ancestrais de n 13 if todos os sucessores de n estão na memória 14 remover n da fila 15 if memoria está cheia 16 deletar nó mais raso com maior custo 17 removê-lo da lista de sucessores de seu pai 18 inserir seu pai na fila, se necessário 19 20 inserir s na fila 21 end

O algoritmo

Fila

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Sucessores

A

12A

Page 15: Algoritmo SMA*

SMA* (grafo, v_inicial, v_final) 1 adicionar v_inicial na fila 2 loop do 3 if fila está vazia return falha 4 n = nó mais profundo de menor custo na fila 5 if n == v_final return sucesso 6 s = próximo sucessor de n 7 if s != v_final and está na maxima profundidade 8 f(s) = +∞ 9 else 10 f(s) = max( f(n), g(s) + h(s) )

11 if todos sucessores de n gerados 12 atualizar custo dos ancestrais de n 13 if todos os sucessores de n estão na memória 14 remover n da fila 15 if memoria está cheia 16 deletar nó mais raso com maior custo 17 removê-lo da lista de sucessores de seu pai 18 inserir seu pai na fila, se necessário 19 20 inserir s na fila 21 end

O algoritmo

Fila A

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Sucessores

A

12A

Page 16: Algoritmo SMA*

SMA* (grafo, v_inicial, v_final) 1 adicionar v_inicial na fila 2 loop do 3 if fila está vazia return falha 4 n = nó mais profundo de menor custo na fila 5 if n == v_final return sucesso 6 s = próximo sucessor de n 7 if s != v_final and está na maxima profundidade 8 f(s) = +∞ 9 else 10 f(s) = max( f(n), g(s) + h(s) )

11 if todos sucessores de n gerados 12 atualizar custo dos ancestrais de n 13 if todos os sucessores de n estão na memória 14 remover n da fila 15 if memoria está cheia 16 deletar nó mais raso com maior custo 17 removê-lo da lista de sucessores de seu pai 18 inserir seu pai na fila, se necessário 19 20 inserir s na fila 21 end

O algoritmo

Fila A

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Sucessores

A

12A

n

Page 17: Algoritmo SMA*

SMA* (grafo, v_inicial, v_final) 1 adicionar v_inicial na fila 2 loop do 3 if fila está vazia return falha 4 n = nó mais profundo de menor custo na fila 5 if n == v_final return sucesso 6 s = próximo sucessor de n 7 if s != v_final and está na maxima profundidade 8 f(s) = +∞ 9 else 10 f(s) = max( f(n), g(s) + h(s) )

11 if todos sucessores de n gerados 12 atualizar custo dos ancestrais de n 13 if todos os sucessores de n estão na memória 14 remover n da fila 15 if memoria está cheia 16 deletar nó mais raso com maior custo 17 removê-lo da lista de sucessores de seu pai 18 inserir seu pai na fila, se necessário 19 20 inserir s na fila 21 end

O algoritmo

Fila A

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Sucessores

A

12

n

A

B10 + 5 = 15

s

Page 18: Algoritmo SMA*

SMA* (grafo, v_inicial, v_final) 1 adicionar v_inicial na fila 2 loop do 3 if fila está vazia return falha 4 n = nó mais profundo de menor custo na fila 5 if n == v_final return sucesso 6 s = próximo sucessor de n 7 if s != v_final and está na maxima profundidade 8 f(s) = +∞ 9 else 10 f(s) = max( f(n), g(s) + h(s) )

11 if todos sucessores de n gerados 12 atualizar custo dos ancestrais de n 13 if todos os sucessores de n estão na memória 14 remover n da fila 15 if memoria está cheia 16 deletar nó mais raso com maior custo 17 removê-lo da lista de sucessores de seu pai 18 inserir seu pai na fila, se necessário 19 20 inserir s na fila 21 end

O algoritmo

Fila A B

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Sucessores

A

12

n

A

B15

s

Page 19: Algoritmo SMA*

SMA* (grafo, v_inicial, v_final) 1 adicionar v_inicial na fila 2 loop do 3 if fila está vazia return falha 4 n = nó mais profundo de menor custo na fila 5 if n == v_final return sucesso 6 s = próximo sucessor de n 7 if s != v_final and está na maxima profundidade 8 f(s) = +∞ 9 else 10 f(s) = max( f(n), g(s) + h(s) )

11 if todos sucessores de n gerados 12 atualizar custo dos ancestrais de n 13 if todos os sucessores de n estão na memória 14 remover n da fila 15 if memoria está cheia 16 deletar nó mais raso com maior custo 17 removê-lo da lista de sucessores de seu pai 18 inserir seu pai na fila, se necessário 19 20 inserir s na fila 21 end

O algoritmo

Fila A B

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Sucessores

A

12

n

A

B15

Page 20: Algoritmo SMA*

SMA* (grafo, v_inicial, v_final) 1 adicionar v_inicial na fila 2 loop do 3 if fila está vazia return falha 4 n = nó mais profundo de menor custo na fila 5 if n == v_final return sucesso 6 s = próximo sucessor de n 7 if s != v_final and está na maxima profundidade 8 f(s) = +∞ 9 else 10 f(s) = max( f(n), g(s) + h(s) )

11 if todos sucessores de n gerados 12 atualizar custo dos ancestrais de n 13 if todos os sucessores de n estão na memória 14 remover n da fila 15 if memoria está cheia 16 deletar nó mais raso com maior custo 17 removê-lo da lista de sucessores de seu pai 18 inserir seu pai na fila, se necessário 19 20 inserir s na fila 21 end

O algoritmo

Fila A B

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Sucessores

An

A

B G

1215

s

8 + 5 = 13

Page 21: Algoritmo SMA*

SMA* (grafo, v_inicial, v_final) 1 adicionar v_inicial na fila 2 loop do 3 if fila está vazia return falha 4 n = nó mais profundo de menor custo na fila 5 if n == v_final return sucesso 6 s = próximo sucessor de n 7 if s != v_final and está na maxima profundidade 8 f(s) = +∞ 9 else 10 f(s) = max( f(n), g(s) + h(s) )

11 if todos sucessores de n gerados 12 atualizar custo dos ancestrais de n 13 if todos os sucessores de n estão na memória 14 remover n da fila 15 if memoria está cheia 16 deletar nó mais raso com maior custo 17 removê-lo da lista de sucessores de seu pai 18 inserir seu pai na fila, se necessário 19 20 inserir s na fila 21 end

O algoritmo

Fila A G B

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Sucessores

An

A

B G

1315

s

13

(15)

Page 22: Algoritmo SMA*

SMA* (grafo, v_inicial, v_final) 1 adicionar v_inicial na fila 2 loop do 3 if fila está vazia return falha 4 n = nó mais profundo de menor custo na fila 5 if n == v_final return sucesso 6 s = próximo sucessor de n 7 if s != v_final and está na maxima profundidade 8 f(s) = +∞ 9 else 10 f(s) = max( f(n), g(s) + h(s) )

11 if todos sucessores de n gerados 12 atualizar custo dos ancestrais de n 13 if todos os sucessores de n estão na memória 14 remover n da fila 15 if memoria está cheia 16 deletar nó mais raso com maior custo 17 removê-lo da lista de sucessores de seu pai 18 inserir seu pai na fila, se necessário 19 20 inserir s na fila 21 end

O algoritmo

Fila G B

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Sucessores

A

A

G

13 (15)

n

13

Page 23: Algoritmo SMA*

SMA* (grafo, v_inicial, v_final) 1 adicionar v_inicial na fila 2 loop do 3 if fila está vazia return falha 4 n = nó mais profundo de menor custo na fila 5 if n == v_final return sucesso 6 s = próximo sucessor de n 7 if s != v_final and está na maxima profundidade 8 f(s) = +∞ 9 else 10 f(s) = max( f(n), g(s) + h(s) )

11 if todos sucessores de n gerados 12 atualizar custo dos ancestrais de n 13 if todos os sucessores de n estão na memória 14 remover n da fila 15 if memoria está cheia 16 deletar nó mais raso com maior custo 17 removê-lo da lista de sucessores de seu pai 18 inserir seu pai na fila, se necessário 19 20 inserir s na fila 21 end

O algoritmo

Fila G B

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Sucessores

An

s

A

G

H

13 (15)13

+∞

Page 24: Algoritmo SMA*

SMA* (grafo, v_inicial, v_final) 1 adicionar v_inicial na fila 2 loop do 3 if fila está vazia return falha 4 n = nó mais profundo de menor custo na fila 5 if n == v_final return sucesso 6 s = próximo sucessor de n 7 if s != v_final and está na maxima profundidade 8 f(s) = +∞ 9 else 10 f(s) = max( f(n), g(s) + h(s) )

11 if todos sucessores de n gerados 12 atualizar custo dos ancestrais de n 13 if todos os sucessores de n estão na memória 14 remover n da fila 15 if memoria está cheia 16 deletar nó mais raso com maior custo 17 removê-lo da lista de sucessores de seu pai 18 inserir seu pai na fila, se necessário 19 20 inserir s na fila 21 end

O algoritmo

Fila G B H

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Sucessores

An

s

A

G

H

13 (15)

+∞

13 (∞)

Page 25: Algoritmo SMA*

SMA* (grafo, v_inicial, v_final) 1 adicionar v_inicial na fila 2 loop do 3 if fila está vazia return falha 4 n = nó mais profundo de menor custo na fila 5 if n == v_final return sucesso 6 s = próximo sucessor de n 7 if s != v_final and está na maxima profundidade 8 f(s) = +∞ 9 else 10 f(s) = max( f(n), g(s) + h(s) )

11 if todos sucessores de n gerados 12 atualizar custo dos ancestrais de n 13 if todos os sucessores de n estão na memória 14 remover n da fila 15 if memoria está cheia 16 deletar nó mais raso com maior custo 17 removê-lo da lista de sucessores de seu pai 18 inserir seu pai na fila, se necessário 19 20 inserir s na fila 21 end

O algoritmo

Fila G B H

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Sucessores

An

A

G

13 (15)

13 (∞)

Page 26: Algoritmo SMA*

SMA* (grafo, v_inicial, v_final) 1 adicionar v_inicial na fila 2 loop do 3 if fila está vazia return falha 4 n = nó mais profundo de menor custo na fila 5 if n == v_final return sucesso 6 s = próximo sucessor de n 7 if s != v_final and está na maxima profundidade 8 f(s) = +∞ 9 else 10 f(s) = max( f(n), g(s) + h(s) )

11 if todos sucessores de n gerados 12 atualizar custo dos ancestrais de n 13 if todos os sucessores de n estão na memória 14 remover n da fila 15 if memoria está cheia 16 deletar nó mais raso com maior custo 17 removê-lo da lista de sucessores de seu pai 18 inserir seu pai na fila, se necessário 19 20 inserir s na fila 21 end

O algoritmo

Fila G B H

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Sucessores

An

s

A

G

D

13 (15)

13 (∞)

24 + 0 = 24

Page 27: Algoritmo SMA*

SMA* (grafo, v_inicial, v_final) 1 adicionar v_inicial na fila 2 loop do 3 if fila está vazia return falha 4 n = nó mais profundo de menor custo na fila 5 if n == v_final return sucesso 6 s = próximo sucessor de n 7 if s != v_final and está na maxima profundidade 8 f(s) = +∞ 9 else 10 f(s) = max( f(n), g(s) + h(s) )

11 if todos sucessores de n gerados 12 atualizar custo dos ancestrais de n 13 if todos os sucessores de n estão na memória 14 remover n da fila 15 if memoria está cheia 16 deletar nó mais raso com maior custo 17 removê-lo da lista de sucessores de seu pai 18 inserir seu pai na fila, se necessário 19 20 inserir s na fila 21 end

O algoritmo

Fila G B D H

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Sucessores

An

s

A

G

D

13 (15)

24 (∞)

24

Page 28: Algoritmo SMA*

O algoritmo

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Page 29: Algoritmo SMA*

O algoritmo

A

B G

13 (15)15 24 (∞)

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Page 30: Algoritmo SMA*

O algoritmo

A

B G

13 (15)15 24 (∞)

A

B

C

15

13 (24)

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Page 31: Algoritmo SMA*

O algoritmo

A

B G

13 (15)15 24 (∞)

A

B

C

15

13 (24)

A

B

D

13 (24)20

20

A

B

C

D

E

G H

K

10

10

10

10

10

88

168

8

Page 32: Algoritmo SMA*

Desempenho

Page 33: Algoritmo SMA*

Desempenho

Nós expandidos X memória

Page 34: Algoritmo SMA*

Desempenho

Nós expandidos X memóriaCom +/- 32% da memória gasta pelo A* consegue efetuar o mesmo número de expansões

Page 35: Algoritmo SMA*

Considerações Finais

Page 36: Algoritmo SMA*

Considerações Finais A

B G

C D

E D

H D

D K

Page 37: Algoritmo SMA*

Considerações Finais • Solução deve caber na memória;

A

B G

C D

E D

H D

D K

Page 38: Algoritmo SMA*

Considerações Finais • Solução deve caber na memória;

• Consequentemente, nem sempre a solução será ótima;

A

B G

C D

E D

H D

D K

Page 39: Algoritmo SMA*

Considerações Finais • Solução deve caber na memória;

• Consequentemente, nem sempre a solução será ótima;

• Utiliza no máximo a memória gasta pelo A*;

A

B G

C D

E D

H D

D K

Page 40: Algoritmo SMA*

Considerações Finais • Solução deve caber na memória;

• Consequentemente, nem sempre a solução será ótima;

• Utiliza no máximo a memória gasta pelo A*;

• Quando houver memória para armazenar toda a árvore, executará otimamente eficiente;

A

B G

C D

E D

H D

D K

Page 41: Algoritmo SMA*

Considerações Finais • Solução deve caber na memória;

• Consequentemente, nem sempre a solução será ótima;

• Utiliza no máximo a memória gasta pelo A*;

• Quando houver memória para armazenar toda a árvore, executará otimamente eficiente;

• Em uma implementação real, há outros pontos a serem considerados.

A

B G

C D

E D

H D

D K

Page 42: Algoritmo SMA*

Referências

Russell, S. (1992). Efficient memory-bounded search methods. In Proceedings of the 10th European Conference on Artificial Intelligence, ECAI ’92, pages 1–5, New York, NY, USA. John Wiley & Sons, Inc.!!Russell, S. J. and Norvig, P. (2003). Artificial intelligence: A modern approach. pages 101–111. Pearson Education, 2 edition.!!

Page 43: Algoritmo SMA*

ObrigadoDúvidas?