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 :

Parcours d'un arbre : examiner tous les chemins possibles


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 102
    Points : 108
    Points
    108
    Par défaut Parcours d'un arbre : examiner tous les chemins possibles
    Bonjour tout le monde.
    Actuellement, je suis à la recherche d'un algo qui me permetterais de parcourir un arbre N-Aire, en me couvrant tout les chemins possible d'un point A à un point B.
    A l'origine, je pensais utiliser un parcour en profondeur, mais cela ne répond pas à mes besoins.

    Voici un exemple de ce que j'ai :

    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
     
    		<routes>
    		<route src="D1">
    			<dst condition="MA_COND" etape="E1" label="MON_LABEL" />
    			<dst condition="MA_COND2" etape="R2" label="MON_LABEL2" />
    		</route>
    		<route src="E1">
    			<dst condition="MA_COND" etape="R1" label="MON_LABEL" />
    		</route>
    		<route src="R2">
    			<dst condition="MA_COND" etape="E3" label="MON_LABEL" />
    		</route>
    		<route src="R1">
    			<dst condition="MA_COND" etape="end1" label="MON_LABEL" />
    		</route>
    		<route src="E3">
    			<dst condition="MA_COND" etape="end2" label="MON_LABEL" />
    		</route>
    	</routes>
    Et le résultat de sortie attendu :
    D1-E1-R1-END1
    D1-R2-E3-END2
    Avez vous une piste pour un algo qui pourrait répondre en partie à mes besoins ?

    PS : Je n'ai pas besoin d'avoir le chemin le plus court

    Merci d'avance.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    En quoi le parcours en profondeur ne répond pas à tes besoins ? Cela semble pourtant être la solution la plus simple à ton problème.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 102
    Points : 108
    Points
    108
    Par défaut
    Le problème c'est pour l'affichage

    Car en faites, je ne vois pas comment faire pour le stockage des informations entre les différentes branches (routes) possible.

    J'avais penser à utiliser une pile, et à chaque fois que l'on remonte, on supprime le dernier élément que l'on a ajouté à la pile, mais je n'arrive pas à voir comment faire pour l'implémenter.

    Voila un essai de ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        public ArrayList<Object> parse(Node pSource){  	
        	ArrayList<Object> result = new ArrayList<Object>();
        	result.add(pSource.getLabel());
        	Map<String, Node> children = pSource.getChildren();
        	for (Iterator<Node> child = children.values().iterator() ; child.hasNext() ;){
        		result.add(parse(child.next()));
        	}
        	return result;
        }

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    C'est presque ça

    A part que le chemin (result) ne doit pas être une valeur de retour mais un paramètre de la fonction, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fonction parcourir(Noeud noeud, Chemin chemin)
        Si noeud final
            afficher chemin
        Pour tout enfant de noeud
            parcourir(enfant, chemin + enfant)
    Le premier appel à parcourir se fera avec un chemin vide. Et dans les appels suivants chemin contiendra les noeuds visités pour atteindre le noeud courant.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 102
    Points : 108
    Points
    108
    Par défaut
    Ok, j'ai donc essayé en modifiant mon code

    Donc, maintenant ça ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        //Rajouter des conditions pour ajouter les informations
        public void parse(Node pSource, ArrayList<String> pChemin){  	
        	Map<String, Node> children = pSource.getChildren();
        	if(children.size() == 0){
        		pChemin.add(pSource.getLabel());
        		System.out.println(pChemin.toString());
        	}else{
        		pChemin.add(pSource.getLabel());
        		for (Iterator<Node> child = children.values().iterator() ; child.hasNext() ;){
        			parse(child.next(),pChemin);
        		}
        	}
        }
    Et mon arbre source est :
    Root
    / \
    T1 R1
    / / \
    T2 E1 E2
    /
    E3
    Hors le résultat que j'obtient en sortie est le suivant :
    [Root, R1, E2]
    [Root, R1, E2, E1, E3]
    [Root, R1, E2, E1, E3, T1, T2]
    Pour l'apple, je fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ArrayList<String> chemin = new ArrayList<String>();
    arbre.parse(arbre.getRoot(), chemin);
    Mais j'ai donc mon problème lorsque l'on remonte, il garde en mémoire tout le chemin déjà parcouru, donc théoriquement, à chaque fois qu'il remonte, je doit supprimer un élément. Mais je vois pas comment le faire :s

    Merci d'avance

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Ah oui, avec un langage à sémantique de référence comme Java, il faut soit faire une copie du chemin soit supprimer le dernier élément en remontant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        //Rajouter des conditions pour ajouter les informations
        public void parse(Node pSource, ArrayList<String> pChemin){  	
        	pChemin.add(pSource.getLabel());
        	Map<String, Node> children = pSource.getChildren();
        	if(children.size() == 0){
        		System.out.println(pChemin.toString());
        	}else{
        		for (Iterator<Node> child = children.values().iterator() ; child.hasNext() ;){
        			parse(child.next(),pChemin);
        		}
        	}
        	pChemin.remove(pChemin.size() - 1);
        }

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 102
    Points : 108
    Points
    108
    Par défaut
    Rohlalala

    Vraiment, un super gros merci, car je voyais vraiment pas comment arriver à cette solution

    Je me prenais la tête pour rien, car à l'origine j'avais même fait un test, en rajoutant un attribut à mes nodes, pour y mettre leur profondeur, ensuite faire un test de différences entre deux profondeurs, et ensuite faire une boucle de suppréssion sur cette différence (tout ça ne marchais pas :p )

    Encore un gros merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trouver tous les chemins possibles d'un trajet (d'un point A à un point B)
    Par chakirlbr dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 16/12/2014, 14h54
  2. Réponses: 2
    Dernier message: 01/06/2013, 01h47
  3. Collecte de tous les chemins possibles
    Par Erable dans le forum Mathématiques
    Réponses: 3
    Dernier message: 26/02/2010, 11h45
  4. Réponses: 0
    Dernier message: 26/05/2009, 01h06
  5. [JGraphT] Obtenir tous les chemin possibles
    Par pmartin8 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 02/06/2006, 19h26

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