AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zyklen in ungerichteten Graphen

Ein Thema von MrMooed · begonnen am 14. Mär 2014 · letzter Beitrag vom 25. Mär 2014
Antwort Antwort
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#1

Zyklen in ungerichteten Graphen

  Alt 14. Mär 2014, 22:26
Hallo DP,

die "einfache" Frage: Wie finde ich alle Zyklen in einem ungerichteten Graphen?

Ich habe mich bis jetzt ziemlich dämlich dabei angestellt, da ich vermutlich meine Gedanken nicht geordnet kriege
Überlegt habe ich mir, dass ich eine Breitensuche nutze um einen Zyklus (ausgehend von Knoten A) zu finden, doch hierbei scheitert es an der "Markierung" für bereits besuchte Knoten:
Code:
    A  <- 1. Rekursion
   / \
  B  C <- 2. Rekursion
  |   | 
  D---E <- 3. Rekursion
In der dritten Rekursion käme es ja zu einem Fehler, da der Weg D und E ja schon besucht wurden - jedoch müsste es die Wege E -> D sowie D -> E noch geben (+ den weiteren Weg zu A).
Wie könnte ich einer Breitensuche also vermitteln, dass (z.B.) der Knoten E für D erreichber ist?

Hoffe ich konnte mich verständlich ausdrücken, wenn etwas unklar ist (oder jemand mir sogar weiterhelfen kann ) würde ich weitere Infos liefern.
In Quelltext habe ich mich erst gar nicht heran gewagt, da mir die Vorüberlegungen schon Kopfschmerzen bereiten
Gruß,
MrMooed
"Unsere Luft hat einen Vorteil: Man sieht was man einatmet" - Ein Chinese
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#2

AW: Zyklen in ungerichteten Graphen

  Alt 14. Mär 2014, 22:49
Führe eine Tiefensuche durch und markiere bereits besuchte Knoten.
Hier mal Pseudocode:
Delphi-Quellcode:
Procedure Cycle (Path : TPath; Graph : TGraph)
Begin
  Foreach node in Graph.NeighborOf(Path.Last)
    if (node=Path.First) and (Path.Length>MinLength) then
      Show(Path+node)
    else if Not node.visited then begin
      node.visited := True;
      Cylce(Path+node,Graph);
      node.visited := False;
    end
end;
Dabei wird jeder zyklische Pfad, der länger als 'MinLength' ist, ausgegeben (glaube ich).
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

AW: Zyklen in ungerichteten Graphen

  Alt 14. Mär 2014, 23:36
Beim Googeln findet man eine Menge, unter anderem dieses schöne StackOverflow-Thema.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: Zyklen in ungerichteten Graphen

  Alt 15. Mär 2014, 13:09
@Furchtbichler - sofern ich mich grad nicht vertue, dürfte der Code nen kleinen Fehler enthalten (obwohls ja nur Pseudocode ist..) - und zwar merkst du nicht wirklich, welche Knoten bereits besucht sind (bzw. du überprüfst nicht, ob der Knoten bereits besucht wurde), somit kann der Fall auftreten, dass Cycle nie aufhört -> z.B. hier:
A->B->C->D->B
Edit2: Sonst sollte es aber nach diesem Prinzip gehen! Einfach eine kleine Überprüfung einbauen, ob man an einem Knoten angelangt ist, der bereits im "Path" enthalten ist, jedoch nicht der "First" Knoten ist! Hier dann abbrechen, da ja der Startknoten dann nicht im Zyklus enthalten ist sondern nur dorthin führt..

@Threadstarter - es gibt da eine Unklarheit:
Willst du alle Zyklen die einen bestimmten Knoten (A) enthalten oder willst du alle Zyklen, wo kein Element eines Zyklus' in einem anderen Zyklus vorkommt?!
Ich bin mir nicht ganz sicher, aber die Implementierung dürfte je nach dem anders aussehen. Bevor ich mir also Gedanken mache, wäre es schön, wenn du das klärst!

Edit:
Da ich grad Zeit habe, habe ich das mal schnell gezeichnet
Miniaturansicht angehängter Grafiken
untitled.jpg  
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (15. Mär 2014 um 13:23 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#5

AW: Zyklen in ungerichteten Graphen

  Alt 15. Mär 2014, 17:38
@Furchtbichler - sofern ich mich grad nicht vertue, dürfte der Code nen kleinen Fehler enthalten (obwohls ja nur Pseudocode ist..) - und zwar merkst du nicht wirklich, welche Knoten bereits besucht sind (bzw. du überprüfst nicht, ob der Knoten bereits besucht wurde), somit kann der Fall auftreten, dass Cycle nie aufhört -> z.B. hier:
A->B->C->D->B
Eigentlich nicht, denn B wurde bereits im ersten Abstieg besucht und damit als Visited bezeichnet. Zyklen werden nicht auftreten, aber ein und der selbe Zyklus mehrfach ausgegeben, da die Graphen nicht gerichtet sind, also z.B. A->B->C->A und A->-C->B->A (bei einem Dreieck). Genaugenommen sind es ja zwei Wege, sozusagen linksrum und rechtsrum.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: Zyklen in ungerichteten Graphen

  Alt 15. Mär 2014, 18:18
Hmm ok, stimmt, hab das mit "visited" nicht bedacht. Bin bei der ersten If Condition stehen geblieben und zu dem Entschluss gekommen..
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Zyklen in ungerichteten Graphen

  Alt 25. Mär 2014, 21:23
Entschuldigt die lange Wartezeit

Delphi-Quellcode:
Procedure Cycle (Path : TPath; Graph : TGraph)
Begin
  Foreach node in Graph.NeighborOf(Path.Last)
    if (node=Path.First) and (Path.Length>MinLength) then
      Show(Path+node)
    else if Not node.visited then begin
      node.visited := True;
      Cylce(Path+node,Graph);
      node.visited := False;
    end
end;
So etwas habe ich mir auch überlegt, allerdings habe ich da meinen Denkfehler gehabt. Ich war davon ausgegangen, dass für die Rekursion node.visited wieder auf false gesetzt werden muss ich weiß nicht wie ich auf die Idee gekommen bin..

@Threadstarter - es gibt da eine Unklarheit:
Willst du alle Zyklen die einen bestimmten Knoten (A) enthalten oder willst du alle Zyklen, wo kein Element eines Zyklus' in einem anderen Zyklus vorkommt?!
Ich bin mir nicht ganz sicher, aber die Implementierung dürfte je nach dem anders aussehen. Bevor ich mir also Gedanken mache, wäre es schön, wenn du das klärst!
Wenn ich dich richtig verstanden habe, dann will ich keins von beiden. Ich möchte lediglich alle Zyklen ermitteln, die über mehr als 3 Kanten gehen.

Da ich grad Zeit habe, habe ich das mal schnell gezeichnet
Vielen lieben Dank euch dreien für die (wie immer) schnellen Antworten. Und Entschuldigung meinerseits, für die Verzögerung
Gruß,
MrMooed
"Unsere Luft hat einen Vorteil: Man sieht was man einatmet" - Ein Chinese
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz