Anda di halaman 1dari 57

Introdução

Busca em largura
Busca de Custo Uniforme
Algoritmo de Dijkstra

IA: Algoritmos de Buscas 1

Professor: Paulo Gurgel Pinheiro


MC906A - Inteligência Articial
Instituto de Computação
Universidade Estadual de Campinas  UNICAMP

12 de Agosto de 2010

1 / 56
Introdução
Busca em largura
Busca de Custo Uniforme
Algoritmo de Dijkstra

http://www.ic.unicamp.br/pinheiro/

pinheiro@ic.unicamp.br
[MC906]

2 / 56
Introdução
Busca em largura
Busca de Custo Uniforme
Algoritmo de Dijkstra

O que vamos aprender hoje?

O que vamos aprender hoje?


1 Busca em largura
Estratégia
Algoritmo
Custos e vantagens
2 Busca de Custo Uniforme
Estratégia
Algoritmo
Custos e conclusões
3 Algoritmo de Dijkstra

3 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura

4 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura
Busca em largura
Estratégia:
Exanda o nó raiz mostrando seus lhos
Depois expanda todos os seus sucessores
Depois expanda os sucessores dos sucessores e assim por
diante

Todos os nós de um nível são expandidos antes do


próximo nível.
Arestas possuem pesos iguais
5 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura
Busca em largura

6 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura
Busca em largura

7 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura

Busca em largura
Quando um nó é visitado, os lhos são expandidos
Nós visitados são sempre marcados

8 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura
Busca em largura

9 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura

Busca em largura

10 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura
Busca em largura
Note que nem toda aresta entrou na busca
A busca gera uma árvore:

11 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Algoritmo
Estrutura

12 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura - Algoritmo

Busca em largura - Algoritmo


Entradas:
Grafo de busca
Nó inicial
Estrutura geral:
Dist [v ]: Vetor de distâncias
Salva a distância de cada nó v ao nó inicial
Pai [v ]: Vetor que armazena o nó pai de cada vetorv
Prox : Fila de nós contendo os próximos nós a serem
visitados (azul).

13 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura - Algoritmo

Busca em largura - Algoritmo


Cada nó contém:
Um campo para armazenar o estado do problema que
aquele nó representa
Um campo para denir se:
O nó já foi visitado (preto)
Se o nó é conhecido (se já foi expandido) e portanto
está na la dos futuros visitados.
Se o nó é novo (cinza).
Um campo que armazena a lista de nós aos quais ele se
conecta.

14 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura - Algoritmo

Busca0 em largura - Algoritmo


1.Dist [v ] ← 0 //Distância do nó atual até v'
2.Pai [v 0 ] ← NULL //Pai do no atual
3.Prox ← v 0 //Adiciona o nó inicial à la de nós a serem visitados
4.Marque v 0 como conhecido/visitado (azul)
5.Enquanto Prox 6= NULL
6. v ← Desenlera um nó de prox //Armazena o primeiro nó do prox em v
7. Se v for o procurado:
8. Return CaminhoAte(v) e Dist[v]
9. Senão, para cada lho f de v :
10. Se f for novo(cinza)
11. Marque f como conhecido (azul)
12. Dist [f ] ← Dist [v ] + 1
13. Pai [f ] ← v
14. Enleire f em prox //Adicione ao m de prox
15. Marque v como visitado

15 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura - Algoritmo

Busca em largura - Algoritmo


CaminhoAte(v):
1.Caminho ← NULL //Inicia a pilha com os nós do caminho
2.Empilha v em Caminho
3.Enquato Pai (v ) 6= NULL{
4. Empilha Pai [v ] em Caminho
5. v ← Pai [v ]
6. }
7.Retorna Caminho

16 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Algoritmo
Seguindo o algoritmo

17 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura - Algoritmo

Linha 1 a 5:
1.Dist [v 0 ] ← 0 //Distância do nó atual até v'
2.Pai [v 0 ] ← NULL //Pai do no atual
3.Prox ← v 0 //Adiciona o nó inicial à la de nós a serem visitados
4.Marque v 0 como conhecido/visitado (azul)
5.Enquanto Prox 6= NULL

