Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1461 connectés 

  FORUM HardWare.fr
  Programmation
  Algo

  les cycles dans les graphes orientés : detection, decyclage, shampoing

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

les cycles dans les graphes orientés : detection, decyclage, shampoing

n°1713784
kadreg
profil: Utilisateur
Posté le 07-04-2008 à 14:23:20  profilanswer
 

bonjour,

 

J'ai une ch'tite question d'algorithmie, dans le domaine des graphes orienté.

 

J'ai un graph orienté. Je sais que ce graph contient au moins un cycle. D'ailleurs, je l'ai deja reduit pour qu'il ne contienne que des noeuds appartenant a au moins un cycle (par suppression des noeuds uniquement departs et uniquement arrivée).
Mais maintenant, je veux donner une information sympa a mon utilisateur, qu'il sache qu'il y a des cycles (ce qui est mal).

 

Comment faire pour sortir un ensemble de cycle de mon sac de noeud ? Existe t'il des algos deja biens connus ?

 

Et si vous avez un bon shampoing pour lews cheveux longs et bouclés, j'suis preneur aussi :o


Message édité par kadreg le 07-04-2008 à 14:23:59

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
mood
Publicité
Posté le 07-04-2008 à 14:23:20  profilanswer
 

n°1713791
0x90
Posté le 07-04-2008 à 14:40:17  profilanswer
 

Si je me trompe pas, faut que tu raffine ta définition sinon l'ensemble des cycles de ton graphe peut représenter un ensemble infini.
 
Par ex, l'ensemble infini des chemins de la forme ABC(DEFC)*GA sont des cycles ici.
http://pix.nofrag.com/6/7/4/fe3517096f7773eadbaf5447193ac.png
 


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1713796
nraynaud
lol
Posté le 07-04-2008 à 14:45:18  profilanswer
 

kad > dans mon dernier compilo, j'utilisais une pile pour poser les noeuds que je voyais (et pop quand je sors d'un noeud), si je re-tombais sur un des éléments de la pile, le cycle c'est tout le haut de la pile, du premier noeud répété jusqu'au sommet.

 


edit : et sans même optimiser la recherche, parce que dans mon cas (les inclusions de fichiers) il faut y aller pour avoir des chemins super-longs.


Message édité par nraynaud le 07-04-2008 à 14:46:27

---------------
trainoo.com, c'est fini
n°1713810
kadreg
profil: Utilisateur
Posté le 07-04-2008 à 14:58:50  profilanswer
 

0x90> bah oui. Mon probleme est qu'a partir de mon ensemble, j'aimerais donner un ensemble de cycles utilisables pour l'utilisateur qu'il puisse agir et les supprimer.

 

ray> Ca ne me donnerais qu'un seul cycle ca non ? Optimisations pas utiles dans mon cas : le machin a pas tendance a faire des cycles, et mon sous graphe devrai deja etre bien diminué

Message cité 1 fois
Message édité par kadreg le 07-04-2008 à 14:59:51

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°1713813
nraynaud
lol
Posté le 07-04-2008 à 15:00:06  profilanswer
 

kad> c'est quoi ton domaine ? parce que plusieurs cycles, c'est un merdier complet à détecter et à gérer.


---------------
trainoo.com, c'est fini
n°1713820
kadreg
profil: Utilisateur
Posté le 07-04-2008 à 15:03:55  profilanswer
 

modelisation systeme ( :o ). Les cycles sont interdits selon la methode. Donc la proba de m'en manger plusisuers d'un coup ...


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°1713829
0x90
Posté le 07-04-2008 à 15:07:44  profilanswer
 

kadreg a écrit :

0x90> bah oui. Mon probleme est qu'a partir de mon ensemble, j'aimerais donner un ensemble de cycles utilisables pour l'utilisateur qu'il puisse agir et les supprimer.

 

Donc des cycles minimaux idéalement.

 

je dirais un truc du genre

 

- soit M une map<noeud, cycle>
- soit L une liste des noeuds du graph G
- tant que L n'est pas vide:
    prendre N un noeud dans L:
       - faire une recherche en largeur de N à partir de N dans G, elle retourne une trace T
       - pour chaque noeud P de T:
           - enlever P de L
           - si M[P] n'existe pas ou si len(M[P]) < len(T):
              - affecter T à M[P]

 

à la fin tu as ta map M qui associe à chaque noeud un cycle minimal qui passe par ce noeud.

 

Tu peut ensuite lister ces cycles, virer les doublons et t'as une liste de cycles minimaux couvrant le graph.


Message édité par 0x90 le 07-04-2008 à 15:08:47

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1713843
nraynaud
lol
Posté le 07-04-2008 à 15:18:42  profilanswer
 

kadreg a écrit :

modelisation systeme ( :o ). Les cycles sont interdits selon la methode. Donc la proba de m'en manger plusisuers d'un coup ...


dans ces cas-là, j'ai toujours fait l'autruche : si y'en a plusieurs je lui en donne 1, il le casse et on verra après pour le suivant.  
 
Y'a des techniques super-bordéliques pour simplifier un graphe arbitraire en ses composantes cycliques, mais je te les déconseille, d'autant plus que pour représenter les résultats ensuite, une interface texte sera insuffisante, il faudra dessiner un schéma.
 
Bref, je vote autruche à moins que tu aies *vraiment* les moyens niveau temps.


---------------
trainoo.com, c'est fini
n°1713844
0x90
Posté le 07-04-2008 à 15:23:44  profilanswer
 

nraynaud a écrit :


dans ces cas-là, j'ai toujours fait l'autruche : si y'en a plusieurs je lui en donne 1, il le casse et on verra après pour le suivant.

 

