Você está na página 1de 18

Busca em Profundidade

Para encontrar um caminho de soluo Sol, de um dado n para algum n objetivo


Se N um n objetivo, ento Sol=[N] Se h um n N1 sucessor de N, tal que h um caminho Sol1 de N1 para algum n-objetivo, ento Sol=[N|Sol1]

Em Prolog, a idia acima pode ser traduzida para:


busca_profundidade(N,[N]) :- objetivo(N). busca_profundidade(N,[N|Sol1]) :- s(N,N1), busca_profundidade(N1,Sol1).

Busca em Profundidade
s(a,b). s(a,c). s(b,d). s(b,e). s(c,f). s(c,g).
s(d,h). s(e,i). s(e,j). s(f,k). objetivo(j). objetivo(f).

a b c

d
i

e
j

f k

h
?-busca_profundidade(a,S). S=[a,b,e,j]; S=[a,c,f]; No

Busca em Profundidade com Limite


Um dos maiores problemas com a busca em profundidade que ela pode conduzir a sub-rvores cada vez mais profundas. Exemplo: jogo de xadrez. Pode-se minimizar este problema restringindo a busca at uma profundidade limite:
busca_profundidade2(No,[No],_) :- objetivo(No). busca_profundidade2(No,[No|Sol],Prof_max):Prof_max > 0, s(No,No1), Max1 is Prof_max 1, busca_profundidade2(No1,Sol,Max1).

Busca em Largura
O predicado:
busca_largura(Caminhos,Solucao). satisfeito se algum caminho de um conjunto de Caminhos candidatos pode ser estendido at um n objetivo. Soluo um destes caminhos estendido.

Na implementao que daremos a seguir, Caminhos ser representado por uma lista e cada caminho candidato ser uma lista de ns na ordem inversa Em outras palavras, a cabea de um caminho ser o n mais recentemente gerado e o ltimo elemento ser o n inicial da busca A busca iniciada com um conjunto de candidatos com um nico elemento: [ [NoInicial] ]

Busca em Largura
Dado um conjunto de caminhos candidatos:
Se o primeiro caminho contm um n-objetivo como cabea, esto este caminho uma soluo para o problema Caso contrrio, remove-se o primeiro caminho do conjunto de candidatos e gera-se o conjunto de todas as possveis extenses de um passo deste caminho, acrescentando-se estas extenses ao final do conjunto de candidatos e executa-se a busca em largura neste conjunto de caminhos candidatos atualizado

Busca em Largura
1. 2. 3.

4.

5. 6.

Conjunto de Candidatos inicial: b c [[a]] d e g f Gera extenses de [a]: i j k h [ [b,a], [c,a] ] Remove o 1o caminho candidato, [b,a], e gera extenses deste caminho, colocando-as no final do conjunto: [ [c,a], [d,b,a], [e,b,a] ] Remove [c,a] e acrescenta sua extenso ao final do conjunto de candidatos, produzindo: [ [d,b,a], [e,b,a], [f,c,a], [g,c,a] ] Em passos posteriores, [d,b,a] e [e,b,a] so estendidos e o conjunto de candidatos torna-se: [ [f,c,a], [g,c,a], [h,d,b,a], [i,e,b,a], [j,e,b,a] ] Agora o processo de busca encontra [f,c,a] que contm o nobjetivo f. Portanto, este caminho apresentado como uma soluo.

Busca em Largura
Implementao Prolog
resolve_largura(Inicio, Solucao) :busca_largura( [ [Inicio] ], Solucao). busca_largura( [ [N|Caminho] | _], [N|Caminho]):objetivo(N). busca_largura([ [N|Caminho]| Caminhos ], Solucao) :bagof([M,N| Caminho], (s(N,M),not(membro(M,[N|Caminho]))), NovosCaminhos), conc(Caminhos, NovosCaminhos, Caminhos1), !, busca_largura(Caminhos1, Solucao); busca_largura(Caminhos, Solucao).

Busca Heurstica
Assuma que existe uma funo custo associada a cada arco do espao de estados Assim, c(n,ns) o custo associado com o movimento do n n para o seu n sucessor ns Seja f uma funo heurstica de estimativa, tal que para cada n n do espao de estados, f(n) estima o grau de dificuldade de n O n candidato corrente mais promissor aquele que minimiza f

Busca Heurstica
f(n) definida como a soma de 2 termos:
f(n) = g(n) + h(n) Onde g(n) uma estimativa do custo de um caminho timo do n inicial i at n, e h(n) uma estimativa do custo de um caminho timo de n at um n objetivo t

Quando n encontrado pelo processo de busca, tem-se a seguinte situao:


Um caminho de i para n j deve ter sido encontrado e seu custo pode ser calculado como a soma dos custos dos arcos no caminho, e pode servir como uma estimativa g(n) do custo mnimo de i para n h(n) mais problemtico porque o espao entre n e t ainda no foi explorado, e portanto h(n) meramente um palpite baseado no conhecimento geral do algoritmo sobre o problema particular No existe um mtodo universal de se construir h, pois depende do domnio do problema

Busca Heurstica
Considere o problema de encontrar a menor rota entre a cidade inicial i e a cidade objetivo t
2

(7)

i
2

a (5)
2

(4) c
3