18 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura - Algoritmo

Linha 6 a 8:
5.Enquanto Prox 6= NULL
6. v ← Desenlera um nó de prox //Armazena o primeiro nó do prox em v
7. Se v for o procurado:
8. Return CaminhoAte(v) e Dist[v]

19 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura - Algoritmo

Linha 9 a 14:
Primeiro laço (B)
9. Senão, para cada lho f de v :
10. Se f for novo(cinza)
11. Marque f como conhecido (azul)
12. Dist [f ] ← Dist [v ] + 1
13. Pai [f ] ← v
14. Enleire f em prox //Adicione ao m de prox

20 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura - Algoritmo


Linha 9 a 14:
Primeiro laço (C)
9. Senão, para cada lho f de v :
10. Se f for novo(cinza)
11. Marque f como conhecido (azul)
12. Dist [f ] ← Dist [v ] + 1
13. Pai [f ] ← v
14. Enleire f em prox //Adicione ao m de prox

21 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura - Algoritmo

Linha 15:
15. Marque v como visitado

22 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura - Algoritmo

Linha 6 a 8:
5.Enquanto Prox 6= NULL
6. v ← Desenlera um nó de prox //Armazena o primeiro nó do prox em v
7. Se v for o procurado:
8. Return CaminhoAte(v) e Dist[v]

23 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura - Algoritmo

Linha 9 a 14:
Primeiro laço (D)
9. Senão, para cada lho f de v :
10. Se f for novo(cinza)
11. Marque f como conhecido (azul)
12. Dist [f ] ← Dist [v ] + 1
13. Pai [f ] ← v
14. Enleire f em prox //Adicione ao m de prox

24 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura - Algoritmo


Linha 9 a 14:
Primeiro laço (E)
9. Senão, para cada lho f de v :
10. Se f for novo(cinza)
11. Marque f como conhecido (azul)
12. Dist [f ] ← Dist [v ] + 1
13. Pai [f ] ← v
14. Enleire f em prox //Adicione ao m de prox

25 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura - Algoritmo

Linha 15:
15. Marque v como visitado

26 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura - Algoritmo


Linha 6 a 8:
5.Enquanto Prox 6= NULL
6. v ← Desenlera um nó de prox //Armazena o primeiro nó do prox em v
7. Se v for o procurado:
8. Return CaminhoAte(v) e Dist[v]

E assim continua...
27 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura
Custos

28 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Custos

Custos:
Se cada nó tiver 2 lhos
E a árvore tenha 3 níveis

29 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Custos

Custos:
Nível 0 = 1 nó = 20
Nível 1 = 2 nós = 21
Nível 2 = 4 nós = 22
Nível 3 = 8 nós = 23
Nível 4 = 16 nós = 24
...
Nível n = 2n
No pior caso a solução estará no último nó:
Teriamos então visitado 2n + 2n−1 + 2n−2 +...+ 21 + 1.

30 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Custos

Custos:
Se cada nó tiver k lhos:
Teriamos então visitado k n + k n−1 + k n−2 +...+ k 1 + 1.
Custo de processamento: O (k n )
Custo de memória:
Lembre-se que sempre mantemos informação sobre cada
vértice conhecido. Portanto, O (k n ).

31 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Busca em largura
Vantagens

32 / 56
Introdução Algoritmo
Busca em largura Custos
Busca de Custo Uniforme Vantagens
Algoritmo de Dijkstra

Vantagens

Vantagens
Pode ser utilizada em grafos gerais e não necessariamente
em uma árvore
Expande sempre os nós mais próximos da raiz primeiro.
O caminho encontrado é sempre o mais curto até a
solução.

33 / 56
Introdução Algoritmo
Busca em largura Exemplo
Busca de Custo Uniforme Custo
Algoritmo de Dijkstra Conclusões

Busca de Custo Uniforme