Y'a des techniques super-bordéliques pour simplifier un graphe arbitraire en ses composantes cycliques, mais je te les déconseille, d'autant plus que pour représenter les résultats ensuite, une interface texte sera insuffisante, il faudra dessiner un schéma.

 

Bref, je vote autruche à moins que tu aies *vraiment* les moyens niveau temps.

 

Ça valait le coup de se décarcasser :'(

Message cité 1 fois
Message édité par 0x90 le 07-04-2008 à 15:23:54

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1713845
nraynaud
lol
Posté le 07-04-2008 à 15:26:02  profilanswer
 

0x90 a écrit :


 
Ça valait le coup de se décarcasser :'(


surtout que j'ai un algo de complexité moindre dans ma manche  ;)


---------------
trainoo.com, c'est fini
mood
Publicité
Posté le 07-04-2008 à 15:26:02  profilanswer
 

n°1713846
0x90
Posté le 07-04-2008 à 15:27:28  profilanswer
 

nraynaud a écrit :


surtout que j'ai un algo de complexité moindre dans ma manche  ;)


 
Envoie alors, j'ai improvisé sur le tas, je veut bien voir la version clean.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1713867
nraynaud
lol
Posté le 07-04-2008 à 15:54:12  profilanswer
 

tu fais un parcours classique de recherche de cycle avec une pile, sauf que quand tu trouve un cycle, tu le sauve dans un set et tu backtrack.
 
ensuite dans ton set, tu as tous les cycles possibles dans le graphe. donc là tu les partitionne en fonction de leur noeud d'entrée (et de sortie donc vu que c'est par celui-ci que ça a bouclé). Dans chaque partition tu fais un Dijkstra et tu sors le vainqueur.


---------------
trainoo.com, c'est fini
n°1713872
kadreg
profil: Utilisateur
Posté le 07-04-2008 à 15:57:25  profilanswer
 

:jap: merci a tous les deuxx, je vais voir combien, en €, mon employeur met sur la table :o


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°1713894
0x90
Posté le 07-04-2008 à 16:17:27  profilanswer
 

nraynaud a écrit :

tu fais un parcours classique de recherche de cycle avec une pile, sauf que quand tu trouve un cycle, tu le sauve dans un set et tu backtrack.
 
ensuite dans ton set, tu as tous les cycles possibles dans le graphe. donc là tu les partitionne en fonction de leur noeud d'entrée (et de sortie donc vu que c'est par celui-ci que ça a bouclé). Dans chaque partition tu fais un Dijkstra et tu sors le vainqueur.


 
Mettons qu'on démarre à A, ton algo va pas commencer à trouver ABCGA, backtracker à C, puis trouver ABCDEFGA et enfn s'arréter, et ainsi ignorer le cycle minimal CDEFC ? Ou alors j'ai mal compris "un parcours classique de recherche de cycle avec une pile" ?


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1713901
nraynaud
lol
Posté le 07-04-2008 à 16:24:38  profilanswer
 

non, il va faire :
ABCGA -> je stocke ABCGA
ABCDEFC -> je stocke CDEFC

 

là pas de baston au Dijkstra pour trouver le vainqueur.

 

edit : par contre, ça prend pas en compte tous les chemins effectivement, mais ça un certain avantage quand ils sont infinis ...


Message édité par nraynaud le 07-04-2008 à 16:25:54

---------------
trainoo.com, c'est fini
n°1713918
0x90
Posté le 07-04-2008 à 16:37:45  profilanswer
 

donc quand tu backtrack, en fait tu redémarre ta recherche de cycle en partant de C, tu ignore les noeuds A et B ( ceux d'avant le restart dans la pile) ou pas pendant cette recherche ?
 
Ou alors carrément à chaque ajout de noeud, tu le compare à tout les éléments de la pile, et dans ce cas, tu trouve aussi CDEFC, mais le cout à chaque ajout de noeud me semble un peu gros.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1713924
nraynaud
lol
Posté le 07-04-2008 à 16:42:56  profilanswer
 

0x90 a écrit :

donc quand tu backtrack, en fait tu redémarre ta recherche de cycle en partant de C, tu ignore les noeuds A et B ( ceux d'avant le restart dans la pile) ou pas pendant cette recherche ?
 
Ou alors carrément à chaque ajout de noeud, tu le compare à tout les éléments de la pile, et dans ce cas, tu trouve aussi CDEFC, mais le cout à chaque ajout de noeud me semble un peu gros.


le backtrack se fait au noeud qui constitue le haut de la pile, c'est un parcours en profondeur, sauf que là la majorité des noeuds n'ont qu'un seul arc sortant à part C.
 
à la base si ton graphe ne contient pas de cycle et une seule racine, c'est un arbre sur lequel tu tentes une descente en profondeur classique, avec l'algo que je propose, pas d'embrouilles de comlexité si y'avait pas d'embrouilles dans le graphe.


---------------
trainoo.com, c'est fini

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

  les cycles dans les graphes orientés : detection, decyclage, shampoing

 

Sujets relatifs
quel shampoing preferez vous ?Dessiner Graphes : Boites avec des connecteurs et des liens
Detection clavier en consoleDétection capacité AJAX sous IE
[EXCEL2007] Problèmes de format (chiffre deviennent dates ; graphes)Detection d'OS à l'exécution
Detection status imprimanteDétection d'une seule touche clavier (ou combinaison de 2 touches)
Algorithmique des graphesDetection de la quantité de mémoire vive
Plus de sujets relatifs à : les cycles dans les graphes orientés : detection, decyclage, shampoing


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR