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 :

[Théorie des graphes] Détecter les zones non reliées entre elles


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 6
    Points
    6
    Par défaut [Théorie des graphes] Détecter les zones non reliées entre elles
    Bonjour,
    Voici mon problème :
    Je développe un programme qui permet la création de graphs non orientés.
    A partir de ces graphs je créé une matrice d'adjacence triangulaire supérieure car dans mon cas, un sommet ne peut être relié à lui même, et si deux sommets sont reliés par plusieurs arrêtes cela équivaut à une seule arrête.
    C'est donc une matrice très simple.

    Je cherche un algorithme permettant de récupérer les différents "compartiments" du graph.
    C'est à dire une liste par groupe de sommets reliés, car il est possible qu'il y ai des parties du graph non reliées à d'autres parties.

    J'ai du mal à formuler ma demande sur les moteurs de recherche (manque de terminologie en théorie des graphs).
    Si vous avez des pistes ou même un nom d'algorithme je suis preneur !

    Merci beaucoup

  2. #2
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,

    Tu cherches les composantes connexes. Pour les déterminer tu peux faire un parcours en profondeur (depth first search, DFS). De nombreux algorithmes nécessitent un parcours soit en profondeur, soit en largeur il va falloir te familiariser non seulement avec le vocabulaire mais aussi avec les algorithmes de base.

  3. #3
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    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 054
    Points : 9 394
    Points
    9 394
    Par défaut
    Une procedure comme celle-ci devrait faire l'affaire :

    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
    27
    28
    29
     
    Procedure sousgroupe ( Nombre_de_sommets,  tableau_d_aretes)
    Nbre_aretes = dimension ( tableau_d_aretes)
     
    TABLO est un tableau de Nombre_de_sommets entiers
     
    Pour i = 1 a nombre_de_sommets
       tablo[i] = i    // Tableo va donner un numéro de groupe pour chaus sommet. Au départ, les numero de groupe sont tous différents.
    fin
     
    Pour i = 1 a Nbre_aretes
       extremite_1 = sommet_1 ( tableau_d_aretes[i] )
       extremite_2 = sommet_2 ( tableau_d_aretes[i] )
       i1 = tablo[extremite_1]
       i2 = tablo[extremite_2]
       si i1 = i2  
         // Rien à faire, on avait déjà un réseau d'arêtes qui reliait nos 2 extrémités.
      sinon
          si i1 > i2 alors    // je permute i1 et i2 pour avoir i1 < i2
             tmp = i1
             i1 = i2
             i2 = tmp    
         fin
         //  Quand une arête relie 2 groupes de numéros i1 et i2, avec i1 < i2, je dis que tous les points qui étaient dans i2 sont en fait dans i1 
         //   En fait, chaque groupe est identifié par l'indice le plus petit de tous les éléments de ce groupe.
         Pour j = 1 a nombre_de_sommets
             si tablo[j] = i2 alors tablo[j] = i1
         fin
    fin
    A la fin de cette boucle, Pour 2 sommets S1 et S2, si tablo[s1] = tablo[s2] , c'est qu'on peut les relier par une succession d'arêtes.

    C'est un bout de pseudo-code improvisé, mais je suis totalement confiant.
    Par contre, comment ça s'appelle, ça n'a pas de nom particulier, je n'ai pas déposé de brevet.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Bonjour à tous et merci pour vos réponses.
    J'ai finalement trouvé une solution ce matin qui n'utilise pas cette matrice (car j'ai un niveau moyen en maths ahah)

    Si ça peut en aider certain voici ce que j'ai fait :
    Je pars d'une liste d'arretes et d'une liste de sommets.
    Je créé une liste de sommet vide qui contient tous les sommets que j'ai déja traité (pour ne pas les retraiter).

    je parcours les sommets de la liste initiale et pour chaque sommet je fais une recursivité pour chaque arrete de ce sommet en ajoutant tous les sommets trouvés a la liste deja traité et au compartiment du sommet de la premiere liste. Code c++ utilisant des CPtrList

    Code c++ : 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
     
    CListOfSommets* dejaTries = new CListOfSommets;
    int i,j;
    for (i=0;i<listeSommets->GetCount();i++)
    {
    	CSommet* pSommet = listeSommets->Item(i);
            // Cas de sommet considéré comme n'étant pas une liaison (peut changer au cours de l'application)
    	if (pSommet ->bloquant())
    	{
    		CZone* pZone= new CZone();
    		pZone->AddTail(pSommet );
    		dejaTries->AddTail(pSommet);
    		zones->AddTail(pZone);
    		continue;
    	}
    	// On verifie que le sommet n'a pas deja été traité
    	if (sommetInListe(dejaTries, pSommet)) continue;
            // On fait la recursivite
    	CZone* pZone= new CZone();
    	pZone->AddTail(pSommet);
    	dejaTries->AddTail(pSommet);
    	nouvelleZone(pSommet , pZone, dejaTries);
    	zones->AddTail(pZone);
    }
     
     
    void MaClasse::nouvelleZone(CSommet* pSommet, CZone* pZone, CListOfSommets* dejaTries)
    {
    	int i;
    	for (i=0;i<listeArretes->GetCount();i++)
    	{
    		CSommet* pSommetSuivant = NULL;
    		CArrete* pArrete = listeArretes->Item(i);
    		// Pas de "faux" lien (spécificité de mon app)
    		if (pArrete->bloquant()) continue;
    		if (pArrete->begin == pOp)
    		{
    			pSommetSuivant = pArrete->end;
    		}
    		else if (pArrete->end == pOp)
    		{
    			pSommetSuivant = pArrete->begin;
    		}
                    // Si ce lien ne correspond pas au sommet en cours on passe au suivant
    		if (!pSommetSuivant) continue;
    		// Si ce sommet est deja traité on passe au suivant
    		if (operationInListe(dejaTries, pSommetSuivant)) continue;
    		pZone->AddTail(pSommetSuivant);
    		dejaTries->AddTail(pSommetSuivant);
    		nouvelleZone(pSommetSuivant, pZone, dejaTries);
    	}
     
    }

    EDIT : typo

  5. #5
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Tu viens de redécouvrir plus ou moins le parcours en largeur …
    Je ne peux que te conseiller de te familiariser avec le vocabulaire de la théorie des graphes ainsi que des algorithmes de base.
    Cela te permettra non seulement de savoir quoi chercher mais aussi d'avoir une réflexion adaptée à ce genre de structure de donnée.
    N'oublie pas de passer le sujet en résolu.

  6. #6
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 594
    Points
    188 594
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

Discussions similaires

  1. Théorie des graphes : algo de Kruskal et files de priorités
    Par AlKoLiK dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 16/05/2007, 10h47
  2. Théorie des graphes
    Par aminos40 dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/04/2007, 22h33
  3. [Théorie des Graphes] Les opérateurs AND et OR
    Par bitou dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 18/03/2007, 03h01
  4. Théorie des graphes : Représentation GRAPHIQUE d'une matrice d'adjacence
    Par jm_gouy dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 03/05/2006, 16h53
  5. Détecter les emails non lus
    Par mico2 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 15/03/2006, 21h19

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