Übungsblatt 1, Aufgabe 3: Heuristik für das ”Prize Collecting Steiner Tree Problem” Marco Happenhofer Peter Robinson Leonhard Josef Zehentner October 26, 2004 1 Definitionen V : Menge der Knoten E: Menge der Kanten Vr : Menge der Knoten des reduzierten Graphens Er : Menge der Kanten des reduzierten Graphens d(v): Knotenprofit des Knotens v dc(c): Clusterprofit des Clusters c f (e): Kantenkosten der Kante e f c(i, j): Verbindungskosten zwischen Cluster i und Cluster j 2 Heuristik 2.1 1 2 3 4 5 Clusterbildung Beginne bei beliebigen Knoten P1 mit Für 2 Knoten P1 und Pi, die über Falls min( d(P1), d(Pi) ) > Füge Pi zur Clustermenge Sonst beende Tiefensuche auf Tiefensuche: Kante Ki verbunden sind: f(Ki): von P1 hinzu diesem Pfad Die zu Cluster zusammengefaßten Knoten kann man selbst als Graphen realisieren. Die Aufnahmebedienung zu einen Cluster ( in Zeile 3) ist symmetrisch. Unabhängig von welchen Knoten ausgegangen wird, es wird immer die gleiche Entscheidung getroffen. Als Ergebnis erhält man eine Menge von Clustern. 1 Aufwandsabschätzung: Für einen stark zusammenhängenden Graphen erhält man O(|V |2 ). Begründung: Jede Kante muß geprüft werden, ob der dahinterliegende Knoten schon in einem Cluster ist. Wenn ja, mache gar nichts. Wenn es sich lohnt ihn im eigenen Cluster aufzunehmen, dann markiere den Knoten. 2.2 Fortsetzungsvarianten Im folgenden sind mehrere mögliche Fortsetzungen der Heuristik beschrieben. 2.2.1 MST-Steiner Tree Heuristik auf reduzierten Graphen anwenden Voraussetzung: Es existiert die oben erzeugte Menge von Clustern. Einzelknoten bilden keine Cluster. 1. Erzeuge neuen Graphen, indem die Cluster auf jeweils einen Knoten reduziert werden: (a) Die Kanten dieses Knotens bestehen aus der Vereinigung aller ursprünglichen externen Kanten. (b) Ist eine Kante zu einem externen Knoten zweimal vorhanden, dann nimm die Günstigere. (c) Clusterinterne Kanten werden gelöscht. Aufwandsabschätzung: Für einen stark zusammenhängenden Graphen erhält man O(|V |2 ). Begründung: Während der Phase der Clusterbildung entsteht ein neuer Graph mit maximal O(|V |) Knoten. Für jeden dieser Knoten müssen dessen Kanten (max. O(|V |) mit den Kanten (max. O(|V |)) der bisher in das Cluster aufgenommenen Knoten verglichen und die Vereinigungsmenge gebildet werden. Also max. O(|V |) Kanten mit max. O(|V |) Kanten vergleichen. 2. Anwenden der MST Steiner Tree Heuristik auf den neuen (reduzierten) Graphen: (a) Alle Nicht-Cluster Knoten bilden die Steiner Knoten (b) Alle Cluster Repräsentanten die Terminal Knoten. Aufwandsabschätzung: siehe Vorlesung 2 3. Der entstehende Baum wird noch um jene Blätter (rekursiv) bereinigt, die keinen positiven Beitrag zum Gesamtergebnis leisten. Dazu wird der Algorithmus aus Aufgabe 6 des 1. Übungsblattes verwendet und nacheinander auf den Baum angewandt, wobei jeder Knoten einmal die (fixe) Wurzel des Baumes ist. Aufwandsabschätzung: O(|V |2 ) Gesamtaufwandsabschätzung: Die MST Steiner Heuristik fällt hier am Meisten ins Gewicht: O(|V |(|V |log|V | + |E|)) 2.2.2 MST auf reduzierten Graphen Voraussetzung: Es existiert die oben erzeugte Menge von Clustern. Einzelknoten bilden keine Cluster. 1. Erzeuge reduzierten Graphen wie in Punkt 1.3.1.1 2. Erzeuge den MST zu diesem Graphen 3. Bereinige den Baum wie in 1.3.1.3 Aufwandsabschätzung: Cluster erzeugen: O(|V |2 ) Cluster zusammenziehen: O(|V ||E|) Erzeugen des MST: O(|Er |log|Er |), |Er | ≤ |E| (reduzierter Graph wird wahrscheinlich dünn sein) Bereinigen: O(|Vr |2 ) Gesamtabschätzung: O(|V ||E|) 2.2.3 MST auf Originalgraph abwandern Voraussetzung: Es existiert die oben erzeugte Menge von Clustern. Einzelknoten bilden keine Cluster. Die Cluster werden nicht zu Einzelknoten zusammengefügt. 1. Bilde MST auf dem nicht reduzierten ursprünglichen Graphen 2. Entlang des MST den Graphen abwandern (wie in der Vorlesung beschrieben): (a) Zwischen dem Verlassen eines Clusters und dem Wiedereintritt in einen neuen wird die Distanz berechnet und gemerkt. 3 3. Nach dem ”Abwandern” des gesamten MST (bidirectional double tracing) werden diese Distanzen ausgewertet. 4. Mehrfache Verbindungen zwischen Clustern werden gelöscht - aufgenommen wird nur die Billigste Verbindung pro Clusterpaar. 5. Diese Verbindungen werden nun aufsteigend sortiert. Aufwand: O(|V |log(|V |)) 6. Beginnend mit den kleinsten Verbindungskosten werden die adjazenten Cluster miteinander verbunden, falls die Kosten der Verbindung den Profit des billigeren Clusters nicht überschreiten: min(dc(ci ), dc(cj )) > f c(i, j) (a) Profit des neuen Clusters z: dc(z) = dc(i) + dc(j) − f c(i, j) 7. Am Ende entstehen im allgemeinen mehrere Super Cluster. Der Profitabelste wird als Lösung genommen. Aufwandsabschätzung: Cluster erzeugen: O(|V |2 ) Bilden des MST: O(|V |2 ) Traversieren des MST: O(2|V | − 2) Mehrfachverbindungen zwischen Clustern löschen: O(|V |) Clusterverbindungen sortieren: O(|V |2 log|V |) Cluster verbinden: O(|V |) Gesamtaufwand: O(|V |2 log|V |) 3 Zusammenfassung und Ausblick Die Clusterbildung könnte noch dahingehend erweiter werden, daß nach dem Feststellen der beteiligten Knoten diese einfach mittels MST verbunden werden. Da jeder beteiligte Knoten einen positiven Beitrag leistet, müssen auf jeden Fall alle Knoten enthalten sein und daraus folgt, daß der MST optimal für diesen Teilgraph ist. Mit welchem Clustervereinigungsalgorithmus fortgesetzt wird, hängt davon ab, wie stark der ursprüngliche Graph bereits durch die Clusterbildung reduziert werden konnte. Ist er stark reduziert, wird die MST-Steiner-Tree Heuristik performant sein. Ist er kaum reduziert, dann besteht mit dieser Heuristik die Gefahr, daß zwar alle Cluster verbunden werden, diese aber der Bereinigungsaktion zum Opfer fallen. Bei der dritten Möglichkeit werden diese ”nicht lukrativen” Cluster gar nicht aufgenommen. 4 Ein Test mit Praxisdaten könnte Aufschluß darüber geben, bei welcher Art von Graphen welche Heuristik gut arbeitet. 5