Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 2.04 KB | None | 0 0
  1. %
  2. % Dijkstra
  3. %   + Start        : Point de départ
  4. %   + Finish       : Point de d'arrivée
  5. %   - ShortestPath : Chemin le plus court
  6. %   - Len          : Longueur de ce chemin
  7. %
  8.  
  9.  
  10. dijkstra(Start, Finish, ShortestPath, Len) :-
  11.  dijk( [0-[Start]], Finish, RShort, Len),
  12.  reverse(RShort, ShortestPath).
  13.  
  14.  
  15.  
  16. % Le dernier point visité est le point d'arrivée => on s'arrête
  17. %
  18.  
  19. dijk( [ Len-[Fin|RPath] |_], Fin, [Fin|RPath], Len) :- !.
  20.  
  21.  
  22. dijk( Visited, Fin, RShortestPath, Len) :-
  23.  % Recherche du meilleur candidat (prochain point à ajouter au graphe)
  24.  %   et appel récursif au prédicat
  25.  %
  26.  
  27.  bestCandidate(Visited, BestCandidate),
  28.  dijk( [BestCandidate|Visited], Fin, RShortestPath, Len).
  29.  
  30.  
  31.  
  32. %
  33. % Recherche toutes les arrêtes pour lesquelles on a:
  34. %  - un point dans le graphe (visité)
  35. %  - un point hors du graphe (candidat)
  36. %
  37. % Retourne le point qui minimise la distance par rapport à l'origine
  38. %
  39.  
  40.  
  41. bestCandidate(Paths, BestCandidate) :-
  42.  
  43.  % à partir d'un point P1 :
  44.  
  45.  findall(
  46.     NP            % on fait la liste de tous les points P2 tels que:
  47.  ,
  48.    (
  49.      member( Len-[P1|Path], Paths),  % - le point P2 a déjà été visité
  50.      troncon(P1,P2,Dist),                % - il existe un arc allant de P1 à P2, de distance Dist
  51.      \+isVisited(Paths, P2),         % - le point P2 n'a pas encore été visité
  52.  
  53.      NLen is Len+Dist,               % on calcule la distance entre l'origine et le point P2
  54.  
  55.      NP=NLen-[P2,P1|Path]            % on met chaque élément de la liste sous la forme: Distance-Chemin
  56.                                      % pour pouvoir les trier avec le prédicat keysort/2
  57.    )
  58.  ,
  59.    Candidates
  60.  ),
  61.  
  62.  % On trie et on retient le chemin le plus court
  63.  minimum(Candidates, BestCandidate).
  64.  
  65.  
  66.  
  67. %
  68. % Sort le meilleur candidat parmi une liste de candidats
  69. % (= celui de chemin le moins long)
  70. %
  71.  
  72. minimum(Candidates, BestCandidate) :-
  73.  keysort(Candidates, [BestCandidate|_]).
  74.  
  75.  
  76.  
  77. %
  78. % Teste si un point P a déjà été visité
  79. %
  80.  
  81. isVisited(Paths, P) :-
  82.  memberchk(_-[P|_], Paths).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement