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

Algorithmes et structures de données Discussion :

Trouver tous les chemins entre deux noeuds dans un graphe qui contient des boucles


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Trouver tous les chemins entre deux noeuds dans un graphe qui contient des boucles
    Salut

    J'ai un graphe orienté qui contient des cycles et des boucles. Je voudrais afficher tous les chemins entre deux noeuds en respectant une contrainte de longueur pour eviter de boucler infiniment sur un le meme noeud. J'ai essayé un plusieurs algorithmes mais ils ne marchent pas à cause des boucles.

    Avez vous un bon algorithme qui peut résoudre mon problème?

    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    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
    noeudA
    noeudB
    noeudsVisites
    explore(noeud)->
      si noeud == noeudB
        afficher(noeudVisites)
      pour tous les voisins de noeud as voisin
        si voisin dans noeudVisites
          //ne pas explorer... cest un cycle
        sinon
          noeudsVisites.push voisin
          explore(voisin)
          noeudsVisites.pop
     
    explore(noeudA)

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre pseudo code galerien69. Mais je dois considérer les cycles et les boucles. C'est a dire je cherche un algorithme qui peut afficher tous les chemins entre deux noeuds d'un graphe orienté cyclique en respectant une contrainte de longueur pour eviter les boucles infinies sur un même noeud. par exemple: afficher tous les chemins de longueur <= 4 entre deux noeuds A et B.

    J'ai essayé d'adapter l'algorithme de la recherche taboo en ajoutant une condition de longueur mais il ne donne pas les résultats voulus.

    Avez vous une idée pour résoudre ce problème?

    Merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    je ne vois pas en quoi mon algorithme ne répond pas à tes conditions.
    A partir du moment ou les cycles sont détectés, quel est le problème?

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2012
    Messages : 13
    Points : 33
    Points
    33
    Par défaut
    J'ai l'impression que le problème n'est pas d'éviter les cycles.

    Au contraire, si une boucle est suffisamment courte pour que l'emprunter plusieurs fois ne fasse pas dépasser la longueur maximal alors elle peut apparaitre n fois dans une solution.

    Le seul problème est alors d'éviter les boucles infinies.

    Si c'est bien ça, un simple compteur sans contrôle sur les nœuds déjà visités devrait suffire :

    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
    20
    21
    22
    23
    24
    25
    26
     
    noeudA // nœud de départ
    noeudB // nœud d'arrivé
    pileDeNoeud // chemin actuellement parcouru
    longueur_max = 4
     
    fonction traiteNouveauNoeud ( nouveau_noeud )
    {
        pileDeNoeud.ajouter(nouveau_noeud);
     
        si ( nouveau_noeud = noeudB) alors afficher pileDeNoeud
        sinon
        {
            si (pileDeNoeud.taille < longueur_max)
            {
                pour tout noeud accessible  depuis nouveau_noeud
                {
                     traiteNouveauNoeud(noeud )
                }
            }
        }
        pileDeNoeud.enlever(nouveau_noeud);
     
    }
     
    traiteNouveauNoeud (noeudA )
    Cet algorithme tolère que l'on passe plusieurs fois sur le nœud de départ mais se s'arrête au premier passage sur le nœud d'arrivé et un cycle peut intervenir n fois tant que la longueur maximale ne dépasse pas le max.

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Bonsoir,
    Je pense qu'on est en plein dans l'application de l'algorithme A*

    Généralement, les tutoriels sur cet algorithme commencent par une exploration systématique de tous les chemins, puis optimisation, en choisissant le meilleur chemin.
    Il suffit d'appliquer l'algo brut, avant optimisation.
    La question qui peut devenir essentielle, c'est : 'Quel volumes de données ?'
    Si chaque point a 3 ou 4 fils, et si on accepte des arbres jusqu'à 100 étapes ou plus, ça va vite devenir catastrophique en terme de performance.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

Discussions similaires

  1. Regex trouver tous les chemins intermédiaires
    Par Pedro4 dans le forum Langage
    Réponses: 7
    Dernier message: 01/02/2012, 12h00
  2. Tous les jours entre deux dates
    Par karamurat dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/01/2011, 15h53
  3. Trouver tous les retours à la ligne contenus dans une table
    Par Philofish dans le forum Langage SQL
    Réponses: 1
    Dernier message: 04/08/2008, 22h24
  4. Réponses: 2
    Dernier message: 25/02/2008, 23h40
  5. Réponses: 14
    Dernier message: 25/11/2007, 18h32

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