Académique Documents
Professionnel Documents
Culture Documents
CM10 Espace Etats Prolog 1617
CM10 Espace Etats Prolog 1617
07/11/16 1
Exemple de recherche dans un graphe
link(g,h). A B
link(g,d). Etat C
link(e,d). initial Etat
link(h,f). but
link(e,f).
link(a,e).
link(a,b). D E F
link(b,f).
link(b,c).
link(f,c).
Espace
d'états G H
go(X,X,[X]). | ?- go(a,c,X).
go(X,Y,[X|T]):- X = [a,e,f,c] ? ;
link(X,Z), X = [a,b,f,c] ? ;
go(Z,Y,T). X = [a,b,c] ? ;
no
Algorithme naïf de recherche Résultat de la recherche
07/11/16 2
Représentation de l'espace d'états
link(g,h). A Racine : état
link(g,d). initial
link(e,d).
link(h,f).
E B
link(e,f).
link(a,e).
link(a,b).
link(b,f). D F F C
link(b,c).
link(f,c).
C C
07/11/16 4
Recherche en profondeur d'abord
A
solve(X,X,[X]).
solve(X,Y,[X|T]):-
link(X,Z),
solve(Z,Y,T). E B
?- solve(a,c,X).
X = [a,e,f,c] ? ;
D F F C
X = [a,b,f,c] ? ;
X = [a,b,c] ? ;
no C C
07/11/16 6
Profondeur d'abord et cycles
solve(Node,Solution) :-
depthfirst([],Node, Solution)
07/11/16 7
Recherche en largeur d'abord
| ?- solve(a,c,X). A
X = [a,b,c] ? ;
X = [a,e,f,c] ? ;
X = [a,b,f,c] ? ; E B 1er
no
D F F C 2ème
C C 3ème
• Principe : visiter les noeuds les plus proches du noeud de départ.
• Implémentation : maintenir un ensemble de noeuds candidats à chaque
étape (maintenir un ensemble de chemins).
• breadthfirst (Paths,Solution): vrai s’il y a un chemin de l’ensemble des
chemins candidats pouvant être étendu vers les noeuds buts.
• Solution: est un chemin étendu, Paths: une liste de chemins.
• Chaque chemin : liste de noeuds dans l’ordre inverse.
07/11/16 8
Recherche en largeur d'abord
Si la tête du premier chemin est un noeud but alors ce chemin est la solution
du problème.
sinon
– enlever le premier chemin de l’ensemble des chemins candidats.
– générer tous les chemins étendus d’un niveau possibles de ce chemin.
– ajouter cet ensemble d’extension a la fin de l’ensemble des candidats.
07/11/16 9
Recherche en largeur d'abord
solve(Start, Solution):-
breadthfirst([[Start]],Solution).
extend([Node | Path],NewPaths):-
bagof([NewNode,Node | Path],
(link(Node,NewNode),
\+ member(NewNode,[Node | Path])),
NewPaths).
extend(Path,[]).
%bagof 07/11/16
échoue: le noeud n'a pas de successeur. 10