Você está na página 1de 10

Mtodos de Pesquisa

Aula 1

Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

Primeiro em Profundidade

A ideia que est inerente ao mtodo Primeiro em


Profundidade a de tentar avanar de estado para
estado at que se encontre a soluo
um mtodo adequado se as opes tomadas forem na
direco correcta, mas pode ser inadequado se a
direco tomada for desadequada
O mtodo Primeiro em Profundidade apresenta a
vantagem de ter poucos requisitos em termos de
memria
O mtodo tambm adequado para problemas que
tenham vrias solues pois nesses casos aumenta a
possibilidade de se optar por um caminho adequado.

Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

Primeiro em Profundidade
Vejamos um exemplo, considerando
o seguinte grafo:
B

Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

Primeiro em Profundidade
Para ir do n A at ao
n I,
a rvore de pesquisa
gerada poderia ser:
B

nvel 0

nvel 2

nvel 3

nvel 4

nvel 5

nvel 1

nvel 6

D
H

nvel 7

nvel 8

Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

Primeiro em Profundidade
No h garantia em que o mtodo permita obter a melhor
soluo, ou a soluo ao nvel mais prximo da raiz
Note-se que teramos solues ao nvel 3 como, por exemplo,
o caminho A-C-F-I ou A-D-F-I.
B

E se fosse retirada a ligao entre a cidade J e M ?


5

Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

Primeiro em Profundidade
O mtodo Primeiro em Profundidade com Retrocesso o mtodo
usado internamente na linguagem PROLOG

nvel 0

nvel 1

nvel 2

Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

nvel 3

nvel 4

Um exemplo
e

m
j
n

f
k

h
l

liga(a,b).
liga(a,c).
liga(a,d).
liga(b,e).
liga(b,f).
liga(c,f).
liga(c,g).
liga(d,g).
liga(d,h).
liga(d,i).
liga(e,j).
liga(f,a).
liga(f,j).
liga(f,k).
liga(g,f).
liga(g,o).
liga(g,h).
liga(h,d).
liga(h,l).
liga(i,l).
liga(j,m).
liga(j,n).
liga(k,n).
liga(k,p).
liga(l,p).

Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

Primeiro em Profundidade
Implementao
go(Orig,Dest,L) :- go(Orig,Dest,[Orig],L).
go(Dest,Dest,_,[Dest]).
go(Orig,Dest,LA,[Orig|L]) :liga(Orig,X),
not member(X,LA),
go(X,Dest,[X|LA],L).
Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

Primeiro em Largura

Segundo este mtodo s ir ser possvel efectuar a


pesquisa no nvel N da rvore se todos os ns do nvel
N-1 tiverem sido explorados
Pode-se
dizer
que
a
rvore

explorada
transversalmente, derivando da o nome do mtodo
Garante a obteno da soluo ao nvel mais prximo da
raiz, o que no quer dizer que seja a melhor soluo
Pode requerer muita memria e espao e tempo para
problemas mais complexos
9

Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

Primeiro em Largura
B

Vejamos
como
se
desenvolve o mtodo
para o mesmo exemplo
dado anteriormente:

nvel 0

F
I

nvel 1

Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

nvel 2

nvel 3

10

Um exemplo
e

m
j
n

f
k

h
l

liga(a,b).
liga(a,c).
liga(a,d).
liga(b,e).
liga(b,f).
liga(c,f).
liga(c,g).
liga(d,g).
liga(d,h).
liga(d,i).
liga(e,j).
liga(f,a).
liga(f,j).
liga(f,k).
liga(g,f).
liga(g,o).
liga(g,h).
liga(h,d).
liga(h,l).
liga(i,l).
liga(j,m).
liga(j,n).
liga(k,n).
liga(k,p).
liga(l,p).

Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

11

Um exemplo
go(Orig,Dest,Perc) :- go1([[Orig]],Dest,P), inverte(P,Perc).
go1([Prim|Resto],Dest,Prim) :- Prim=[Dest|_].
go1([[Dest|T]|Resto],Dest,Perc) :- !, go1(Resto,Dest,Perc).
go1([[Ult|T]|Outros],Dest,Perc):findall([Z,Ult|T],proximo_no(Ult,T,Z),Lista),
append(Outros,Lista,NPerc),
go1(NPerc,Dest,Perc).
proximo_no(X,T,Z) :- liga(X,Z), not member(Z,T).
inverte(L,LI) :- inverte(L,[],LI).
inverte([],LI,LI).
inverte([H|T],L,LI) :- inverte(T,[H|L],LI).

Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

12

Um exemplo: considerando uma


pequena alterao
go(Orig,Dest,Perc):- go1([[Orig]],Dest,P), inverte(P,Perc).
go1([Prim|Resto],Dest,Prim):- Prim=[Dest|_].
go1([[Dest|T]|Resto],Dest,Perc):- !, go1(Resto,Dest,Perc).
go1([[Ult|T]|Outros],Dest,Perc):findall([Z,Ult|T],proximo_no(Ult,T,Z),Lista),
% append(Outros,Lista,NPerc), pesquisa 1 em largura
append(Lista,Outros,NPerc), % pesquisa 1 em profundidade
go1(NPerc,Dest,Perc).
proximo_no(X,T,Z):- liga(X,Z), not member(Z,T).
inverte(L,LI):-inverte(L,[],LI).
inverte([],LI,LI).
inverte([H|T],L,LI):-inverte(T,[H|L],LI).
Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

13

Um exemplo: solues obtidas


e

?- go(a,j,L).
L = [a,b,e,j] ;

L = [a,b,f,j] ;

f
k

L = [a,c,f,j] ;

L = [a,c,g,f,j] ;
L = [a,d,g,f,j]

h
l

Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

14

Um exemplo
go(Orig,Dest,Perc):- go1([[Orig]],Dest,P), inverte(P,Perc).
go1([Prim|Resto],Dest,Prim):- Prim=[Dest|_].
go1([[Dest|T]|Resto],Dest,Perc):- !, go1(Resto,Dest,Perc).
go1([[Ult|T]|Outros],Dest,Perc):findall([Z,Ult|T],proximo_no(Ult,T,Z),Lista),
append(Lista,Outros,NPerc), % pesquisa 1 em profundidade
% append(Outros,Lista,NPerc), pesquisa 1 em largura
write('NPerc:'), write(NPerc),nl,
go1(NPerc,Dest,Perc).
proximo_no(X,T,Z):- liga(X,Z), not member(Z,T).
inverte(L,LI):-inverte(L,[],LI).
inverte([],LI,LI).
inverte([H|T],L,LI):-inverte(T,[H|L],LI).
Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

15

Um exemplo
go(Orig,Dest,Perc):- go1([[Orig]],Dest,P), inverte(P,Perc).
go1([Prim|Resto],Dest,Prim):- Prim=[Dest|_].
go1([[Dest|T]|Resto],Dest,Perc):- !, go1(Resto,Dest,Perc).
go1([[Ult|T]|Outros],Dest,Perc):findall([Z,Ult|T],proximo_no(Ult,T,Z),Lista),
% append(Lista,Outros,NPerc), pesquisa 1 em profundidade
append(Outros,Lista,NPerc), % pesquisa 1 em largura
write(NPerc:'),write(NPerc),nl,
go1(NPerc,Dest,Perc).
proximo_no(X,T,Z):- liga(X,Z), not member(Z,T).
inverte(L,LI):-inverte(L,[],LI).
inverte([],LI,LI).
inverte([H|T],L,LI):-inverte(T,[H|L],LI).
Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

16

Um exemplo 1 em Profundidade
a->j
?- go4(a,j,L).
NPerc[[b,a],[c,a],[d,a]]
NPerc[[e,b,a],[f,b,a],[c,a],[d,a]]
NPerc[[j,e,b,a],[f,b,a],[c,a],[d,a]]
L = [a,b,e,j]

m
j
n

f
k

h
p

l
i

Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

17

Um exemplo Primeiro em Largura


a->j
?- go4(a,j,L).
NPerc[[b,a],[c,a],[d,a]]
NPerc[[c,a],[d,a],[e,b,a],[f,b,a]]
NPerc[[d,a],[e,b,a],[f,b,a],[f,c,a],[g,c,a]]
NPerc[[e,b,a],[f,b,a],[f,c,a],[g,c,a],[g,d,a],[h,d,a],[i,d,a]]
NPerc[[f,b,a],[f,c,a],[g,c,a],[g,d,a],[h,d,a],[i,d,a],[j,e,b,a]]
NPerc[[f,c,a],[g,c,a],[g,d,a],[h,d,a],[i,d,a],[j,e,b,a],[j,f,b,a],[k,f,b,a]]
NPerc[[g,c,a],[g,d,a],[h,d,a],[i,d,a],[j,e,b,a],[j,f,b,a],[k,f,b,a],[j,f,c,a],[k,f,c,a]]
NPerc[[g,d,a],[h,d,a],[i,d,a],[j,e,b,a],[j,f,b,a],[k,f,b,a],[j,f,c,a],[k,f,c,a],[f,g,c,a],[o,g,c,a],[h,g,c,a]]
NPerc[[h,d,a],[i,d,a],[j,e,b,a],[j,f,b,a],[k,f,b,a],[j,f,c,a],[k,f,c,a],[f,g,c,a],[o,g,c,a],[h,g,c,a],[f,g,d,a],[o,g,d,a],[h,g,d,a]]
NPerc[[i,d,a],[j,e,b,a],[j,f,b,a],[k,f,b,a],[j,f,c,a],[k,f,c,a],[f,g,c,a],[o,g,c,a],[h,g,c,a],[f,g,d,a],[o,g,d,a],[h,g,d,a],[l,h,d,a]]
NPerc[[j,e,b,a],[j,f,b,a],[k,f,b,a],[j,f,c,a],[k,f,c,a],[f,g,c,a],[o,g,c,a],[h,g,c,a],[f,g,d,a],[o,g,d,a],[h,g,d,a],[l,h,d,a],[l,i,d,a]]
L = [a,b,e,j]

m
j
n

f
k

h
l

i
Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

18

Um exemplo 1 em Profundidade
a->i
?- go4(a,i,L).
NPerc[[b,a],[c,a],[d,a]]
NPerc[[e,b,a],[f,b,a],[c,a],[d,a]]
NPerc[[j,e,b,a],[f,b,a],[c,a],[d,a]]
NPerc[[m,j,e,b,a],[n,j,e,b,a],[f,b,a],[c,a],[d,a]]
NPerc[[n,j,e,b,a],[f,b,a],[c,a],[d,a]]
NPerc[[f,b,a],[c,a],[d,a]]
NPerc[[j,f,b,a],[k,f,b,a],[c,a],[d,a]]
NPerc[[m,j,f,b,a],[n,j,f,b,a],[k,f,b,a],[c,a],[d,a]]
NPerc[[n,j,f,b,a],[k,f,b,a],[c,a],[d,a]]
NPerc[[k,f,b,a],[c,a],[d,a]]
NPerc[[n,k,f,b,a],[p,k,f,b,a],[c,a],[d,a]]
NPerc[[p,k,f,b,a],[c,a],[d,a]]
NPerc[[c,a],[d,a]]
NPerc[[f,c,a],[g,c,a],[d,a]]
a
NPerc[[j,f,c,a],[k,f,c,a],[g,c,a],[d,a]]
NPerc[[m,j,f,c,a],[n,j,f,c,a],[k,f,c,a],[g,c,a],[d,a]]
NPerc[[n,j,f,c,a],[k,f,c,a],[g,c,a],[d,a]]
NPerc[[k,f,c,a],[g,c,a],[d,a]]
NPerc[[n,k,f,c,a],[p,k,f,c,a],[g,c,a],[d,a]]
NPerc[[p,k,f,c,a],[g,c,a],[d,a]]
NPerc[[g,c,a],[d,a]]
NPerc[[f,g,c,a],[o,g,c,a],[h,g,c,a],[d,a]]
NPerc[[j,f,g,c,a],[k,f,g,c,a],[o,g,c,a],[h,g,c,a],[d,a]]
NPerc[[m,j,f,g,c,a],[n,j,f,g,c,a],[k,f,g,c,a],[o,g,c,a],[h,g,c,a],[d,a]]
NPerc[[n,j,f,g,c,a],[k,f,g,c,a],[o,g,c,a],[h,g,c,a],[d,a]]
NPerc[[k,f,g,c,a],[o,g,c,a],[h,g,c,a],[d,a]]
NPerc[[n,k,f,g,c,a],[p,k,f,g,c,a],[o,g,c,a],[h,g,c,a],[d,a]]
NPerc[[p,k,f,g,c,a],[o,g,c,a],[h,g,c,a],[d,a]]
NPerc[[o,g,c,a],[h,g,c,a],[d,a]]
NPerc[[h,g,c,a],[d,a]]
NPerc[[d,h,g,c,a],[l,h,g,c,a],[d,a]]
NPerc[[i,d,h,g,c,a],[l,h,g,c,a],[d,a]]
L = [a,c,g,h,d,i]

m
j
n

f
k

h
l

Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

19

Um exemplo Primeiro em Largura


a->i
?- go4(a,i,L).
NPerc[[b,a],[c,a],[d,a]]
NPerc[[c,a],[d,a],[e,b,a],[f,b,a]]
NPerc[[d,a],[e,b,a],[f,b,a],[f,c,a],[g,c,a]]
NPerc[[e,b,a],[f,b,a],[f,c,a],[g,c,a],[g,d,a],[h,d,a],[i,d,a]]
NPerc[[f,b,a],[f,c,a],[g,c,a],[g,d,a],[h,d,a],[i,d,a],[j,e,b,a]]
NPerc[[f,c,a],[g,c,a],[g,d,a],[h,d,a],[i,d,a],[j,e,b,a],[j,f,b,a],[k,f,b,a]]
NPerc[[g,c,a],[g,d,a],[h,d,a],[i,d,a],[j,e,b,a],[j,f,b,a],[k,f,b,a],[j,f,c,a],[k,f,c,a]]
NPerc[[g,d,a],[h,d,a],[i,d,a],[j,e,b,a],[j,f,b,a],[k,f,b,a],[j,f,c,a],[k,f,c,a],[f,g,c,a],[o,g,c,a],[h,g,c,a]]
NPerc[[h,d,a],[i,d,a],[j,e,b,a],[j,f,b,a],[k,f,b,a],[j,f,c,a],[k,f,c,a],[f,g,c,a],[o,g,c,a],[h,g,c,a],[f,g,d,a],[o,g,d,a],[h,g,d,a]]
NPerc[[i,d,a],[j,e,b,a],[j,f,b,a],[k,f,b,a],[j,f,c,a],[k,f,c,a],[f,g,c,a],[o,g,c,a],[h,g,c,a],[f,g,d,a],[o,g,d,a],[h,g,d,a],[l,h,d,a]]
L = [a,d,i]

m
j
n

f
k

h
l

i
Apontamentos Terico-Prticos de Algoritmia Avanada LEI/ISEP Mtodos de Pesquisa Carlos Ramos

20

10