Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Breitensuchalgorithmus modifizieren » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Seiten (2): [1] 2 nächste » Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Breitensuchalgorithmus modifizieren
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
deppensido
Doppel-As


Dabei seit: 23.12.2012
Beiträge: 144

Breitensuchalgorithmus modifizieren Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

hallo,

bei der Aufgabe vom Anhang, soll man die Breitensuche so modifizieren, dass dieser einen Schichtgraphen ausgibt. Leider habe ich diesmal überhaupt keine Idee, wie man das lösen könnte. Das fängt schon damit an, dass ich gar nicht verstehe, was genau ausgegeben werden soll. Offensichtlich ist ja das Ziel eine Kantenmenge E' zu füllen, aber wann soll überhaupt eine Kante hinzugefügt werden? Hoffe mir kann jemand auf die Sprünge helfen.

Grüße

deppensido hat dieses Bild (verkleinerte Version) angehängt:
Aufgabe.jpg

11.09.2013 21:05 deppensido ist offline Beiträge von deppensido suchen Nehmen Sie deppensido in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

RE: Breitensuchalgorithmus modifizieren Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo deppensido,

bei der Aufgabe geht es darum, aus einem stark zusammenhängendem Graphen einen hierarchischen Graphen zu erstellen. D.h. Du teilst den Graphen in Ebenen auf, wobei zwischen den Ebenen Kanten immer in die selbe Richtung zeigen. Es handelt sich also um einen gerichteten Baum, bei dem die Kinder mehrere Eltern haben können. Weiterhin können sich die Eltern immer nur in der darüberliegenden Ebene befinden. Verbindungen über mehrere Ebenen sind nicht möglich (die Weglänge zwischen s und u muss immer gleich sein).

VG,

Karlito
12.09.2013 12:51 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
deppensido
Doppel-As


Dabei seit: 23.12.2012
Beiträge: 144

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

hallo,

heißt das, dass ich aus einen gerichteten Graphen, einen wie in meinem Beispiel dargestellt erzeugen muss?

deppensido hat dieses Bild (verkleinerte Version) angehängt:
Beispiel.jpg

12.09.2013 14:59 deppensido ist offline Beiträge von deppensido suchen Nehmen Sie deppensido in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,

ja, das ist eine mögliche Ausgabe. Eine andere habe ich angehängt.

VG,

Karlito

Karlito hat dieses Bild (verkleinerte Version) angehängt:
graph.png

12.09.2013 15:42 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
deppensido
Doppel-As


Dabei seit: 23.12.2012
Beiträge: 144

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

hallo,

aber bei dem Beispiel ist doch die Weglänge von s zu dem untersten Knoten 2 und zu den anderen beiden 1. Damit ist die Bedingung, dass die Weglänge von s zu allen anderen Knoten gleich ist, nicht erfüllt oder?
12.09.2013 15:59 deppensido ist offline Beiträge von deppensido suchen Nehmen Sie deppensido in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ja, es geht ja auch nicht darum, dass die Weglänge zu allen Knoten gleich lang ist. Nur wenn es einen Knoten [latex]u[/latex] gibt, müssen alle Wege von [latex]s[/latex] aus die gleiche Länge haben.

Siehe Anhang. Für jedes [latex]u_i[/latex] sind alle möglichen Weglängen ab [latex]s[/latex] gleich.

VG,

Karlito

Karlito hat dieses Bild (verkleinerte Version) angehängt:
graph.png

12.09.2013 16:16 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
deppensido
Doppel-As


Dabei seit: 23.12.2012
Beiträge: 144

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

danke für die Erklärung. Ich habe jetzt mal eine Lösung hingeschrieben:

vor "initalisiere BFS" kommt die Zeile "E'<- {}
hinter die Zeile " color[u] <- schwarz" kommt die Zeile "E' <- E' U (s,u)"
und schließlichlich, nach Ablauf der While-Schleife: "return G' <- (V, E').

Wäre das so schon korrekt? Als Voraussetzung, ist G ja stark zushg., womit jeder Knoten von s aus erreicht wird und somit jeder Knoten im Graph schwarz wird. Somit hat nach Terminierung jeder Knoten u die gleiche Distanz von s nach u. Dies wäre meine Begründung für die Korrektheit. Laufzeit bleibt bei O(|V| + |E|), da die zusätzlichen Operationen konstante Laufzeit haben.

