Allgemeine Lösungsbeschreibung

Werbung
Dokumentation zum Beleg „logische Programmierung“
Aufgabenstellung
Hamilton-Kreis
Bestimmen sie eine Strecke, die im folgenden Graphen in der Stadt L startet, jede
andere Stadt genau einmal anläuft und wieder in L endet.
Vorgelegt von:
Name
Name
Matrikel-Nummer:
Matrikel-Nummer:
Studiengang:
Studiengang:
1
Hamilton-Kreis (hamilton.pl)
Algorithmus
Ziel des Hamilton-Zyklus ist es, in einem gegebenen Graphen einen Weg zu finden, bei dem
alle vorhandenen Knoten genau einmal berührt werden und an dessen Ende man sich wieder
im Ausgangsknoten befindet.
Um das zu erreichen, wird zuerst definiert, was ein Weg ist. Ein Weg muss aus einem
Startpunkt, dem Zielpunkt und der zurückgelegten Strecke bestehen. In unserem Fall besteht
die Strecke aus der Liste der berührten Knoten. Dieser Liste wird nun ausgehend vom
Zielknoten immer wieder ein neuer Knoten hinzugefügt und zwar so, dass dieser über eine
Kante mit dem vorhergehenden Knoten verbunden und außerdem noch nicht in der Liste
vorhanden ist. Sind diese Kriterien erfüllt, wird der neue Knoten der Liste hinzugefügt und
ein nächster Knoten gesucht. Falls der Startpunkt als nächster Knoten in Frage kommt, wird
er noch vorn hinzugefügt und es befinden sich alle Punkte vom Startpunkt bis zum Zielpunkt
in richtiger Reihenfolge in der Liste.
Nach dem Konsultieren des Prolog-Quelltextes und der Eingabe von „loesung.“ beginnt der
Algorithmus, die Aufgabe zu lösen. Es werden alle Wege vom Knoten „l“ zu all seinen
Nachbarknoten gefunden und darauf überprüft, ob sie die Länge 20 haben. Da jeder Knoten
nur ein Mal in einem Weg vorkommt, sind so alle Knoten enthalten. (Alternativ könnte man
hier jeden Knoten als Startpunkt nehmen, da alle Knoten im Weg vorkommen - das bringt
jedoch nichts, weil jeder andere Knoten ebenfalls 3 Nachbarn hat.) Mittels „findall“ werden
diese Wege nacheinander in eine Liste gespeichert. Da nun jede Route vor- und rückwärts
enthalten ist, werden diese Wiederholungen noch herausgefiltert.
Jedem einzelnen Weg wird der „l“-Knoten angefügt (vom Nachbarknoten aus ist „l“ einfach
zu erreichen) damit die Wege zueinander symmetrisch sind und mittels reverse/2 einfach
umgedreht werden können. Jeder Weg wird nun in der umgedrehten Reihenfolge der
enthaltenen Knoten in eine Liste aufgenommen und als Lösungsstrecke ausgegeben, sollte er
nicht schon in dieser Prüfliste enthalten sein.
[eine detailliertere Erklärung des Algorithmus‘ befindet sich innerhalb der Quelltext-Datei]
Datenstruktur
Die im Graphen enthaltenen Kanten wurden über das Prädikat „kante“(Knoten1, Knoten2)
definiert. Somit kann der gesamte Graph recht einfach modelliert werden, ohne komplizierte
Nachbarschaftsbeziehungen darzustellen.
Eine Alternative dazu war, die Kanten in einer Liste zu speichern. (siehe Optimierungen)
Der zurückgelegte Weg ist als Liste aller Wegknoten implementiert worden.
Optimierungen
Zuerst wurden die Kanten als Liste in die Datenbasis eingefügt. Eine einfache Darstellung als
Fakten erzeugte eine Reduktion der Inferenzen um den Faktor drei. Die globale Datenbasis
wird von PROLOG wesentlich effizienter durchsucht, als eine Liste. Die Implementierung als
Liste hatte den Grund, das Programm dynamischer bezüglich neuer „Schienennetze“ zu
machen, in dieser älteren Version des Programms wurden die Hamiltonwege zu einem
dynamisch zu findenden Nachbarknoten von „l“ gefunden, die die Länge der Kantenliste
2
hatten.
Sonst waren relativ wenige Optimierungen nötig, die zusammen etwa 2‘000 von 1‘300‘000
Inferenzen eingespart hatten.
Verallgemeinerung
Das Problem des Hamilton-Zyklus lässt sich auf das „Salesman-Problem“ abbilden. Dabei
wird die optimale Route zwischen mehreren Standorten gesucht, ohne einen Ort zweimal
anfahren zu müssen und dabei wieder am Startort anzukommen, beispielsweise um Waren aus
einem Lager auszuliefern.
Ebenfalls könnte man mit diesem Zyklus ein Token-Ring-Netzwerk aufbauen, bei dem die
Rechner örtlich etwas weiter auseinander stehen. Der Weg des Tokens kann anhand des
Hamilton-Zyklus bestimmt werden.
Programmcode
Anbei folgender Prolog-Quelltext:
hamilton.pl
Eingabe von loesung. erzeugt formatierte Ausgabe der 30 Lösungswege
(benötigt 1,131,981 Inferenzen)
3
Herunterladen