Hallo,
ich belege gerade eine Vorlesung zu effizienten Graphenalgorithmen.
Wir haben zu jedem Algorithmus eine Beschreibung, wie dieser abstrakt funktioniert und zusätzlich eventuelle Implementationshinweise.
Bei vielen Algorithmen steht dabei, dass diese sinnvoll als Iterator (nicht unbedingt im Sinne der Java-Iterator-API) implementiert werden können. Zusätzlich dazu wird empfohlen, dass die Schleife "von außen zugänglich" gemacht werden soll, dass der Aufrufende also zusätzlichen Code dem Algorithmus hinzufügen kann.
Ich denke da an folgendes Beispiel (für denjenigen, der ein wenig Erfahrung mit Graphen-Algorithmen hat):
Der Ford-Fulkerson zum Finden des maximalen Flusses eines Fluss-Netzwerks verwendet intern eine Depth-First-Search. Die Bedingung, dass ein Knoten bei der Depth-First-Search gesehen wird, ist, dass das Ziel der aktuell betrachteten ausgehenden Kante eines Knotens noch nicht gesehen wurde.
Für den Ford-Fulkerson muss aber beispielsweise die Depth-First-Search dahingehend verändert werden, dass ein Knoten nur dann gesehen werden darf, wenn der Fluss auf der Kante noch erhöht werden kann.
Um redundanten Code zu vermeiden, suche ich jetzt nach einer Möglichkeit dem Basis-Algorithmus Depth-First-Search "von außen" also vom Algorithmus Ford-Fulkerson aus die Bedingung hinzuzufügen, dass er einen Knoten nur dann sehen soll, wenn die Kapazität der Kante zwischen den Knoten größer als der Fluss dieser Kante ist.
Momentan implementiert meine Depth-First-Search das Interface Iterator<Node>. Liefert also immer den als nächsten gesehenen Knoten zurück. Ein erster Gedanke von mir war gewesen, die gerade traversierte Kante zurückzuliefern und dann darauf zu entscheiden, ob die Kante tatsächlich traversiert wird. Das funktioniert aber dahingehend nicht, dass der Endknoten dieser Kante ja dann schon auf den Stack gelegt wurde und zwangsläufig behandelt wird. Und jetzt dann noch auf den Stack zuzugreifen und den Knoten wieder vom Stack zu löschen, halte ich auch nicht für die beste Lösung.
Vielleicht habt ihr ja eine Idee,
Naryxus
ich belege gerade eine Vorlesung zu effizienten Graphenalgorithmen.
Wir haben zu jedem Algorithmus eine Beschreibung, wie dieser abstrakt funktioniert und zusätzlich eventuelle Implementationshinweise.
Bei vielen Algorithmen steht dabei, dass diese sinnvoll als Iterator (nicht unbedingt im Sinne der Java-Iterator-API) implementiert werden können. Zusätzlich dazu wird empfohlen, dass die Schleife "von außen zugänglich" gemacht werden soll, dass der Aufrufende also zusätzlichen Code dem Algorithmus hinzufügen kann.
Ich denke da an folgendes Beispiel (für denjenigen, der ein wenig Erfahrung mit Graphen-Algorithmen hat):
Der Ford-Fulkerson zum Finden des maximalen Flusses eines Fluss-Netzwerks verwendet intern eine Depth-First-Search. Die Bedingung, dass ein Knoten bei der Depth-First-Search gesehen wird, ist, dass das Ziel der aktuell betrachteten ausgehenden Kante eines Knotens noch nicht gesehen wurde.
Für den Ford-Fulkerson muss aber beispielsweise die Depth-First-Search dahingehend verändert werden, dass ein Knoten nur dann gesehen werden darf, wenn der Fluss auf der Kante noch erhöht werden kann.
Um redundanten Code zu vermeiden, suche ich jetzt nach einer Möglichkeit dem Basis-Algorithmus Depth-First-Search "von außen" also vom Algorithmus Ford-Fulkerson aus die Bedingung hinzuzufügen, dass er einen Knoten nur dann sehen soll, wenn die Kapazität der Kante zwischen den Knoten größer als der Fluss dieser Kante ist.
Momentan implementiert meine Depth-First-Search das Interface Iterator<Node>. Liefert also immer den als nächsten gesehenen Knoten zurück. Ein erster Gedanke von mir war gewesen, die gerade traversierte Kante zurückzuliefern und dann darauf zu entscheiden, ob die Kante tatsächlich traversiert wird. Das funktioniert aber dahingehend nicht, dass der Endknoten dieser Kante ja dann schon auf den Stack gelegt wurde und zwangsläufig behandelt wird. Und jetzt dann noch auf den Stack zuzugreifen und den Knoten wieder vom Stack zu löschen, halte ich auch nicht für die beste Lösung.
Vielleicht habt ihr ja eine Idee,
Naryxus