b (4)

f (4)
2

(3) d
3

g (2) t
2

Busca Heurstica
Pode-se imaginar a busca do melhor caminho como consistindo de 2 processos, cada um dos quais explorando um dos caminhos alternativos:
O processo 1, explora o caminho via a e O processo 2 explora o caminho via e processo 1 f(a)=2+5=7 f(b)=4+4=8 f(c)=6+4=10 f(d)=9+3=12

processo 2

a b c

e f(e)=2+7=9 f f(f)=7+4=11 g f(g)=9+2=11

t f(t)=11+0=11

Busca Heurstica
Implementao Prolog
% Determina se elemento X membro de uma lista membro(X,[X|_]). membro(X,[_|Y]) :- membro(X,Y). % Anexa duas listas produzindo uma terceira conc([],L,L). conc([C1|L1],L2,[C1|L3]) :- anexa(L1,L2,L3). % Espao de estados para teste de busca heurstica s(i,e,2). s(i,a,2). s(a,b,2). s(b,c,2). s(c,d,3). s(d,t,3). s(e,f,5). s(f,g,2). s(g,t,2). % Heuristicas h(e,7). h(f,4). h(g,2). h(d,3). h(c,4). h(a,5). h(b,4). h(t,0).

% N objetivo
objetivo(t).

Busca Heurstica
Implementao Prolog
% Busca do Melhor Caminho usando heursticas (uma modificao da busca em largura). resolve_heuristica(Inicio) :melhor([[Inicio/0]],Solucao), apresenta_solucao(Solucao). melhor([[No/Custo_total|Caminho]|_],[No/Custo_total|Caminho]) :objetivo(No). melhor([[N/G|Caminho]|Caminhos],Solucao) :bagof([Ns/Gs,N/G|Caminho], (s(N,Ns,Custo),not membro(Ns/Gs,[N/G|Caminho]),Gs is G +Custo), Extensoes), anexa(Caminhos, Extensoes, Candidatos), ordena(Candidatos, Candidatos_ordenados),!, melhor(Candidatos_ordenados, Solucao) ; melhor(Caminhos, Solucao).

Busca Heurstica
Implementao Prolog
%Predicados auxiliares ordena([],[]). ordena(L1,L2) :estima(L1, Estimativas), ordena_estimativas(Estimativas, Estimativas_ordenadas), estima(L2, Estimativas_ordenadas). estima([],[]). estima([[N/G|R]|Cs],[f([N/G|R],F)|Estimativas]) :h(N,H), F is G + H, estima(Cs, Estimativas). ordena_estimativas(E,O) :anexa(L,[f(C1,H1), f(C2, H2)|R],E), H2 > H1, anexa(L, [f(C2, H2),f(C1,H1)|R],L1), ordena_estimativas(L1,0),!. ordena_estimativas(E,E).

Busca Heurstica
Implementao Prolog
%Predicados auxiliares apresenta_solucao([N/Custo_total|R]) :write('o caminho de solucao eh: '), caminho([N/Custo_total|R]), nl, write('o custo total foi '), write(Custo_total), nl. caminho([]) :-!. caminho([N/_|R]) :- write(N), write(' <-- '), caminho(R).

Grafos E/OU
Implementao Prolog
resolve_e_ou(No) :resolve_e_ou(No, Arvore), apresenta_arvore(Arvore). resolve_e_ou(No, No) :objetivo(No). resolve_e_ou(No, No ---> Arvore) :No ---> ou : Nos, %No um n OU membro(No1,Nos), %Selecionar um sucessor No1 de No resolve_e_ou(No1, Arvore). resolve_e_ou(No, No ---> e : Arvores) :No ---> e : Nos, %No um n E resolve_todos(Nos, Arvores). %Resolve todos os ns sucessores de No % Operador para definir um link do grafo :- op(600,xfx,--->). % Operador para separar o tipo do no (e/ou) dos ns propriamente ditos :- op(500,xfx,:). % Espao de estados E/OU para teste do algoritmo de busca a ---> ou :[b,c]. b ---> e : [d,e]. c ---> e :[f,g]. e ---> ou : [h]. f ---> ou :[h,i]. % Ns objetivo objetivo(d). objetivo(g). objetivo(h).

Grafos E/OU
Implementao Prolog
resolve_todos([],[]). resolve_todos([No|Nos], [Arvore|Arvores]) :resolve_e_ou(No, Arvore), resolve_todos(Nos, Arvores). apresenta_arvore(Arvore) :%Apresenta a arvore de solucao apresenta_arvore(Arvore,0),!. % com endentao 0 apresenta_arvore(No ---> Arvore, I) :- %Apresenta arvore de solucao write(No), %com indentao I write(' ---> '), I1 is I + 7, apresenta_arvore(Arvore, I1),!.

Grafos E/OU
Implementao Prolog
apresenta_arvore(e : [A], I):- %Apresenta lista E de arvores de solucao apresenta_arvore(A,I).

apresenta_arvore(e : [A|As], I) :- %Apresenta lista E de arvores-solucao apresenta_arvore(A,I), tab(I), apresenta_arvore(e:[As],I),!.


apresenta_arvore([A],_) :write(A), nl. apresenta_arvore(No,_) :write(No), nl.

Você também pode gostar