Grüße
12.09.2013 16:40 deppensido ist offline Beiträge von deppensido suchen Nehmen Sie deppensido in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,

entschuldige bitte die späte Antwort. Dein Algorithmus ist falsch. Eines der Probleme ist, dass es keine Variable s für den Startknoten gibt und Du so keine Kante (s,u) zu E' hinzufügen kannst. Ganz Grundlegend würdest Du auch nur Kanten vom Startknoten zu allen Nachfolgeknoten hinzufügen. Wege über andere Knoten fallen komplett weg. Das kann nicht richtig sein.

Ich bin der Meinung, dass der Algo schon das richtige liefert, bis auf eine Bedingung: reflexive Kanten auf den ersten Knoten der Ausgewertet wird. Schauen wir uns den Algo an:
  • Er nimmt sich das Kopfelement einer Warteschlange (Queue) (Z3)
  • Er schaut sich alle Nachfolger des Kopfelementes an (Z4-9)
  • Nur wenn der Nachfolger weiß (unbearbeitet) ist, bekommt er die Farbe grau, ein Zähler wird erhöht und er bekommt das aktuelle Kopfelement der Warteschlange als Vorgägner ([latex]\pi \left[u\right][/latex])
  • Nachdem alle Nachfolger bearbeitet sind, wird das aktuelle Kopfelement aus der Warteschlange entfernt (Dequeue, Z10) und schwarz gefärbt (Z11)


Durch die Bedingung in Zeile 5 wird sicher gestellt, dass nie Rückführende Kanten zu bereits bearbeiteten Knoten betrachtet werden. Diese sind ja schließlich schwarz oder grau.

Soweit ich nichts übersehen habe, muss bei deiner Lösung nur der Schrit 2 geändert werden. Dieser wird gestrichen und hinter die Zeile 8 wird zur Menge der Kanten in E' das Element (u,v) hinzugefügt.

Ein Knackpunkt könnte noch sein, dass wenn in "initialisiere BFS" der erste Knoten nicht grau markiert wird, eine Reflexive Kante auf den ersten Knoten mit in die Menge kommt. Deshalb vorsichtshalber noch nach Zeile 2 color(head[Q])<- grau einfügen.

Ich hoffe ich habe nichts übersehen.

Edit: Zu der initialen Farbe: Wenn eine reflexive Kante exisitiert, kann man beliebig verschieden lange Wege zwischen zwei frei gewählten Knoten s und u wählen. Das sollte der Bedingung, dass die Wege immer gleich lang sein müssen widersprechen.

VG,

Karlito
17.09.2013 08:30 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
deppensido
Doppel-As


Dabei seit: 23.12.2012
Beiträge: 144

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

hallo,

erstmal danke für die Antwort. Also, wenn ich das richtig verstanden habe, kann das mit (s,u) zu E' hinzufügen nicht klappen, weil der Algo s nirgendwo speichert (s ist nur ein Übergabeparameter, der im ersten Durchlauf der while-Schleife das Kopfelement der Queue ist). Wenn ich nun einfach hinter Zeile 8 E'-> E' U (u,v) eingebe, dann wird vom Algo doch der Breitensuchbaum berechnet. Ist der Breitensuchbaum der Schichtgraph? Zu der Initialisierung denke ich, braucht man den ersten Knoten nicht grau färben, denn wenn die adjazenten Knoten von diesem aus besucht werden (erster Durchlauf der While-Schleife), wird dieser schwarz gefärbt und aus der Queue entfernt, womit keine Rückwärtskante zu diesem hinzugefügt werden kann. Was heißt übrigens "reflexive Kante"? Im allgemeinen ist das Hauptproblem bei diesen Aufgaben, dass ich erst gar nicht richtig verstehe, was der Algorithmus mir überhaupt ausgeben soll, hätte hier z.B. gestanden, dass ein Breitensuchbaum ausgegeben werden soll, wäre es sofort klar gewesen (falls es so ist). Danke nochmal.

Grüße
17.09.2013 09:56 deppensido ist offline Beiträge von deppensido suchen Nehmen Sie deppensido in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,

ein normaler Breitensuchbaum beinhaltet soweit ich weiß keine zwei Eltern (siehe Schichtgraph im Anhang). Und laut Definition ist auch ein einfacher Baum ein Schichtgraph. Es besteht keine Bedingung, dass alle in Frage kommenden Kanten in den Schichtgraph aufgenommen werden.

Eine reflexive Kante ist eine, welche Von einem Knoten x zum Knoten x zurückführt. Ein Graph kann auch als Relation aufgefasst werden. Dabei ist [latex]V[/latex] die Menge der Knoten, [latex]E[/latex] die Menge der Kanten und [latex]E\subseteq V \times V[/latex] repräsentiert den Graphen. Eine Kante für den Knoten [latex]x[/latex] ist reflexiv, wenn [latex]x \in V \text{ und } (x,x) \in E[/latex].

Edit: Wenn das Kopfelement also nicht initial grau ist, so wird es ein Nachfolger von sich selbst.

VG,

Karlito
17.09.2013 10:11 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Sorry, anhang vergessen...

Karlito hat dieses Bild (verkleinerte Version) angehängt:
schichtgraph.png

17.09.2013 10:16 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
deppensido
Doppel-As


Dabei seit: 23.12.2012
Beiträge: 144

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

also muss s initial grau gefärbt werden, damit die Kante (s,s) nicht in E' aufgenommen wird?
17.09.2013 10:29 deppensido ist offline Beiträge von deppensido suchen Nehmen Sie deppensido in Ihre Freundesliste auf
deppensido
Doppel-As


Dabei seit: 23.12.2012
Beiträge: 144

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

eine Ausgabe wie im letzten Anhang ist mit unserem Algo glaube nicht möglich, weil der Algo nur Kanten hinzufügt (u,v), bei dem v noch nicht besucht wurde. Damit man also so ein Graph erhält, bei dem ein Knoten zwei Elternknoten hat, müsste man auch die Kanten (u,v) in E' aufnehmen, bei denen v bereits grau ist. Eine Rückwärtskante hätte man ja erst, wenn man (u,v) hinzufügt, bei dem v schon schwarz ist, somit wäre die Ausgabe immer noch ein Baum. Um reflexive Kanten zu vermeiden, würde ich dann zusätzlich vorm hinzufügen der Kante testen, ob u ungleich v gilt. Ist diese Überlegung richtig? Eigentlich eine schöne Aufgabe, um die Breitensuche richtig zu verstehen Augenzwinkern

Grüße

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von deppensido: 17.09.2013 10:51.

17.09.2013 10:49 deppensido ist offline Beiträge von deppensido suchen Nehmen Sie deppensido in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,

das funktioniert glaube nicht, da man so "Seitwärtskanten" innerhalb einer Schicht mit in den Graph aufnimmst. Siehe Anhang

Gruß,

Karlito

Karlito hat dieses Bild (verkleinerte Version) angehängt:
seitwaerts.png

17.09.2013 11:03 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
deppensido
Doppel-As


Dabei seit: 23.12.2012
Beiträge: 144

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

ja das stimmt, danke für das Gegenbeispiel. Jetzt habe ich auch endlich die Definition vom Schichtgraphen richtig verstanden. Fälschlicherweise hatte ich zunächst gedacht, dass alle Wege im Graphen, die von s aus gefunden werden, die gleiche Länge haben müssten. Aber gemeint ist ja, dass wenn es z.B. 2 mögliche Wege von s zu einem Knoten u gibt, müssen diese beiden Wege die gleiche Länge haben. Der Algo fügt nur die Kanten (u,v) zu bei denen v noch nicht besucht ist, d.h. der algo berechnet einen Graphen, bei dem es für jedes u nur einen möglichen Weg von s nach u gibt. Eigentlich ist die Aufgabe dann doch ganz einfach.

Grüße
17.09.2013 11:31 deppensido ist offline Beiträge von deppensido suchen Nehmen Sie deppensido in Ihre Freundesliste auf
Seiten (2): [1] 2 nächste » Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Breitensuchalgorithmus modifizieren