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

C Discussion :

Trouver toutes les chaines distinctes entre deux points d'un graphe.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 33
    Par défaut Trouver toutes les chaines distinctes entre deux points d'un graphe.
    Bonjour! Je suis étudiant et je dois résoudre un problème en C.

    On me donne un graphe, non orienté, non pondéré. Avec un sommet de départ 'x' et un sommet d'arrivé 'y' .

    Le but est de trouver un maximum de chaîne (chemins) élémentaires entre x et y avec pour contrainte qu'il n'y ai aucun sommet commun à deux chaînes et que chacune des chaînes soit la plus courte possible... Suis-je clair? ^^

    J'arrive à peu près à sortir une liste de toutes mes chaînes élémentaires entre x et y (avec une sorte de d'A* je pense ^^) mais je n'arrive pas à trouver une solution intelligente pour sélectionner parmi ces chaînes celles qui ne sont jamais en intersections..

    Auriez vous des pistes de recherches? Avez vous besoin de plus d'info pour répondre?

    Merci bien et merci!

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 33
    Par défaut
    Alors pour apporter quelques précisions et exemples:

    Disons que j'ai le graphe suivant:

    Sommets: Start, 1, 2, 3, 4, 5, 6, 7, End.

    Arrêtes: Start-1, Start-2, 1-3, 1-4, 2-4, 2-5, 3-End, 4-End, 5-6, 6-7, 7-End

    Pour trouver mes chemins, je pars de End avec un poids de 0 et j'incrémente mon poids dès que je m’éloigne. Chaque sommet possède un tableau de poids représentant leurs place dans les différents chemins.

    Donc en terme de poids:

    End : 0
    3 : 1 et 1
    4 : 1, 1, 3 et 5
    7 : 1 et 1
    6 : 2 et 2
    5 : 3 et 3
    2 : 2, 4, 4 et 4
    1 : 2, 2, 2 et 6
    Start : 3, 3, 3, 5, 5 et 7

    A la fin je remonte mes poids décroissants en partant de Start, et je sauvegarde mes chemins.

    Chemin 0: Start-1-3-End
    Chemin 1: Start-1-4-End
    Chemin 2: Start-1-4-2-5-6-7-End
    Chemin 3: Start-2-4-End
    Chemin 4: Start-2-4-1-3-End
    Chemin 5: Start-2-5-6-7-End

    Les chemins que je dois maintenant sélectionner sont Chemin 0 et chemin 3, car c'est l'ensemble des chemins les plus courts pour aller de Start à End sans intersections..

    Donc dans cet exemple c'est plutôt triviale à voir, mais je n'arrive pas à imaginer l'algo..

    Si vous avez besoin du code je peux le mettre, mais je ne pense pas que se soit vraiment nécessaire.. Au point où j'en suis j'ai un tableau de chaîne d'int, le tableau et chaque chaîne sont terminés par NULL.

    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct      s_list
    {
        int             id;
        struct s_list   *next;
    }                   t_list;
     
    t_list              *path[X];
    path[X] = NULL;
    Avec:

    X = Nombre de chemins trouvé
    et id = le numéro du sommet.


    Voilà voilà... ^^

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

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,
    comme un algorithme de type glouton ne convient pas (trouver le plus court chemin, recommencer avec le graphe privé de ce chemin, …), il faut, à mon avis créer un graphe des chemins C à partir de ton graphe originel G. Chaque nœud de C est un chemin dans G et deux nœuds de C sont reliés si les chemins qu'ils représentent dans G ont un nœud en commun. De plus tu affecte un poids à chaque nœud de C égale à la longueur du chemin dans G. Si on reprend ton exemple, ton graphe G originel peut être représenté ainsi :

    Nom : g.png
Affichages : 249
Taille : 24,3 Ko

    Du coup le graphe des chemins C est (suivant ton exemple) :
    Nom : g2.png
Affichages : 239
Taille : 45,1 Ko

    Ton problème se résout en trouvant un stable de poids minimum dans C.
    Les stables sont :
    C0,C3 : P=4
    C0,C5 : P=6
    C1,C5 : P=6
    C2 : P=6
    C4 : P=4

    Deux stables de poids minimum : C0,C3 et C4 tous deux de poids 4.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 33
    Par défaut
    oO !!

    C'est carrément ça!! MERCI @picodev !!!

    Je comprends le raisonnement (comment tu fais) et je vois que ça marche

    Par contre j'ai du mal à comprendre pourquoi ça marche ^^ . Et ce que représentent réellement ces stables.. En effet le Chemin 4 n'est pas du tout pertinent dans mon problème alors qu'il appairait comme étant autant pertinent que l'ensemble (Chemin 0, Chemin 3).

    Encore une fois merci! Je vais pouvoir continuer mes recherches!

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

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Citation Envoyé par sben42 Voir le message
    [...]
    Par contre j'ai du mal à comprendre pourquoi ça marche ^^ . Et ce que représentent réellement ces stables.. En effet le Chemin 4 n'est pas du tout pertinent dans mon problème alors qu'il appairait comme étant autant pertinent que l'ensemble (Chemin 0, Chemin 3).
    Un stable est un ensemble de sommets deux à deux non adjacents, ce qui par construction du graphe C signifie un ensemble de chemin dans G n'ayant aucun sommet en commun : ce que tu cherches. Ensuite tout dépend des contraintes que tu vas utiliser pour discriminer les stables : somme des poids (ce que j'ai utilisé en exemple) ou encore nombre de chemins (à maximiser) suivi de somme des poids (à minimiser), …
    La difficulté est dans le sens que tu donnes à «chacune des chaînes soit la plus courte possible» dans la phrase «un maximum de chaîne (chemins) élémentaires entre x et y avec pour contrainte qu'il n'y ai aucun sommet commun à deux chaînes et que chacune des chaînes soit la plus courte possible».

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 33
    Par défaut
    merci pour les précisions @picodev!

    Je comprends mieux pourquoi le chemin 4 apparaît comme pertinent.

    Pour l'ordre et l’importance des contraintes, ça va dépendre de mon état initial:

    En fait je dois faire aller un nombre variable d'agent de mon sommet de départ à mon sommet d'arrivée.
    Le tout en un minimum de déplacement.
    Sachant qu'un agent ne peut se déplacer que de 1 en 1 (sommet) et qu'à part dans mes sommets de départ et d'arrivée, il ne peut y avoir qu'un agent à la fois sur un sommet.

    Mon programme prend en paramètre le nombre d'agents, la liste des sommets et la liste des arêtes. (Etat Initial)

    D'où mes contraintes "chemin le plus court" et "un maximum de chemin différent" qui va dépendre de mon nombre d'agents (s'il n'y en a qu'un il prendra forcément le plus court, mais s'il y en a plusieurs, il se peut que se soit plus pertinent d'avoir plus de chemins même s'ils sont plus longs que le chemin "unique" le plus court....)

    Hum hum, pas très clair...

    Par exemple si j'ai un stable S0 composer de C0 de poids 4 et un stables S1 composé de C1-C2-C3 de poids 15 (5 chacun).

    Pour 1 agent, S0 est le plus pertinent;

    Pour 2 agents, c'est égal de choisir S0 ou S1, sur S0 le deuxième agent devra attendre 1 tour avant de pouvoir emprunter le chemin. Qu'importe le stable choisi on mettra 5 tours;

    Pour 3 agents et plus il faut choisir S1! Même si le premier n'arrive qu'au cinquième tour, ils arriveront 3 par 3. Ce sera donc plus rapide que de les faire tous patienter sur S0 ...

    Je cherche, je code, et je reviens avec mes résultats un grand merci!

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/06/2015, 05h09
  2. Supprimer les espaces compris entre deux points virgules dans un fichier csv
    Par moctarim dans le forum Shell et commandes POSIX
    Réponses: 2
    Dernier message: 04/01/2013, 17h03
  3. Extraire tout les doublons trouvés entre deux tables
    Par Tengu dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 12/03/2012, 12h29
  4. Générer toutes les substitutions possibles entre deux listes
    Par AngryArtz dans le forum Général Java
    Réponses: 6
    Dernier message: 06/11/2011, 22h13
  5. [XL-2007] Trouver simplement les champs modifiés entre deux versions d'un fichier ?
    Par EmmanuelleC dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/12/2010, 09h56

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