Uniform-Cost Search (UCS)

34 / 56
Introdução Algoritmo
Busca em largura Exemplo
Busca de Custo Uniforme Custo
Algoritmo de Dijkstra Conclusões

Busca de Custo Uniforme

Busca de Custo Uniforme


Os custos(pesos) das arestas são diferentes
Sempre expande o nó cujo caminho até a raiz é o
menor (menor custo de caminho), em vez de escolher um
aleatoriamente.
Não necessariamente faz uma busca em largura

35 / 56
Introdução Algoritmo
Busca em largura Exemplo
Busca de Custo Uniforme Custo
Algoritmo de Dijkstra Conclusões

Busca de Custo Uniforme


Busca de Custo Uniforme
Os custos devem ser maiores que 0
Se houver um laço com custo 0 pode-se levar ao innito.
O custo do caminho sempre aumenta.

36 / 56
Introdução Algoritmo
Busca em largura Exemplo
Busca de Custo Uniforme Custo
Algoritmo de Dijkstra Conclusões

Algoritmo
Estrutura

37 / 56
Introdução Algoritmo
Busca em largura Exemplo
Busca de Custo Uniforme Custo
Algoritmo de Dijkstra Conclusões

Busca de Custo Uniforme

Algoritmo
Entradas:
Árvore de busca
Nó inicial
Estrutura geral:
Custo [v ]: Vetor de custos
Armazena o custo do caminho de cada nó v ao nó inicial
v'.
Pai [v ]: Vetor que armazena o nó pai de cada vetor v
Prox : Lista de nós contendo os próximos nós a serem
visitados (azul).

38 / 56
Introdução Algoritmo
Busca em largura Exemplo
Busca de Custo Uniforme Custo
Algoritmo de Dijkstra Conclusões

Busca de Custo Uniforme

Algoritmo
1.Custo [v ] ← 0 //Custo do caminho do nó atual até v'
0

2.Pai [v 0 ] ← NULL //Pai do nó atual


3.Prox ← v 0 //Adiciona o nó inicial à lista de nós a serem visitados
4.Enquanto Prox 6= NULL
5. v ← Retire o nó de prox com menor Custo(nó)
6. Se v for o nó objetivo:
7. Return CaminhoAte(v) e Custo[v]
8. Senão, para cada lho f de v :
9. Custo [f ] ← Custo [v ]+custo da aresta entre f e v
10. Pai [f ] ← v
11. Coloca f em prox

39 / 56
Introdução Algoritmo
Busca em largura Exemplo
Busca de Custo Uniforme Custo
Algoritmo de Dijkstra Conclusões

Exemplo

40 / 56
Introdução Algoritmo
Busca em largura Exemplo
Busca de Custo Uniforme Custo
Algoritmo de Dijkstra Conclusões

Busca de Custo Uniforme


Exemplo
Entradas:
Grafo de busca
A é o nó Inicial
O é o nó objetivo

41 / 56
Introdução Algoritmo
Busca em largura Exemplo
Busca de Custo Uniforme Custo
Algoritmo de Dijkstra Conclusões

Busca de Custo Uniforme

Exemplo
Passo 1:
Transformar o Grafo em uma árvore:

Vários nós cam sendo nós objetivos

42 / 56
Introdução Algoritmo
Busca em largura Exemplo
Busca de Custo Uniforme Custo
Algoritmo de Dijkstra Conclusões

Busca de Custo Uniforme

Passo 2:
Pega o nó lho com caminho mais curto até a raiz

43 / 56
Introdução Algoritmo
Busca em largura Exemplo
Busca de Custo Uniforme Custo
Algoritmo de Dijkstra Conclusões

Busca de Custo Uniforme

Passo 3:
Vai expandindo os nós correspondentes aos caminhos
mais curtos

44 / 56
Introdução Algoritmo
Busca em largura Exemplo
Busca de Custo Uniforme Custo
Algoritmo de Dijkstra Conclusões

Busca de Custo Uniforme


Continua:

45 / 56
Introdução Algoritmo
Busca em largura Exemplo
Busca de Custo Uniforme Custo
Algoritmo de Dijkstra Conclusões

Busca de Custo Uniforme


Continua:

46 / 56
Introdução Algoritmo
Busca em largura Exemplo
Busca de Custo Uniforme Custo
Algoritmo de Dijkstra Conclusões

Busca de Custo Uniforme

Custo dos caminhos:


O custo do caminho de cada nó ao nó raiz é dado pela
sequência de expansões.
A=0
AB = 2
ABD = 4
AC = 5
ABE = 6
ABEO' = 8

47 / 56
Introdução Algoritmo
Busca em largura Exemplo
Busca de Custo Uniforme Custo
Algoritmo de Dijkstra Conclusões

Busca de Custo Uniforme

Conclusões
Desvantagens:
A transformação do grafo em árvore pode ocupar muito
espaço.
Solução para isso:
Mantenho uma lista de nós já expandidos
Vejo se o nó que eu quero expandir, já não o foi.
Expandi-lo caso não tenha sido expandido,
Soluções ótimas podem ser perdidas se descartarmos
caminhos aparentemente maiores.

48 / 56
Introdução
Busca em largura
Busca de Custo Uniforme
Algoritmo de Dijkstra

Algoritmo de Dijkstra

49 / 56
Introdução
Busca em largura
Busca de Custo Uniforme
Algoritmo de Dijkstra

Algoritmo de Dijkstra

Algoritmo de Dijkstra
Famoso algoritmo para cálculo de caminho de custo
mínimo
Calcula o custo mínimo de um vértice para qualquer outro
vértice do grafo.
Admite que todas as arestas possuem pesos não
negativos.

50 / 56
Introdução
Busca em largura
Busca de Custo Uniforme
Algoritmo de Dijkstra

Algoritmo de Dijkstra
Estratégia:
1 Escolhe-se o nó de origem s (de onde será calculado os
custos mínimos para os demais vértices)
2 Atribui 0 à sua distância (custo de ir s a s é 0)
3 Atribui um valor extremamente alto para as distâncias dos
outros vértices (∞).

http://www.lcad.icmc.usp.br

51 / 56
Introdução
Busca em largura
Busca de Custo Uniforme
Algoritmo de Dijkstra

Algoritmo de Dijkstra
Estratégia:
1 Partindo de s , consulta os vértices adjacentes a ele
2 Para todos os vértices adjacentes z , calcula-se:
Se dist[z] > dist[s] + peso(s, z)
dist[z] = dist[s] + peso(s, z)
path[z] = s

http://www.lcad.icmc.usp.br

52 / 56
Introdução
Busca em largura
Busca de Custo Uniforme
Algoritmo de Dijkstra

Algoritmo de Dijkstra

Estratégia:
1 Dos vértices ainda não explorados, escolhe-se aquele de
menor valor

http://www.lcad.icmc.usp.br

53 / 56
Introdução
Busca em largura
Busca de Custo Uniforme
Algoritmo de Dijkstra

Algoritmo de Dijkstra

Estratégia:
1 Consulta-se todos os vértices adjacentes (chamados de z )
a partir de x
Se dist[z] > dist[x] + peso(x, z)
dist[z] = dist[x] + peso(x, z)
path[z] = x

http://www.lcad.icmc.usp.br

54 / 56
Introdução
Busca em largura
Busca de Custo Uniforme
Algoritmo de Dijkstra

Algoritmo de Dijkstra

Estratégia:
1 Dos vértices ainda não explorados, escolhe-se aquele de
menor valor
2 E repete o procedimento anterior...

55 / 56
Introdução
Busca em largura
Busca de Custo Uniforme
Algoritmo de Dijkstra

Algoritmo de Dijkstra

Resultado:

http://www.lcad.icmc.usp.br

56 / 56
Introdução
Busca em largura
Busca de Custo Uniforme
Algoritmo de Dijkstra

Paulo Pinheiro
pinheiro@ic.unicamp.br

57 / 56