Ein neues Lösungsarchiv für das Generalized Minimum Spanning
Tree-Problem
DIPLOMARBEIT
zur Erlangung des akademischen Grades
Diplom-Ingenieur
im Rahmen des Studiums
Software Engineering/Internet Computing
eingereicht von
Mika Sonnleitner
Matrikelnummer 0225096
an der
Fakultät für Informatik der Technischen Universität Wien
Betreuung
Betreuer: Univ.-Prof. Dr. Günther Raidl Mitwirkung: Univ.-Ass. Dr. Bin Hu
Wien, TT.MM.JJJJ
(Unterschrift Verfasser) (Unterschrift Betreuer)
Technische Universität Wien
Mika Sonnleitner
Hütteldorfer Straÿe 150-158/21/5
1140 Wien
Hiermit erkläreih,dassih diese Arbeitselbständig verfassthabe,dass ih diever-
wendetenQuellenundHilfsmittelvollständigangegebenhabeunddassihdieStellender
Arbeit einshlieÿlih Tabellen, Karten und Abbildungen , die anderen Werken oder
dem Internet im Wortlaut oder dem Sinn nah entnommen sind, auf jeden Fall unter
Angabe derQuelleals Entlehnung kenntlih gemaht habe.
Wien, ?.9.2010
DieseArbeitbehandeltdasGeneralized MinimumSpanning Tree-Problem(GMST),ein
kombinatorishes Optimierungsproblem, das auf dem Mininum Spanning Tree (MST)-
Problembasiert.
Das GMST ist eine Verallgemeinerung des klassishen MST-Problems, das darin
besteht, für einen gegebenen Graphen einen minimalen Spannbaum zu nden. Die Ver-
allgemeinerung besteht darin, dass die Knoten in Cluster partitioniert sind. Für eine
konkreteLösungwirdeinSpannbaumgebildet,derausjedemClustergenaueinenKnoten
verwendet. Während das MST in polynomieller Zeit optimal lösbar ist, ist das GMST
NP-shwierig.
In dieser Arbeit wird ein evolutionärer Algorithmus (EA) verwendet, der ein trie-
basiertesLösungsarhiv,basierendaufzweivershiedenenBetrahtungsweisendesGMST,
verwendet. Die erste Sihtweise besteht darin, die Knoten in den jeweiligen Clustern
festzulegen.DadasverbleibendeProblemdemMSTentsprihtundsomitinpolynomieller
Zeitgelöstwerdenkann,kanneineLösungdurhdieAngabederKnotenspeziziertwer-
den.Die zweite Vorgehensweise ist dann,dieglobalenVerbindungen zwishen den Clus-
tern festzulegen. Auh hier kann dasverbleibende Problem inpolynomieller Zeit gelöst
werden, und zwar mittelsdynamisherProgrammierung.
In einem Lösungsarhiv können Lösungen gespeihert werden, um einerseits Dup-
likatezuerkennen,umsieniht einweiteres Malbearbeitenzumüssen,undandererseits
eine neue, noh niht durhsuhte Lösung zu bekommen. Daein Lösungsarhiv für die
erste Sihtweise bereitsimplementiertwurde,wurde in dieserArbeiteines fürdiezweite
entworfen. Dieses Lösungsarhiv basiert auf der Sihtweise, die globalen Verbindungen
festzulegen. Es werden zwei vershiedene Darstellungsarten von Spannbäumen verwen-
det, die diese globalen Kanten repräsentieren, nämlih die Darstellung der Predeessor
sowie Prüfernummern. Auÿerdem wurden die beiden Arhive kombiniert, um bessere
Ergebnisse alsmit einem alleine zuerhalten.
Wie die Tests gezeigt haben, konnten mit dem neuen Arhiv bessere Lösungen im
VergleihzumEAgefundenwerden.MitderVerwendungbeiderArhivenohbessereLö-
sungengefundenwerden,wobeidieseVersioneinengröÿerenSpeiherverbrauhaufweist.
This thesis deals with the Generalized Minimum Spanning Tree Problem (GMST), a
ombinatorial optimizationproblembasedontheMinimumSpanningTree(MST)Prob-
lem.
The GMST isa generalization of thelassi MSTProblemwhih onsistsinnding
a minimum spanning tree for a given graph. The generalization onsists inpartionizing
thenodes inlusters. In order to obtain a onrete solution, a spanning tree is formed,
whihspansexatlyonenodefromeahluster.WhiletheMSTissolvableinpolynomial
time,the GMSTis NP-hard.
In this thesis, an evolutionary algorithm (EA) is used whih is omplemented by
a trie-based solution arhive using two dierent views of the GMST. The rst view is
onerned with seleting the node for eah luster. As the remaining problem equals
to the MST, the solution an be enoded by speifying the nodes. The seond view is
onerned withspeifyingtheglobaledges between thelusters.Theremainingproblem
an be solved usingdynami programming.
Using a solution arhive, it is possible to store solutions generated by the EA in
ordertodetet dupliates andfurthermoreto onvertsuhdupliates intonewsolutions
whih have not yet been examined. As a solution arhive for the rst view mentioned
hasalreadybeen implemented,this thesisisonernedwithdesigningan arhive forthe
seondview.Thissolution arhiveis basedonthe view to speifytheglobal edges. Two
dierentenodingsofspanningtreesareusedwhihrepresenttheseglobaledges,namely
thePredeessor-enodingandthePrüfer-enoding.Furthermorebotharhiveshavebeen
ombined to improve the obtainedsolutions.
Astestshaveshown,usingthearhiveimprovesthequalityofthesolutionsompared
to the pure EA. Using both arhives ombined, even better results an be obtained at
theexpense ofa highermemory usage.
Erklärung . . . i
Kurzfassung . . . ii
Abstrat . . . iii
Inhaltsverzeihnis iv 1 Einführung 1 1.1 Das MinimumSpanningTree-Problem . . . 1
1.2 Das GeneralizedMinimumSpanning Tree-Problem . . . 1
1.3 Bisherige Arbeit . . . 2
1.4 Heuristishe Optimierungsverfahren . . . 3
1.5 Evolutionäre Algorithmen . . . 3
1.6 Lösungsarhiv . . . 4
1.7 Tries . . . 4
2 Ablauf des Algorithmus 6 2.1 Zwei Lösungskodierungen fürdasGMST-Problem . . . 6
2.2 Aufbau desEAs. . . 7
2.3 Repräsentierung von Lösungen . . . 8
2.4 Die OperationendesEvolutionären Algorithmus. . . 9
2.5 Die Pop-Optimierung. . . 11
2.6 LokaleVerbesserung . . . 11
2.7 Der Trieals Datenstruktur für dasLösungsarhiv . . . 12
2.8 Kodierung desGhosh-Tries . . . 13
2.9 Kodierung desPop-Tries . . . 13
2.10 Die OperationendesTries . . . 16
2.11 Die Operationenfür diePrüfer-Darstellung . . . 24
2.12 Kombinierung derbeiden Sihtweisen . . . 26
2.13 Implementierung . . . 28
3 Tests und Ergebnisse 29 3.1 Methodik . . . 29
3.2 Konvertierung von untenund randomisierte Konvertierung . . . 30
3.3 Zusammenspiel von Pop- undGhosh-Trie . . . 31
3.5 Andere Optionen . . . 31
3.6 Die verwendeten Kongurationen . . . 35
3.7 Ergebnisse für die vershiedenen Varianten mit xer Anzahlvon Genera- tionen . . . 35
3.8 Ergebnisse für dievershiedenen Variantenmit xer Laufzeit . . . 38
3.9 Gelöshte Knoten im Trie . . . 39
3.10 Anzahl derKonvertierungen imPredeessor-Trie . . . 39
3.11 Anzahl derKonvertierungen fürden Prüfer-Trie . . . 41
3.12 Test mit längererLaufzeit . . . 42
4 Zusammenfassung 46
Literaturverzeihnis 47
1
Einführung
1.1 Das Minimum Spanning Tree-Problem
DasMinimumSpanningTree-Problem(MST)isteinbekanntesProbleminderGraphen-
theorie.Esistwiefolgtdeniert[Lei06 ℄:Gegebenseieingewihteter,vollständigerGraph
G = (V, E, c)
mitKnotenmengeV
,KantenmengeE
andderKostenfunktionc : E → R +
.Dann ist ein Minimum Spanning Tree ein Subgraph von
G
, also ein Baum, der alleKnoten des Graphen beinhaltet und dessen Kosten minimal sind:
S = (V, T ), C(T ) = P
c(u,v)∈T c(u, v)
Dabei sind die Kosten als Summe der Gewihte der Kanten deniert.DasMSTistinpolynomiellerZeitlösbar,zumBeispielmitdemAlgorithmusvonKruskal
[OW02 ℄.
1.2 Das Generalized Minimum Spanning Tree-Problem
AlsVerallgemeinerungdesMSTwurdedasGeneralizedMinimumSpanningTree-Problem
(GMST) deniert. Dabei werden die Knoten V aus dem MST in Cluster partitioniert.
Für eine Lösung des GMST wird aus jedem Cluster ein konkreter Knoten zu einem
Spannbaumverbunden.SomitkanndasGMSTwiefolgtdeniertwerden[Lei06 ℄:Gegeben
seieingewihteter,vollständigerGraph
G = (V, E, c)
.DieserGraphistdanninnClusterunterteilt, die jeweilsdisjunkte Teilmengen der Knoten desGraphenssind:
V 0 , V 1 , ..., V n
mit
V i ⊂ V
, sodassV i ∩ V j = ∅ ∀i, j, i 6= j
. Eine gültige Lösung ist dann ein Subgraphvon
G
,S = (P, T )
, mitP = {p 1 , p 2 , ..., p n } ⊂ V p i ∈ V i ∀i = 1, ..., r
, sodass aus je-demCluster
V
genaueinKnotenverbundenwird.DerSpannbaumbestehtdannausderKantenmenge
T ⊆ P × P ⊂ E
Die Bewertung bzw. die Kosten ergibt sih dann ausder Summe der Werte derKanten, also
C(T ) = P
c(u,v)∈T c(u, v)
Die optimale Lösungfür dieses Problem ist dann ein solher Spannbaum
S = (P, T )
, dessen KostenC(T )
minimalsind. EineIllustration desMSTund desGMST istinAbbildung 1.1zu nden.
1.3 Bisherige Arbeit
Das GMST-Problem wurde 1995 von Myung, Lee, and Tha [MLT95℄ deniert. Dabei
haben sie auh gezeigt, dass es NP-shwierig ist und eine mathematishe Denition
angegeben. Pop [Pop05℄hat einerseits Spezialfälle angegeben,unter denen dasProblem
polynomielllösbarist,undandererseitseinigeBeispieleangeführt,fürdiedasProblemin
derPraxisverwendetwerdenkann.AlsBeispielführterdieVerbindungvonlokalenNetz-
werkenan,beidenen eineStation alsHubverwendet wird.Auÿerdemhat erdesGMST
inzweiTeilproblemeaufgeteilt.ErhatdenAnsatzgewählt, dieglobalenKantenfestzule-
gen.AuÿerdemhaterseinenAnsatzdannineinemAlgorithmusmitSimulatedAnnealing
verwendet.Ghosh [Gho03℄ hatdasVerfahrenentwikelt,für jedenCluster einenKnoten
festzulegen,derdanndieKnotenmengefürdenSpannbaumbildet.NahdieserBelegung
kann für beide Verfahren die optimale Lösung für das verbleibende Problem eindeutig
bestimmt werden. Daherkönnen Lösungen fürdasProblemmitderAngabe derKnoten
bzw.derglobalenKantenkodiert werden.DadieseArbeitaufdiesen Verfahren aufbaut,
werden sie im Abshnitt 2.1 genauer dargestellt. Hu, Leitner und Raidl [HLR08 ℄haben
denAnsatzderVariableNeighborhoodSearhmitNahbarshaften,dieaufdiesenbeiden
Darstellungen aufbauen,verwendet undsind zugutenResultaten gekommen.
Wolf[Wol09 ℄ hatinseinerArbeiteinenEAzurLösungdesGMST verwendet,dener
umeinLösungsarhiverweiterthat.DafürhaterdenTriealsgeeigneteDatenstrukturfür
dasSpeihernundGenerierenvonneuenLösungeneingesetzt.NahdemdieLösungenin
derKodierung nah denKnotengespeihertwerden, wurdeauhder Triemit diesenLö-
sungenbefüllt.Grundsätzlih ist ersoauhzu gutenErgebnissen gekommen, allerdings
wurde in demAlgorithmus auh ein Verfahren zurOptimierung nah dem Pop-Shema
inkludiert. Gemäÿseinen Tests ergänzen sih derTrie unddiese Optimierung niht gut,
sondern der Trie erzielt mit dieser Optimierung teilweise sogar shlehtere Lösungen.
Daher shlug er als möglihe weiterführende Arbeit vor, auh ein Arhiv auh für Lö-
sungen, dienah den globalen Kantenkodiert sind, zu entwikeln, und diese dann nah
Möglihkeit zukombinieren, wasdasThemadervorliegenden Arbeit ist.
Daes für viele shwierigeProbleme derInformatik niht möglih ist, einen exakten Al-
gorithmus zunden,derdasProblemfürgröÿereInstanzeninakzeptablerZeitlöst,sind
vershiedenste heuristishe Verfahren vorgeshlagen worden, um Lösungen von akzept-
ablerGütezunden.Ein grundlegendesVerfahrenistdasderlokalenSuhe,d.h.eswird
versuht, für ein Problem bzw. eine Lösung eine Nahbarshaft zu denieren, diese zu
durhsuhen und die Lösung mit dem besten Wert zu übernehmen. Eine solhe Nah-
barshaftbestehtausausLösungen,diemiteinerdenierten(geringfügigen)Änderungan
derUrsprungslösungzuerreihensind.DiesemüssenandasjeweiligeOptimierungsprob-
lem angepasst werden. Da dieses Verfahren zu einem lokalen Optimum führt, aber in
der Regel niht zu einem globalen, sind diverse Metaheuristiken erdaht wurden, mit
denen diese überwunden werden sollen. Eine Metaheuristik ist ein allgemeines, vom
konkreten Optimierungsproblem unabhängiges Verfahren, das deniert, welhe Vorge-
hensweise grundsätzlih verwendet wird. Es werden abstrakte Operatoren deniert, die
dannandaskonkreteProblemangepasstwerdenmüssen.BeispieledafürsindSimulated
Annealing, dieTabusuhe odereben derindervorliegenden Arbeit verwendeten Evolu-
tionäreAlgorithmus.Oftmalsistesnihtmöglih,Gütegarantienabzugeben,wiegutdie
Lösungapproximiertwerdenkann.DennohwurdeninderPraxisguteResultateerzielt.
1.5 Evolutionäre Algorithmen
Grundsätzlih wird versuht, die natürlihe Evolution bzw. die Erkenntnisse der Evo-
lutionstheorie mit ihren Mehanismen zu modellieren. Es werden jedoh meist nur die
grundlegenden Konzepte wie das Vorhandensein einer Population von Lösungen sowie
Selektion,Mutation und Rekombination verwendet.
IneinemEvolutionärenAlgorithmus(EA)bzw.einemGenetishenAlgorithmus[SP94 ℄
gibtes,wiebeieinigenanderenheuristishenOptimierungsverfahren,einePopulationvon
Lösungen für das Problem. Die kodierte Lösung wird als Genotyp bezeihnet, einzelne
Teile als Gene. Eine solhe Lösung kann etwa als Bitstring kodiert werden. Da die Be-
wertung des Genotyps oft niht direkt aus der Darstellung berehnet werden kann, ist
eine Dekodierung erforderlih. Diese dekodierte Lösung wird dann als Phänotyp beze-
ihnet. Dann wird eine Fitnessfunktion deniert, die den Lösungen einen Wert zuord-
net. Bei einem Minimierungsproblem wie dem GMST-Problem haben somit Individuen
mit einem kleineren Funktionswert einehöhere Fitness. Mittels der Mutation wirdana-
log zum biologishen Vorbild neues genetishes Material erzeugt. Dieses soll der Über-
windung von lokalen Optima dienen. Bei der Mutation wird also eine Lösung zufällig
verändert.Die MutationwirdinderRegel nur miteiner gewissen(kleinen)Wahrshein-
lihkeit aufgerufen, da derAlgorithmus andernfalls zu einer Zufallssuhe werdenwürde.
Die Rekombination dient dazu, aus zwei Elternlösungen Kindslösungen zu generieren,
diemöglihstvielgenetishesMaterial übernehmen sollen. Es wirdsomit versuht, zwei
Lösungen zueiner neuen zu vershmelzen. DieSelektion dient dazu,ausderPopulation
Lösungen auszuwählen, die überleben, indem sie in die nähste Generation des Algo-
Lösungen mit einem besseren Wert haben eine höhere Chane, selektiert zu werden.
Da die prinzipielle Funktionsweise des evolutionären Algorithmus sehr allgemein sind,
müssen die Operatoren an das spezishe Problem angepasst werden, um gute Ergeb-
nissezuliefern.Dabeiistesoftshwierig,geeigneteRekombinationsoperatoren zunden,
dieeinerseits beideElternlösungenberüksihtigen undandererseitsdieQualität derLö-
sungenbewahrenkönnen.IneingeshränktemSinngiltdasauhfürMutationoperatoren.
Ineinem sogenanntenSteady-State-EA,wie erindieserArbeitverwendetwird,wird
proGenerationnureineLösungdurheineneueersetzt.Dagegenwirdineinemsogenan-
nten generationellen EA in jeder Generation die Ausgangspopulation ersetzt, was eher
dembiologishem Vorbild entspriht.
1.6 Lösungsarhiv
EinLösungsarhivwirddazuverwendet,Lösungen,dievoneinemheuristishenAlgorith-
musgeneriertwerden,zuspeihern,umderenBewertungnihtmehralseinmalberehnen
zumüssen.DadessenBerehnung ausdemGenotypen oftrehtaufwendigist,kannsih
derzusätzliheAufwandfür dasSpeihernund Suhen derLösungenrentieren. Einwei-
teres Ziel,das auh im Rahmen dieser Arbeit verfolgt wirdist, die Lösungen niht nur
zu speihern, sondern auh durh dasModiziereneines Duplikatseine neue Lösung zu
bekommen,dienohnihtuntersuhtwurde.DiesesVerfahrenwurdebereitsvonZaubzer
[Zau08 ℄, ramko [Sra09 ℄ und Wolf [Wol09℄für vershiedene Optimierungsprobleme ver-
wendet. Grundsätzlih sind dafür vershiedene Datenstrukturen, wie eine Hashtabelle,
Bäume oder Tries denkbar. Zaubzer [Zau08 ℄ und ramko haben diese Datenstrukturen
analysiert und haben den Trie für die am besten geeignete befunden. Eine Hashtabelle
kann zwar Lösungen speihern und es kann in
O(l)
,(wobeil
die Länge des Stringsist)festgestellt werden, ob eine Lösung bereits enthalten ist, jedoh ist es niht möglih,
shnell eine Ersatzlösung zu nden, da dies im shlehtesten Fall
2 l
Shritte brauhenkann.Ein binärer Baum könnte dierelevantenOperationenzwarin
O(l ∗ log(n))
(wobein
die Anzahl der Knoten im Baum ist) durhführen, jedoh muss jede Lösung extrain einem eigenen Knoten gespeihert werden, was einen hohen Speiherverbrauh verur-saht. Daher ist es eine bessere Lösung, einen Trie zu verwenden, der die Operationen
in
O(l)
durhführen kann. Da diese Analyse für binäre Tries durhgeführt wurde, und wie inder Arbeitvon Wolf[Wol09 ℄ indervorliegenden Arbeitein anders strukturierterTrie verwendet wird, dessen Speiherverbrauh deutlih höher ist, muss dies gesondert
betrahtet werden. Inwieweit dies ein Problem darstellt, wird in der Beshreibung des
Tries und den Tests analysiert.
1.7 Tries
Ein Trie ist eine Datenstruktur,in derWörter gespeihert und gesuht werden können.
SomitstellensieeineLösungfürdasWörterbuhproblemdar.FürdasvorliegendeProb-
lem ist es jedoh niht erforderlih, Wörter wieder zu entfernen, da das Lösungsarhiv
diese Funktionalität niht benötigt. Im Vergleih etwa zu einem binären Baum werden
die Lösungen im Trie niht in den Knoten gespeihert, sondern in den Kanten. Dabei
wirdjederKanteeinBuhstabezugeordnet,währenddieKnotengrundsätzlihkeineLö-
sungenspeihern.DieLösungwirdKonkatenationderjeweiligenBuhstabenderKanten
auf dem Weg von der Wurzel zur Lösung berehnet. Es ist allerdings erforderlih, das
Ende derZeihenfolgen inden Knoten zumarkieren.
Im Indexed Trie können grundsätzlih beliebig lange Wörter übereinem gegebenen
Alphabet
A
deniert werden. Für jeden Knoten in dem Trie gilt, dass sie denselbenPräx teilen. Ein Knoten enthält die Information, ob bzw. welhe Wörter mit welhem
Buhstaben an diesem Knoten enden, d.h.
|A|
Boolshe Variablen. Dieser ist in Abbil-dung 1.2 als end bezeihnet, konkrete Wörter sind mit E markiert. Auÿerdem gibt es
die Referenzen auf potenziell
|A|
weitere Knoten, wobei der Knoten dem Präx einenweiterenBuhstaben hinzufügt.InderAbbildung wirddiesesalsnext bezeihnet,wobei
Buhstaben,diezu weiterenKnoten führenmit X markiertsind.
2
Ablauf des Algorithmus
2.1 Zwei Lösungskodierungen für das GMST-Problem
Im Zusammenhang mit demGMST-Problem und dervorliegenden Arbeit sinddie zwei
Vorgehensweisen von grundlegender Bedeutung.Sie gehenauf dieAutoren Pop [Pop02℄
undGhosh [Gho03 ℄ zurük, diediese verwendethaben.
Die Lösungskodierung nah Ghosh
Ghosh hat die Vorgangsweise deniert, die Knoten in den Cluster festzulegen. Für die
Lösung
S
,denSubgraphenvonG
,S = (P, T )
werdenalsodieKnotenP = {p 1 , p 2 , ..., p n }
festgelegt. Nah diesem Shritt ist die Lösung für das Problem, aus diesen Knoten die
optimaleLösungzunden,alsodieKantenmenge
T
zubestimmen,gleihdemklassishenMST,dasleihtgelöstwerdenkann.ImKontextdesEAwirdsomitderGenotypdeniert,
d.h. dieLösungen werden auf diese Weise odiert.Dieskann dann etwa ineinem Array
erfolgen,dasfür jeden Cluster denauswählten Knoten speihert. Nahdemdieoptimale
Lösung für diese Knotenbelegung einfah berehnet werden kann, reiht dies für die
eindeutigeBeshreibungderLösungaus.DieserAnsatzwirdinAbbildung2.1illustriert.
Abbildung 2.1: DerAnsatz nah Pop. Mittels dergegebenen Knoten kann die optimale
AuswahlderKantenberehnet werden.
optimale AuswahlderKnoten berehnetwerden.
Die Lösungskodierung nah Pop
ImGegensatzdazuhatPopdieumgekehrteVorgehensweisedeniert,nämlihdieKanten
zwishen denClustern festzulegen,undnahdieserFestlegung dieoptimaleKnotenbele-
gung innerhalb der Cluster zu berehnen. Genauer ausgedrükt, wird ein sogenannter
globaler Graph deniert [Lei06 ℄, dessen Knoten die Cluster des ursprünglihen Prob-
lems sind:
G g = (V g , E g )
undV g = {V 1 , V 2 , ..., V n }
. Die Kantenmenge entspriht den VerbindungenzwishendenKnoten:E g = V g ×V g
DieseKantenwerdenauhalsglobaleKantenbezeihnet.Der Graphist vollständig, d.h.esgibt zwishen jeweilszweiKnoten
immer eine Kante. Auf diesem globalen Graphen wird dann der globale Spannbaum
deniert:
S g = (V g , T g )
mitT g ⊆ E g
.DieserSpannbaumrepräsentiertalleLösungenfür dasursprünglihe GMST-Problem,fürdiegilt,dasssiefürjedeKante(V a , V b ) ∈ T g
eineKante
(u, v) ∈ E
undu ∈ V a ∧ v ∈ V b ∧ a 6= b
.Wenn die globalenKanten festgelegt ist,istdieoptimaleKnotenbelegung desursprünglihenGraphen
P
für dieseneindeutigundkannmittelsdynamisherProgrammierungezient berehnetwerden.InderTerminolo-
gie des EA wird somit der Phänotyp berehnet. Analog zur ersten Darstellung können
LösungenmittelsdiesesglobalenSpannbaums
T g
kodiertwerden,dadieoptimaleLösungbereits eindeutigberehenbar ist.Diese Kodierung wirdinAbbildung 2.2 illustriert.
Zur einfaheren Benennung wirddas Verfahren,die Knoten in den Cluster festzule-
gen bzw. die dazugehörige Codierung in weiterer Folge Ghosh-Verfahren bzw. Ghosh-
Kodierung oder Ghosh-Darstellung genannt, das Verfahren, die Kanten zwishen den
Clusternfestzulegen,hingegenPop-Verfahrenbzw.Pop-KodierungoderPop-Darstellung.
DasLösungsarhiv wirddannebenfallsGhosh-Arhiv bzw. Pop-Arhiv genannt.
2.2 Aufbau des EAs
Es wird ein steady-state-EA verwendet, der um die Funktionalität des Lösungsarhivs
ergänztwird.DessengrundsätzliherAblaufistinAlgorithmus1zunden.DieAufgabe
dervorliegendenArbeitistes,einLösungsarhivaufBasisderPop-Darstellungzuimple-
mentieren. Darüberhinaus wurde dasaufderGhosh-Darstellungbasierende Arhiv von
Wolf[Wol09 ℄übernommen, sodassderAlgorithmus sowohlnurmitdemPop-Arhiv,als
auh mit beiden laufen kann.Er hat auh eine Variantemit mehreren Tries implemen-
tiert. IndieserArbeit wirdaberausshlieÿlih dieVariante miteinem Trieverwendet.
1: Generierezufällige Population
pop
und füge sieinArhiv ein2: whileSolangeAbbruhbedingung niht erfüllt do
3:
elternteil1
<- selektion(pop
)4:
elternteil2
<- selektion(pop
)5:
sol neu
<-rekombination(elternteil1
,elternteil2
)6: mutation(
sol neu
)7: lokaleVerbesserung(
sol neu
)8:
9: if
sol neu
inArhiv enthalten then10: wandle
sol neu
zu neuerLösungum11: end if
12: Füge
sol neu
inArhiv ein13: Ersetzeeine Lösungin
pop
durhsol neu
14: endwhile
2.3 Repräsentierung von Lösungen
GrundsätzliharbeitetderAlgorithmus aufBasis der Ghosh-Kodierung,d.h. dieLösun-
genwerdenindieserKodierunggespeihert.DieLösungwird,wiebeshrieben,durhdie
Knotenmenge
P = {p 1 , p 2 , ..., p n }
deniert. Daes keineungültigen Lösungen gibt, kanndieseMengeeinfahmiteinemArraybzw.Vektorkodiertwerden.DieOperatorenaufBa-
sisderGhosh-DarstellungbasierensomitaufdieserKodierung.DerzweiteAnsatzbasiert
aufderPop-Darstellung:Eswerdensomitdieglobalen Kanten
T g
zwishendenClusternkodiert. Hierfür wird die sogenannte Predeessor-Darstellung verwendet. Konkret wird
dafürzunähsteinWurzellusterfestgelegt.DaessihumeinenSpannbaumhandelt,gibt
esfür jeden Cluster genau einenWeg zumWurzelknoten. Der Vorgänger eines Clusters
istdann jener,mit demeraufdiesemWegdirektverbundenist.DieseLösungsrepräsen-
tierungkannmittelseinesVektorserfolgen,derVorgängerdes
n
-tenClusterswirdindemVektor auf Position
n
gespeihert. Dies wird in Abbildung 2.3 illustriert. Ein Nahteil dieser Kodierung ist, dass niht jeder möglihe Kodierung einen gültigen Spannbaumbeshreibt.Daher istesbeiden Funktionen, dieeineLösungauf BasisdieserCodierung
veränderen, notwendig zu beahten, dass sie nur Spannbäume generieren. Da der EA
interndieGhosh-Darstellungverwendet, istesnotwendig, vor derVerwendung derPop-
Operatorenbzw. des entsprehenden Arhivsdie Lösungindie Predeessor-Darstellung
zutransformieren.DanahmussdieLösungwiederzurüktransformiertwerden. Eswird
auÿerdem die sogenannte Prüfer-Codierung verwendet, die aberniht für den EA oder
die Optimierung selber verwendet wird, sondern ausshlieÿlih für die Speiherung der
LösungenimTrie.AuhhiermüssendieLösungenvonderPredeessor-Darstellungindie
Prüfer-Darstellung transformiert werden. Diese Algorithmen werden im Abshnitt 2.10
dargestellt.
Abbildung 2.3: Die Predeessor-Kodierung.
V 1
ist derWurzelluster2.4 Die Operationen des Evolutionären Algorithmus
Damit beide Darstellungen in allen Bereihen des Algorithmus verwendet werden, wer-
den für beide Darstellungen - die Repräsentation der Knoten der Cluster als auh über
globale Kanten - eigene Rekombinations- und Mutationsoperatoren verwendet. Grund-
sätzlih wird bei jedem Aufruf zufällig eine der beiden Varianten ausgewählt. Es kann
aber über einen Parameter gesteuert werden, ob welhe Operatoren verwendet werden
sollen - entweder nur die Ghosh-Operatoren, nur die Pop-Operatoren oder bei jedem
Aufrufzufälligeine derVarianten.
Für dieSelektion wirdTournament Seletionverwendet, d.h. eswerdenzufällig eine
bestimmteAnzahlvonLösungenausgewählt,unddiebesteausdiesenwirddanntatsäh-
lih ausgewählt. In dieser Arbeit wird die Standardeinstellung von EALIB (siehe 2.13)
verwendet: Es werdenzweiLösungen ausgewählt, unddie besseredavon selektiert.
Die Operationen für die Ghosh-Darstellung
DaesbeidieserDarstellung keineAbhängigkeiten gibt, können einfaheOperatoren für
Arrays verwendetwerden.
DieRekombinationerfolgtsomitmitUniformCrossover, d.h.dassfür jedesFelddesAr-
rayszufällig derWerteiner derbeiden Elternlösungenübernommenwird.Gegeben sind
also zwei Lösungen in der Ghosh-Darstellung:
P = {p 1 , p 2 , ..., p n } Q = {q 1 , q 2 , ..., q n }
.Dann wird die neue Lösung
R
wie folgt generiert:∀i : r i
wird zufällig, also mit jeweilsWahrsheinlihkeit
p = 0, 5
ausderMenge{p i , q i }
ausgewählt. Die Rekombination wird in2.4illustriert.Bei der Mutation wird hingegen ein zufällig gewähltes Feld des Arrays verändert.
In der Lösung
P = {p 1 , p 2 , ..., p n }
wird somit ein Element zufällig, also jeweils mitWahrsheinlihkeit
p = n 1 p i
ausgewählt.DieserKnotenistElementeinesClustersp i ∈ V i
.Dieser Knoten wird dann zufällig (
p = |V 1 ∗
i |
) durh ein anderes Element des Clustersersetzt, d.h. ausderMenge
V i ∗ = V i \{p i }
.Die Operationen für die Predeessor-Darstellung
DadieseCodierungdieLösungenalsSpannbäumedarstellt,unddieseinderPredeessor-
Darstellung vorliegen, muss darauf geahtet werden, dass keine ungültigen Lösungen
erzeugt werden. Die Operatoren wurden aus der Arbeit von Raidl und Drexel [RD00℄
übernommen, indersiedieOperatorenfüreinähnlihesProblem,dasCapaitatedMin-
imumSpanningTreeProblem,denieren.DieseOperatorenkönnenanalogfürdasGMST
verwendet werden, es muss nur die zusätzlihe Überprüfung, ob die Kapazitäten niht
übershrittenwerden, entfernt werden.
Die Rekombination wird wie folgt durhgeführt: Ausgehend von den beiden Eltern-
lösungen,werdendieKanten,diebeibeidenidentishist,alsobeidenen derPredeessor
für den jeweiligen Cluster derselbe ist, auf jeden Fall indie Kindslösung übernommen.
Sindsienihtidentish,sowirdzufälligderWerteinerder Elternlösungenübernommen,
wenn sih dabei kein Zyklus ergibt. Die Einhaltung dieser Bedingung wird mit einer
Union-Find-Datenstruktur überprüft. Würde ein Zyklus entstehen, so wird die andere
Lösungverwendet. Istauhdiesnihtmöglih,sowirdderCluster ineineListevonnoh
niht bearbeiteten Clustern gespeihert. Die Cluster, die übrig geblieben sind, werden
dann einezufällige Stelleim Baumgehängt.
Die Mutation wird hingegen wie folgt ausgeführt: Es wird zufällig ein Cluster im
Spannbaum ausgewählt, dessen Vorgänger verändert werden soll. Kandidaten für den
neuen Vorgängersinddann alle Cluster,dessen direkteroderindirekterVorgänger niht
derClusterist,dessenVorgängerverändertwerdensoll,dadadurheinZyklusentstehen
würde.Die Mutation wirdinAbbildung 2.5illustriert.
2.5 Die Pop-Optimierung
Die Pop-Optimierung [Wol09 ℄ besteht darin, für eine gegebene Lösung in der Ghosh-
DarstellungdieKantenzwishen denClustern zuverwenden undfür diese Kantendann
mittelsdynamisher Programmierung dieoptimalen Knoten zuberehnen. Bei derVer-
wendung eines Pop-Tries wird diese auh implizit verwendet, da die Lösungen ohnehin
zwishen der Ghosh-Darstellung und der Predeessor-Kodierung umgewandelt werden
müssen. Es ist also niht erforderlih, diese dann explizit aufzurufen. Die Optimierung
ist alsonur danneine sinnvolle Option, wenn keinPop-Arhiv verwendet wird.
2.6 Lokale Verbesserung
AuhbeiderlokalenVerbesserungwerdenwiedervershiedeneNahbarshaftsstrukturen
benutzt,dieaufdenbeidenDarstellungsartenbasieren.DieDenitionwurdeausderAr-
beit von Leitner übernommen [Lei06 ℄. Eine Nahbarshaftsstruktur ist eine Funktion,
diejederLösungeineMengevonLösungenzuweist,diedieNahbarshaftbilden.Formal
also eine Funktion
N : X → 2 X
, der jeder Lösungx ∈ X
eine Menge von NahbarnN (X) ⊆ X
zuweist.AnalogzurGhosh-Darstellungwird eineGhosh-Nahbarshaft bzw.Node Exhange Neighborhood (NEN) [Gho03 ℄ verwendet, die darin besteht, in einem
Cluster einen Knoten verändern. Für eine Lösung
P = {p 1 , p 2 , ..., p n }
, wobeip i
derKnoten ist,derausCluster
V i
verbundenwirddieNahbarshaft wie folgtdeniert: Sie besteht aus allen Vektoren, die dadurh erreiht werden können, dass in einem ClusterV i
genau ein Knotenp i
durh einen Knoten ausdemselben Cluster ersetzt wird. Auÿer-demwirdnoheinezweite,gröÿereGhosh-Nahbarshaft,diedarinbesteht,jeweilseinen
durhsuht, d.h. eswirdein Zeitlimit verwendet, und diebisdahin beste Lösung, diein
dieserNahbarshaftgefundenwerdenkonnte,übernommen.AnalogzurPop-Darstellung
wird eine ursprünglih von Pop denierte Nahbarshaft [Pop02℄ verwendet, die darin
besteht, den globalen Graphen
T g
zu verändern. Zu dieser Nahbarshaft gehören alle gültigenSpannbäume, diesih ingenau einer Kante von der ursprünglihen Lösungun-tersheiden. Umden AufwandineinemvertretbarenAusmaÿ zuhalten,wirddieBewer-
tung für diese Lösungen inkrementell [Lei06 ℄ berehnet. Die beiden Optimierungsarten
werden grundsätzlihnaheinander aufgerufen, bis keineVerbesserungmehr erzielt wer-
denkann.AlternativdazukannauhnurentwederdieVerbesserungbasierendaufGhosh
bzw. Pop verwendetwerden, wasübereinen Parameter eingestellt werden kann.
2.7 Der Trie als Datenstruktur für das Lösungsarhiv
Indervorliegenden ArbeitwerdenimmerInteger-VektorenimTriegespeihert.Dadiese
immer dieselbe Länge haben, können Lösungen grundsätzlih nur in den Blättern des
Tries markiert werden. Wenn eine Lösungkodierung aus
n
Integern besteht, so habendieTrieknotenindenersten
n
-1Ebenen lediglihReferenzen aufweitereTrieknoten,dieLösungenwerdendanninder
n
-tenEbene durhmitderMarkierungVollständig gespei- hert.Daheristesnihtnötig,ineinemKnotenfüreinengegebenBuhstabensowohleineLösungalsoauheineReferenzaufweitereKnotenzuspeihern.AufgrundderFunktion,
vollständig besuhte Knoten zu löshen und sie durh die Markierung Vollständig zu
ersetzen, können dieWörter aberinAusnahmefällen dennohuntershiedlih langsein.
Dies ist aber kein Problem, da in diesem Fall keine Referenz auf einen Unterknoten
erforderlihsind,daalleLösungen,diedurhsoeinenKnotenbeshriebenwerden,bereits
besuht wurden und dies mit der Markierung Vollständig kodiert wird. Die Funktion
zum Löshen von vollständigen Knoten wird inder Darstellung der Einfügen-Funktion
beshrieben. Ein solher Trie wirdinAbbildung 2.6illustriert.
Möglihe Zustände der Referenzen
Eine Referenz, also der Nahfolger dieser Knoten, kann grundsätzlih drei Zustände
haben. Der Zustand Null bedeutet, dass noh keine Lösung mit dem entsprehenden
Vorgänger aufgenommen wurde. Der Zustand Vollständig bedeutet dagegen, dass alle
Lösungen, dievondieserReferenz ausgehenkönnen,bereitsvorgekommen sind.Der Zu-
stand Unvollständig bedeutet, dass mindestens eine Lösung aufgenommen wurde, aber
es auh noh mindestens eine noh niht besuhte Lösung gibt. Für die Predeessor-
Darstellung gibtesdarüberhinaus noh den ZustandVerboten,derungültige Lösungen
markiert. In den Illustrationen wird ein Null als leeres Feld dargestellt, Vollständig als
C,Verboten als FundUnvollständig alsX.
2.8 Kodierung des Ghosh-Tries
FürdieKodierungnahdenKnotenwirdeineinfaherInteger-Vektorverwendet,beidem
das
n
-teElementdenn
-tenCluster repräsentiert.ImTrieentspriht dien
-teEbenedemn
-tenCluster. Die Gröÿe der Trieknoten bzw. die Anzahl dernötigen Referenzen hängtvon der Anzahl derKnoten im entsprehenden Cluster ab. Der Trie wird inAbbildung
2.7 illustriert. Die Operationen des Tries sind im Wesentlihen analog zu demdes Pop-
Tries. Die Anzahl der Trie-Ebenen und die Anzahl der Knoten in den Trieknoten sind
zwar untershiedlih, und es sind keine Überprüfungen notwendig, ob die konvertierten
Lösungen gültig sind, dennoh sind die grundlegenden Operationen wie Einfügen und
Konvertieren analog zu denen des Pop-Tries, die im nähsten Abshnitt beshrieben
werden.
2.9 Kodierung des Pop-Tries
Die Darstellung nah globalen Kanten entspriht einem Spannbaum. Daher stellt sih
die Frage, wie der Baum im Trie kodiert werden soll. Es gibt hierfür eine Vielzahl von
Darstellungsmöglihkeiten [PK94,RJ03℄.DerEA verwendetfür dieFunktionen, dieauf
derPop-Darstellung basieren, diePredeessor-Darstellung, daherbietetessih an,diese
auh im Trie zu verwenden. Ein Problem dieserDarstellung ist jedoh,dass niht jeder
Graph,derhiermitdargestellt werdenkann,auhwirklih einBaumist.AlsAlternative
dazu wird diePrüferkodierung verwendet. Diese hat derVorteil, dass jeder darstellbare
Code ein gültiger Baum ist und somit klassishe Rekombination- und Mutationsopera-
toren auf Arrays ausgeführt werden können. Als Nahteil wird jedoh angeführt, dass
derenLokalität geringist [PK94 ℄, d.h. einegeringe Änderung, wie z.B.die Veränderung
nur einer Stelle der Lösung kann sie stark verändern. Dasih diese Untersuhungen je-
doh auf klassishe EA-Operatoren wie Mutation und Rekombination beziehen, niht
Pfeilen markiert.
jedoh auf denAnwendungsfall eines Lösungsarhives, sollhier auhuntersuht werden,
inwieweit diese Kodierung geeignetist.
Der Prüfer-Code wird wie folgt berehnet: Es wird im Baum jenes Blatt gesuht,
dessenNummerdiekleinsteist.DieNummerdesKnotens,mitdemdasBlattverbunden
ist, wird dem Code hinzugefügt. Das Blatt wird gelösht und dieser Vorgang so lange
wiederholt, bis nur mehr zwei Knoten übrig sind. Der in Abbildung 2.3 dargestellte
SpannbaumhatdanndenPrüferode5331 .DerAlgorithmuszudessenGenerierungbzw.
zuderRükkonvertierungwirdweiteruntenbeshrieben.DaderEAfürdieOperationen
auf Basis der Pop-Darstellung die Predeessor-Kodierung verwendet, muss die Lösung
zuerst in die Prüfer-Kodierung umgewandelt werden, wenn der Prüfer-Trie verwendet
wird. Daallediese Codierungen wie dieGhosh-Darstellung aufInteger-Arraysbasieren,
wird immer auh ein ähnliher Trie verwendet. Sie untersheiden sih nur in der Tiefe
bzw. derGröÿe dereinzelnen Trie-Knoten.Bei Verwendung derPredeessor-Darstellung
ist der Trie bei
n
Clusternn − 1
Ebenen tief, da der Wurzelknoten keinen Vorgänger besitzt. Ein Knoten des Tries hat dann höhstensn − 1
Referenzen auf Nahfolger, daderKnoten niht Vorgänger seinerselbst seinkann.
InAbbildung2.8isteinBeispielmitsehsClusternzusehen.DerTriehatfünfEbenen
und jeder Knoten hat fünf Referenzen. Die Blätter enthalten Lösungen, die anderen
Knoten Referenzen zuden Ebenen tieferimTrie.
Der Prüfer-Trie ist bei
n
Clusternn − 2
Ebenen tief,da auh derPrüfer-Coden − 2
Stellenhat.Ein Knoten hat dann
n
Referenzen. InAbbildung 2.9istdieselbeLösungin derPrüfer-Darstellung zu sehen. DieInstanz hat sehs Cluster, derTrie vierEbenen zujeweils sehs Knoten.
Der Triehat somit
O(n)
Ebenen mitKnoten, diebiszu jeweilsO(n)
Referenzen aufweitere Knoten haben. Die
n
-te Ebene könnte dann theoretish ausO(n n )
Referenzenbestehen,wasaberfürdiePraxiskeineBedeutunghat,dadieAnzahlderLösungendurh
Abbildung 2.9: EineLösung inPrüfer-Darstellung unddessen Darstellung imTrie
die Laufzeit des EA begrenzt ist. Der zusätzlihe Speiherverbrauh für das Einfügen
einer einzelnen neuen Lösung kann im shlehtesten Fall
n 2
sein, da esO(n)
Ebenenund
O(n)
Referenzenpro Ebenegibt. BeidieserDatenstruktur entstehen somitinjedem neuen KnotenO(n)
Null-Zeiger.Bei derEinfügungder ersten Elementeentstehen somitO(n 2 )
Null-Zeiger, waseinem reht hohenSpeiherverbrauhentspriht.Dadannjedoh neue Lösungen, die sih in nur in den unteren Stellen von einer bereits vorhandenenLösung untersheiden, mit wenig Speiherverbrauh (im besten Fall muss nur ein Null-
ZeigeraufVollständig geändertwerden, umeineneueLösungzumarkieren)hinzugefügt
werdenkönnen,istzuerwarten, dassderSpeiherverbrauhnihtexplodierenwird.Wolf
[Wol09 ℄hat inseinerArbeitfestgestellt,dassdertheoretishe Speiherverbrauhfür den
Ghosh-Trie für gröÿere Instanzen zwar Hunderte von Terabyte betragen könnte, dies
jedoh durh die Laufzeit des Algorithmus begrenzt wird. In der Praxis erreihte er
Werte von einigen Dutzend MB. Da sein Trie jedoh
O(n)
Ebenen und eine Ebene nurO(n/m)
(wobeim
diedurhshnittliheZahlderKnotenproClusterist)Knotenhat,dieKnoten des Trie inder Spannbaum-Darstellung jedoh
O(n)
Referenzen haben, ist einSpeiherverbrauh vonmehrerenHundertMBdurhausmöglih.DerSpeiherverbrauh
wirddann imZuge derTests beobahtet.
2.10 Die Operationen des Tries
EsgibtgrundsätzlihnurzweiOperationen,EinfügenundKonvertieren.DieFunktionder
Einfügen-Operationbestehtdarin,dieneueLösungeinzufügen,wenndiesenohnihtim
Trieexistiert.DieKonvertierungs-Funktionerstelltausgehendvoneinerbereitsbesuhten
Lösung eine neue, garantiert unbekannte. Eine eigene Funktion für das Suhen einer
Lösungbzw.Prüfung,obeineLösungimTrie bereitsvorhandenist,istnihtnotwendig,
da diesimplizit überdieFunktionzumEinfügengeshieht. Beiden Trie-Funktionen für
diePredeessor-Darstellungmussberüksihtigtwerden,dassesimTrienihterforderlih
ist,füreinenKnoten,derdiemöglihenVorgängerspeihert,eineReferenzaufsihselbst
zu enthalten. Dieser Umstand maht den Programmode zwar etwas unübersihtliher,
ist aberfür diegrundsätzlihe Idee niht wesentlih.
Die Einfügen-Funktion für die Predeessor-Codierung
Das Einfügeneiner Lösung inden Trie mit Predeessor-Kodierung wirdinAlgorithmus
2dargestellt.Zunähstwirdüberprüft,obdieLösungbereitsimTrieenthalten ist.Dazu
wirdinjedemTrieknotendemZeigergefolgt,derderkodiertenLösungimTrieentspriht.
StöÿtdieSuhedabeiaufeinenNullzeiger,istdieLösungnihtenthaltenundsiewirdneu
eingefügt,wobeigegebenenfallsfehlendeTrieknotenebenfallseingefügtwerden.Stöÿtdie
Suhe dagegenaufeinen Vollständig-Pointer, soist dieLösungbereitsvorhanden.
In derPredeessor-Kodierung wirdfür jeden Cluster sein Vorgänger gespeihert. Da
der Graph, der die Verbindungen zwishen den einzelnen Clustern darstellt, ein Baum
ist und somit keine Zyklen enthalten darf, ist dies zu berüksihtigen. Es ist mit dieser
Darstellung somitmöglih, Lösungenzu kodieren,diekeine Bäume sindund dieZyklen
enthalten.DieseungültigenLösungen müssenjedohalssolhe erkannt werden bzw.gar
nihterstgeneriertwerden.EsgibtsomitprinzipiellmehrereStellen,andenen dieserfol-
genkann.EinerseitskönntenbeimEinfügeneinerneuenLösungalleungültigenLösungen
in den Knoten der Tries markiert werden, oder aber es könnte in der Konvertierungs-
Methode darauf geahtet werden, keine ungültigen Lösungen zu generieren. Da es aber
nihtmöglihist,alleungültigenLösungengleihinderEinfügen-Methodezumarkieren,
muss auh beiderKonvertierungs-Methode darauf geahtet werden, dass keine ungülti-
gen Lösungen entstehen. Nah dem Einfügen der neuen Lösung wird noh überprüft,
ob dadurh Trieknoten vollständig geworden sind, d.h. ob sie nur Knoten mit dem Zu-
standVollständig bzw.Verboten aufweisen.IstdiesderFall,sokannderKnotengelösht
werden und die auf diesen Knoten verweisende Referenz im Knoten darüber als Voll-
ständig markiertwerden. DadadurhauhderdarüberliegendeKnotenvollständigwer-
den kann,muss diese Funktionrekursiv aufgerufen werden. Der Trie kannsomit grund-
sätzlih wieder Speiherplatz freigeben, wenn zusätzlihe Lösungen eingefügt werden.
Angesihts desgroÿen Lösungsraumes ist diese Funktion jedoh wohl nur bedingt dazu
geeignet,inderPraxisSpeiherplatzeinzusparen.DerVorgangdesZusammenfasseneine
vollständigen TrieknotenswirdinAbbildung 2.10 illustriert.
Berehnung der Verboten-Felder
Die Berehnung der Verboten-Felder erfolgt rekursiv. Der Pseudoode ist in Algorith-
mus 2.10angegeben.Damit indemGraph keinZyklus entsteht,darf ein Cluster keinen
Vorgängerhaben,derwiederumdiesenalsVorgängerhat.WenndieVerboten-Feldereines
Clusters berehnet werdensollen, sind alle Cluster, die einen kleinerenIndex haben als
der gegenwärtige, Kandidaten für verbotene Cluster. Dannwird überprüft,ob esunter
dieseneinenbereitshinzugefügtenClustergibt,dessenNahfolgerdergegenwärtigeClus-
ter ist. Ist dies der Fall, so würde eine Lösung mit einem Zyklus entstehen und dieser
wird als Verboten markiert. Wird ein Verboten-Feld markiert, so wird weiter rekursiv
untersuht,obesbereitshinzugefügteCluster gibt,dessenNahfolger dernunverbotene
Cluster ist. Solhe wären ebenfallsungültige Lösungen, diemarkiert werden müssen.In
Abbildung 2.11 wird gezeigt, dass es von der Reihenfolge der Cluster abhängt, ob und
wieviele Felder als Verboten markiert werden können. Damit ein Feld in einem Cluster
als Verboten markiert werden kann, müssen dessen Vorgänger bereits vorher im Trie
gespeihert worden sein.Im linken Beispiel können keine Cluster als Verboten markiert
werden,weildieCluster,dieBlättersind,einenhöherenIndexalsihreVorgänger haben,
im rehten ist es dagegen umgekehrt. Weiterhin kann man an diesem Beispiel sehen,
dass wenn man an der linken Lösung im Trieknoten für den Cluster 2 die Lösung von
1 auf3 verändert, sih einZyklus ergeben würde, dervon dieser Funktionniht verhin-
dertwerden kann.Daher istesnötig,dassdie Prüfung beider Konvertierungs-Funktion
Eingabe:Lösung
sol : S g =< V G , T G >
Ausgabe:boolean:Einfügen erfolgreih?
1: for
(i = 1; i < sol.size(); i + +)
do2:
numberOf P redecessors[sol[i]]
++ // Anzahl der Vorgänger für jeden Cluster,wirdfür dieBerehnung derVerboten-Felder gebrauht
3: endfor
4: if
root
=null then5: generiere neuen
root
undfüge diesen ein6: endif
7: urr=root
8: for
(i = 1; i < sol.size() − 1; i + +)
do9:
pos = sol[i]
;10: if
curr.next[pos]
== omplete then11: return
f alse
12: elseif
curr.next[pos]
==null then13: if
i
==anzahlDerT rieEbenen
then14: // wenn dieletzteEbene erreiht wird
15:
curr.next[pos] = complete
16: else
17:
curr.next[pos]
=neuerTrieknoten18: for
(j = 0; j < sol.size(); j + +)
do19: hekPredeessors(
sol
,numberOf P redecessors
,curr.next[pos]
,j
)20: //fürden Trieknoten Verboten-Felder berehnen
21: end for
22: endif
23: end if
24:
curr = curr.next[pos]
25: endfor
26: überprüfe,ob einTrie-Knoten vollständiggewordenist
27: return
true
erfolgt.
Die Konvertierungs-Funktion
Die Konvertierungs-Funktion dient dazu, eine Lösung zur verändern und somit zu ein-
er neuen Lösung zu kommen. Es werden zwei vershiedene Konvertierungsfunktionen
verwendet, dierandomisierte Konvertierung unddie Konvertierung von unten.
Algorithmus3 hekPredeessors(Lösung
sol
,int[℄numberOf P redecessors
,Trienoden
,intnode
): Berehnung von ungültigenLösungen1: if
numberof predecessors[node]
==0 then2: return;
3: endif
4: if if(
sol[pred] == node ∧ pred
bereits obenim Trie hinzugefügt)then 5:n.next[pred]
=verboten6: for(inti= 0;i<sol.size();i++) do
7: hekPredeessors(
sol, n, numberOf P redecessors, i
);8: end for
9: endif
Die randomisierte Konvertierung
Der Trie wirdsomit entlang der Lösungdurhsuht, währendan einer geeigneten Stelle
eine Änderung vorgenommen wird. Der Pseudoode zu dieserFunktionist inAlgorith-
mus 4 angegeben. Wie aber aufgrund der anderen Speiherstruktur der Predeessor-
Darstellung shon beim Einfügen Abhängigkeiten auftraten, die es zu behandeln galt,
soist dies auh inderKonvertierungs-Funktion erforderlih.Es ist daherniht möglih,
einfah eineLösung beliebig zu verändern, ohne zu überprüfen, ob dasErgebnis wieder
eine gültige Lösung ist. Bei der Erkennung eines Zyklus wird der Vorgänger des Clus-
ters, dessen neuer Nahfolger in den Zyklus führen würde, auf den alten Nahfolger zu
verweisen. Der Pseudoode für diese Funktion ist in Algorithmus 5 zu nden. Aller-
dingswirdsodieLösunganmehrerenStellenverändert,wassomitzuFolgehaben kann,
dass die neue Lösung wieder ein bereits im Arhiv enthaltendes Duplikat sein könnte.
Daher kann niht garantiert werden, dass es sih tatsählih um eine unbesuhte Lö-
sung handelt. Für den Fall, dass die Korrektur-Funktion ein Duplikat erstellt, wird die
Konvertierungs-Funktionerneutaufgerufen,ummitdiesemDuplikat alsAusgangspunkt
eine neue Lösung zu generieren. Gegebenfalls kann dies auh mehrmals hintereinander
Veränderung einerbereits enthaltenen
Eingabe:Lösung
sol : S g =< V G , T G >
Ausgabe:veränderte Lösung
sol
1: berehne alle Startpunkte, d.h. Trieknoten entlang der Lösung, wenn diese niht
Vollständig sind
2: trienode
curr
=einzufälliger Startpunkt;3: while
curr
!=nulldo4: suhe indiesemKnoten einen Null-Zeiger
5: if Null-Zeigergefundenthen
6: Lösunggefunden, Funktionkannabgebrohen werden
7: überprüfe,ob keinZyklus entstanden ist
8: else
9: if dieReferenz entlang derLösung
sol
niht vollständig istthen 10: folge derLösung11: else
12: suhe einen beliebigen noh niht vollständigenZeiger
13: überprüfe,ob keinZyklusentstanden ist
14: endif
15: end if
16: endwhile
auftreten; dann wirddieKonvertierungs-Funktion solange aufgerufen, biseine neue Lö-
sung gefunden wird. Allerdings kann die Lösung dann dementsprehend stark im Ver-
gleihzurUrsprungslösungverändertwerden.InAbbildung2.13wirddieKorrektureines
Zyklus illustriert. Indiesem Fall,wo derCluster 4der Vorgänger des Clusters3 werden
soll, würde ein solher unzulässiger Zyklus entstehen. Um dies zu verhindern, wird der
Vorgänger von 3, der sih im Zyklus bendet, also der Cluster 5, an den Nahfolger 4
angebunden. Somit entsteht wieder eine gültige Lösung. Allerdings wurde die Lösung
somitan zwei Stellenverändert.
GrundsätzlihwerdendieKnotenentlangderLösunganalogzuWolfsLösung[Wol09 ℄
gespeihert,undeinedavonalsStartpunktzufälligausgewählt.Diesgeshiehtdarum,um
densogenanntenBiaszuverringern,alsoumdieWahrsheinlihkeit zuerhöhen,dassdie
Lösung an einem zufälligen Knoten verändert wird. Ausgehend von diesen Punkt wird
einNull-Zeigergesuht.Kanneinsolhernihtgefundenwerden, wirddieLösungweiter
nah unten verfolgt, eswird also der nähste Cluster der Lösung verwendet, wo wieder
einNull-Zeiger gesuht wird. Istesniht mehrmöglih,diese Lösungweiterzuverfolgen,
weil sie bereits vollständig ist, sowird einzufälliger Cluster, der noh niht vollständig
ist,ausgewählt. Immer,wenn dieLösungverändert wird,mussüberprüftwerden, obein
Zyklus entstanden ist, also wenn ein anderer, noh niht vollständiger Knoten verfolgt
wird, oder aber ein Null-Zeiger gefunden wurde, der die neue Lösung darstellt. Diese
Konvertierungsart wirdrandomisierte Konvertierung genannt.
rigiert ihngegebenenfalls
Eingabe:Lösung
sol : S g =< V G , T G >
,intveraenderterCluster
,intalterV orgaenger
Ausgabe:ggf. veränderteLösung
sol : S g =< V G , T G >
1: int
pred
;2: while
pred
!=wurzelcluster ∧ pred
!=veraenderterCluster
do3:
pred
=sol
[veraenderterCluster
℄4: endwhile
5: if
pred
==wurzelcluster
then6: // wenn derWurzelknoten erreiht wurde:
7: // keinZyklus,die Lösungwirdniht verändert
8: return
sol
9: else
10: // Zykluswurde entdekt
11: bestimmeCluster
c
,derimZyklus derVorgänger vonveraenderterCluster
ist12: Vorgänger von
c
=alterV orgaenger
13: endif
Die Konvertierung von unten
Eine Variante zu dieser Konvertierungs-Funktion besteht darin, den Startpunkt niht
zufällig, sondern so weit unten wie möglih zu wählen. Diese wird dann Konvertierung
von unten genannt. Dadurh ist es möglih, Speiherplatz zu sparen, da die Lösungen
im Durhshnitt dann längere gemeinsame Präxe aufweisen. Als Nebeneekt können
vollständigdurhsuhteTrieknoten früherentferntwerden, wasauheinwenigSpeiher-
platz einsparen kann. Allerdings werden denn bestimmte Cluster - die weiter unten im
Trie - öfterverändert als dieandere- die weiteroben.Obsihdadurh dieQualität der
gefundenenLösungen vershlehtert,wirdinden Tests untersuht werden.
Der Aufwand der beiden Konvertierungsvarianten
Der Aufwand für die randomisierte Konvertierungs-Funktion ist für den Prüfer-Trie im
shlehtesten Fallin
O(n 2 )
,wobein
derAnzahl derCluster entspriht. Ausgehend vomWurzelknotenmusshöhstens
n
-malbisindieletzteTrieebenehinuntergegangenwerden, während die Suhe nah Null-Zeigern bzw. Zeigern, die Unvollständig sind, in einemVektoreinen Aufwand von
O(n)
verursaht. Das entspriht einem Gesamtaufwand vonO(n 2 )
.Bei der Konvertierung von unten könnte, wenn der Trie relativ voll ist, im shleh-
testen Fall ebenfallsein quadratisherAufwand entstehen. Allerdingskommt dasinder
Praxis kaum vor. Nahdem die Lösung möglihst weit unten verändert wird, und die
SuhesolangeentlangderLösungverfolgtwird,bisaufeinenVollständig-Zeigergestoÿen
wird, muss imeinfahen Fall der Trie
n
mal hinunterverfolgt werden, während dasFin- den des Null-Zeigers ebenfalls einen Aufwand vonO(n)
verursaht. Wenn vollständigeerfordern,eine neue Lösungzu nden.
Abbildung 2.13: DieKonvertierungs-Funktion verhindertdasAuftretenvonZyklen
Knoten aber zusammengefasst werden, so ist es auh möglih, dass Vollständig-Zeiger
niht nur in der letzten Trieebene auftreten. Wenn nun in so einem Trieknoten ein un-
vollständigerZeigergesuht werdenmuss, soverursahtdieseinenzusätzlihenAufwand
inderOrdnung
O(n)
.DieseSituationwirdinAbbildung2.12illustriert.IneinemPrüfer- Trie soll die Lösung 3166 konvertiert werden. Es sind jedoh bereits alle Lösungen mitdemPräx316 eingefügt wurden,waszurFolgehat,dassderTrieknoten aufdervierten
Ebene durh einen Vollständig-Zeiger in der dritten Ebene ersetzt wurde. Daher stöÿt
die Konvertierungs-Funktion bereits in der dritten Ebene auf einen Vollständig-Zeiger.
NahdemauhkeinNull-ZeigerindemTrieknotenvorhandenist,musseinzufälligerUn-
vollständig-Zeiger weiterverfolgtwerden. Wenn dieKonvertierungs-Funktion theoretish
bereitsindererstenEbeneaufeinenVollständig-Zeigerstoÿenwürde,undsieimZugeder
Suhe in jederEbene auf einem Vollständig-Zeiger stoÿen würde, so wäre derAufwand
für diese Funktionquadratish.
Zur Terminierung der Konvertierungs-Funktion im Predeessor-Trie
AufgrundderAuftretensvon Zyklenkannfür denPredeessor-Trieniht garantiertwer-
den kann, dass die Konvertierungs-Funktion beim ersten Aufruf eine neue, noh niht
besuhte Lösung erstellt. Die Lösung für diesen Fall besteht darin, die Funktion erneut
aufzurufen.BeidenTests(sieheAbshnitt3.10)hatdieFunktionzwar immerspätestens
nahfünf Reparatureneine unbesuhte Lösunggefunden. Dennoh stellt sih dieFrage,
ob es Fälle gibt, in keine neue Lösung gefunden werden kann, wenn die Funktion zu
einer Lösung springt, die bereits im Zuge der Konvertierungs-Funktion vorkommen ist.
Damit die Funktion zur selben Lösung springt, muss die Konvertierungs-Funktion in
einenZyklus geraten.
InAbbildung 2.14wirddieserFall illustriert.Der Vorgänger eines Clusterswirdhier
wiefolgtbeshrieben:
P red(c 1 ) = c 2
,derVorgängervonc 1
istc 2
.VorderKonvertierung giltP red(z 1 ) = c 1
(Abb. 2.14a). Die Konvertierungs-Funktion verändert die Lösung nun so, dass gilt:P red(z 1 ) = z 2
(Abb. 2.14b). Dannwird der alte Vorgänger wie folgtreferenziert:
P red old (z 1 ) = c 1
. Es ergibt sih ein Zyklusz 1 , z 2 , ..., z n
. Die Reparatur-Funktionverändert dieLösung so,dass gilt:
P red(z n ) = P red old (z 1 ) = c 1
(Abb. 2.14).Die Funktion könnte nur dann zu der alten Lösung kommen, wenn die Konvertierungs-
Funktiondanahnaheinander
n−1
Malwiefolgtaufgerufenwird,dassbeierstenAufrufdieLösung verändert wird, dassgilt:
P red(z n ) = z 1
;ab demzweiten AufrufdieLösungbeim
i
-ten Aufruf verändert wird, dass gilt:P red(z n−i+1 ) = z n−1
. Es wird also immerder Vorgänger von
c 1
verändert. Dadurh entsteht immer wieder ein Zyklus, was zurFolge hat,dassdieReparatur-Funktion dieLösung
n − 1
Malverändert, wobei siebeimi
-tenAufrufdieLösungrepariert,dassgilt:P red(z n−i ) = c 1
(Abb.2.14d-f).SomitwürdedieFunktionnahinsgesamt
n
Konvertierungen zuderursprünglihen Lösungkommen.Jedohwirddiese Folgean ReparaturenbeidemCluster mitdem höhstenLabel-Index
im Zyklus,also
z h : Label(z h ) = max(Label(z 1 , ..., z n ))
unterbrohen. Es gilt für diesen Clusterz h
, dassLabel(z h ) > Label(z i )∀z i
; es kann ein Zyklus nur für solhe Clusterentstehen,derenLabel-Indexgeringeristalsdervon
z h
.DadieFunktionzurMarkierunghöhsten Wert
von Verboten-Feldern beim Einfügendieser Lösung inden Trie indiesem Fall alle diese
Cluster als Verboten markieren kann,kann dieKonvertierungs-Funktion niht indiesen
Zyklus gelangen. Dieser Fall wird inAbbildung 2.15 illustriert. Im ersten Fall kann für
den Cluster
7
nur einVerboten-Feldmarkiert werden, nämlihfür den Cluster5
,fürdierestlihenjedohniht,daderCluster
10
erstweiteruntenimTrievorkommt.ImzweitenFall können für denCluster mitdem höhsten Wert
10
alle Cluster,deren direkter oderindirekterVorgänger
10
ist,alsVerboten markiertwerden,daalleeinenniedrigeren Wert habenund somitbereitsweiter oben imTrievorgekommen sind.Obwohl für die Praxis niht relevant, ist es möglih, einen Worst-Case-Fall zu kon-
struieren, bei dem
O(n 2 )
Konvertierungen nötig sind. Dieser tritt auf, wenn der Baum nur aus einem Weg besteht, derausgehend von derWurzel aufsteigend sortierte Label-Indizesaufweist.DieserFallwirdinAbbildung2.16illustriert.AusgehendvonAbb.2.16a
wird der Vorgänger von
2
aufn
geändert, danah der Vorgänger von3
auf2
usw. DerBaumnah
n − 2
Konvertierungen,wenndieFunktionandemClustermitdemhöhsten Label-Index abbriht, ist in Abb. 2.16b zu sehen. Nun ist es aber wieder möglih, denVorgänger von
2
aufn − 1
zu setzen, was im shlehtesten Falln − 3
Konvertierungen erforderlih maht. Der Baum nah diesen Konvertierungen ist in Abb. 2.16 zu sehen.Dieser Vorgang kann insgesamt
n − 2
Mal auftreten, die Anzahl der Konvertierungen verringert sih jeweils immer um eins, alsoP n−2
i=1 i
, was einem quadratishen Aufwand entspriht.2.11 Die Operationen für die Prüfer-Darstellung
Da die Prüfer-Zahlen, wie auh die Predeessor-Darstellung, aus einem Integer-Array
bestehen, ist das Einfügen und das Konvertieren der Lösungen bis auf die geringfügig
untershiedliheTiefedesTries unddieLängedesArraysgleih.Auÿerdemistesbeider
Prüfer-Darstellung niht erforderlih, ungültige Lösungen zu markieren bzw. nah der
Konvertierungeiner Lösungzu überprüfen,obeinZyklus entstanden ist. Davonabgese-
hen ist die prinzipielle Funktionsweise abergleih. Dader EA jedoh grundsätzlih mit
der Predeessor-Darstellung arbeitet, ist eine Konvertierung erforderlih. Diese Opera-
tionen werdennunim Folgenden dargestellt.
Konvertierung der Predeessor-Darstellung in die Prüfer-Kodierung
Eswirdgrundsätzlih derklassishe Algorithmus [PK94 ℄verwendet. DerPseudoode ist
in Algorithmus 6 angegeben. Zunähst werden die Kanten in Form einer Adjazenzliste
aus der Predeessor-Darstellung berehnet, und der Grad der Clusters bestimmt und
diese in einen Vektor gespeihert. Danah wird laufend der Cluster mit der kleinsten
Nummerierung gesuht, dessen Grad 1 beträgt. Der Cluster, mit dem das Blatt noh
verbundenist,wirdinden Prüferode übernommen. Umdiesezient zugestalten,wird
derVektornur einmaldurhlaufen, dadernähsteCluster mitGrad1grundsätzlihnur
auf einem Feld mit einem höheren Index sein kann. Da die Kanten allerdings entfernt
werden, wenneinCluster indiePrüferlisteaufgenommen wird,istesauh möglih,dass
dadurh einneuerCluster Grad1 erhält. Fallsalso einCluster, dessen Indexkleiner als
derzuletztverwendeteClusterist,indieAuswahlkommt,wirdderIndexdirektaufdiese
Stellegesetzt,waseinerneutesIterierenüberüssigmaht.DerAufwandist
O(d max ∗ n)
,wobei
d max
demCluster mit demmaximalen Grad entspriht.Konvertierung der Prüfer-Kodierung in die Predeessor-Darstellung
Dieumgekehrte Rihtung, alsodieUmrehnung indiePredeessor-Darstellung, kannim
Wesentlihen analog berehnet werden. Algorithmus 7 generiert zuerst eine Liste von
KanteninStruktureiner Adjazenzliste,ausdenen dann inweitererFolge dieeigentlihe
Predeessor-Darstellung gebildet wird. Auh der Index wirdanalog zu demvorigen Al-
gorithmus immer nur erhöht, um die Berehnung zu beshleunigen. Zuerst wird der
Kandidaten-Vektor berehnet, derangibt,wie oft ein Cluster im Prüferode vorkommt.
Kandidaten sind zu Beginn solhe Cluster, die gar niht im Code vorkommen. Eine
KantezwishendemKandidatenunddemClusterausdemPrüferode(imerstenShritt
wirddererste Cluster derPrüferodes verwendet, im
n
-ten Shritt dern
-te)kann dannEingabe:Lösung
sol pred : S g =< V G , T G >
inPredeessor-Darstellung Ausgabe:Lösungsol pruef er : S g =< V G , T G >
inPrüfer-Darstellung1: int[℄[℄
adjazenzliste
:berehne diese ListeausderLösungsol
2: int[℄
grad
:speihert denGrad derCluster3: int
j
=0;intrealindex
=0;intsaveindex
=-14: for(
int i = 0; i < sol pred .size() − 2; i + +
)do5: while
j < sol pred .size()
do6: if
saveindex
==-1then7:
realindex
=j
8: else
9:
realindex
=saveindex
10: endif
11: if
degree
[realindex
℄==1 then12: Blatt mit kleinstem Label (
adjazenzliste[realindex][0]
) gefunden,füge sie in
sol pruef er
ein13: Kante aus
adjazenzliste
entfernenundgrad
aktualisieren 14: ifgrad[pos] == 1 ∧ pos < j
then15:
saveindex
=pos
;16: else
17:
saveindex
=-1;18: end if
19: else
20:
j
++21: endif
22: end while
23: endfor
hinzugefügt werden. Der Prüferode wirddann Shritt für Shritt abgearbeitet, imVer-
laufderBerehnungwerdendannauhsolheClusterzudenKandidatenhinzugefügt,die
nihtmehr indemCodevorkommen.Wenn dieAdjazenzlisteerst malvorliegt, kanndie
Berehnung der Predeessor-Darstellung ezient mittels der Tiefensuhe durhgeführt
werden. Insgesamt beträgt derAufwand für dieseFunktion
O(n)
.2.12 Kombinierung der beiden Sihtweisen
Da Ghosh- und die Pop-Kodierung komplementär sind, werden diese gemeinsam ein-
gesetzt, mit der Absiht, deren Optimierungsmöglihkeiten zu kombinieren und somit
die Lösungen weiter verbessern zu können. Dies haben Hu, Leitner und Raidl [HLR08℄
in ihrem VNS-Ansatz mit Nahbarshaftsstrukturen, die auf den beiden Sihtweisen
basieren, getan und gute Resultate erhalten. Daraus ergibt sih die Motivation, dies
analogfür dieLösungsarhive zu tun.