IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Prolog Discussion :

Le plus court chemin (simplifié)


Sujet :

Prolog

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 2
    Par défaut Le plus court chemin (simplifié)
    Bonjour,

    Je voudrais bien savoir si quelqu’un parmi vous peut m’aider. Je dois écrire un programme qui calcule les chemins possibles d’un réseau du métro (grâce à une base de faits), calcule le chemin le plus court et après génère tous les chemins par ordre de croissance. Pour la première partie, c’est ok. Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    connexion(lumiere,eau).
    connexion(eau,pierre).
    connexion(pierre,gaz).
    connexion(mix,pierre).
    connexion(pierre,pas).
    connexion(pas,coup).
    connexion(coup,gaz).
    connexion(gaz,can).
    connexion(can,mix).
     
    reseau(X,X,_, [X]). 					/*reseau(station_de_depart,station_de_arrivee,station_interdite,chemin)*/
    reseau(X,Y,Station_int, [X|Chemin_a_faire]) :-
    	connexion(X,Z),					/*La station interdite represente une station par laquelle notre trajet ne peut pas passer.*/
    	not(dans(Z, Station_int)),
    	reseau(Z,Y,[Z|Station_int], Chemin_a_faire).
    reseau(X,Y,Station_int, [X|Chemin_a_faire]) :-
    	connexion(Z,X),
    	not(dans(Z, Station_int)),
    	reseau(Z,Y,[Z|Station_int], Chemin_a_faire).

    Par contre, pour trouver le chemin le plus court et pour les organiser, je n’arrive pas à concevoir leurs codes. J’ai déjà cherché à propos de l’algorithme de Dijkstra, mais cet algorithme est trop compliqué par rapport à mes besoins (mes distances entre deux stations n’ont pas de poids) et, en plus, je suis débutant en Prolog, ce qui malheureusement m’empêche de le comprendre.
    Vous avez des idées pour m’aider ?

    Merci beaucoup,
    Raphael

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    pour trouver le plus court chemin, tu peux faire une exploration en largeur du graphe, je te renvoie à cet article
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 2
    Par défaut
    Bonjour,

    Merci d’avoir répondu Trap. Par contre, j’ai encore le même problème qu’avant. Vu que je suis débutant en Prolog, je n’arrive pas à comprendre comment ce code peut m’aider (je pense que, peut-être, je ne maîtrise pas assez le langage pour pouvoir faire les adaptations nécessaires).
    J’ai déjà créé une fonction qui calcule la longueur d’une liste et une fonction que calcule le minimum. Mon idée serait de créer une fonction qui, tout de suite, garde le premier chemin donné par ma fonction « reseau » (voir mon premier post) et calcule sa respective longueur L1. Après, elle calcule la longueur L2 du chemin suivant et, si L2<L1, elle jette le premier chemin et garde le deuxième.
    Je pense que le Logique du problème est déjà dans ma tête, mais le problème reste concevoir le langage. Quelqu’un aurait une idée ?

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Ton programme (que j'ai un peu modifié pour qu'il fonctionne en SWI-Prolog) est correct et te donne les chemins.
    Pourquoi ne classes-tu pas ces chemins par ordre de longueur ?
    Existe-t-il dans ton Prolog l'équivalent de bagof ?
    Ce prédicat te permet d'obtenir toutes les solutions d'un but.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

Discussions similaires

  1. Calcul de plus court chemin dans un graphe
    Par Elmilouse dans le forum Prolog
    Réponses: 6
    Dernier message: 21/03/2010, 20h26
  2. Plus court chemin - graphe NON orienté et pondéré
    Par Nicodemus dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 14/03/2006, 15h32
  3. N plus courts chemin dans un graphe
    Par MLK jr dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 13/03/2006, 00h32
  4. [algo] plus courts chemins (au pluriel !!)
    Par ADSL[fx] dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 18/01/2006, 14h40
  5. Réponses: 2
    Dernier message: 21/03/2004, 18h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo