• Keine Ergebnisse gefunden

3.1 Pizza-Toni liefert wieder. 20 Punkte

N/A
N/A
Protected

Academic year: 2022

Aktie "3.1 Pizza-Toni liefert wieder. 20 Punkte"

Copied!
2
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Christoph Lüth Tobias Brandt Tristan Bruns Johannes Ganser Berthold Hoffmann Alexander Kurth Praktische Informatik 3 WS 16/17

3. Übungsblatt

Ausgabe: 08.11.16

Abgabe: 18.11.16, 12:00 Uhr

3.1 Pizza-Toni liefert wieder. 20 Punkte

Mit seinem neuen Lagerhaltungssystem kann “Toni” Corleone jetzt doppelt so viele Pizzen backen wie vorher.

Leider kommt die Auslieferung dabei nicht hinterher: Guiseppe mit seiner Vespa fährt leider völlig unstruk- turiert durch die Stadt und braucht Stunden für eine Tour.

Deshalb wollen wir auch hier — in Hoffnung auf freie Pizza— mit einer professionalen Lösung aushelfen.

Etwas abstrakt stellt sich das Problem wie folgt dar:

Die Karte mit den Lieferung ist ein beliebig verzweigender, über der Knotenmarkierung parametrisierter Graph, dessen Kanten mit einer Kostenfunktion (für den Übergang entlang dieser Kante) gewichtet sind. Ein Pfadenthält eine Liste von Knotenmarkierungen, entlang derer der Pfad verläuft, sowie die Summe der Kosten der Übergänge (Kantengewichte). Wir suchen jetzt von den Pfaden, die alle Knoten im Graphen genau einmal enthalten und wieder zum Anfang zurückführen (Hamilton-Zyklen), diejenigen mit den kleinsten Kosten (mi- nimaler Hamilton-Zyklus).

Das Problem ist in der Literatur als dastravelling pizza delivery man problembekannt, und ist leider NP-vollständig.

Wir lösen es hier durchbrute force: wir erzeugen alle Zyklen, und filtern davon einen minimalen Hamilton- Zyklen heraus.

Im einzelnen gehen wir wie folgt vor:

1. Der Graph wird durch folgende Datentypen modelliert:

type Weight=Integer type Graph n=Node n data Node n=N n [Edge n]

data Edge n=E Weight (Node n)

Hierbei sollen zwei Knoten gleich sein, wenn ihre Markierung gleich ist.

2. Pfade werden wie folgt modelliert:

data Path a=P { cost :: Integer , path :: [a] } deriving Show

Implementieren Sie dazu folgende Operationen, welche einen Knoten mit einer Gewichtung zu einem Pfad hinzufügt, bzw. prüft, ob ein Knoten in einem Pfad enthalten ist:

add :: Path a→ Integer→ a→ Path a contains :: Eq a⇒ Path a→ a→ Bool

3. Implementieren Sie eine Funktion, welche alle von den angegebenen Startknoten ausgehenden Zyklen findet:

cycles :: Eq n⇒Node n→ [ Path n]

Die nötige Traversionsfunktion führt einen Pfad zu dem momentanen Knotennmit. Es werden alle von nausgehenden Kanten traversiert (und zu dem Pfad hinzugefügt), deren Zielknoten nicht in dem Pfad zunenthalten ist. Ist der Zielknoten wieder der Startknoten, dann haben wir einen Zyklus gefunden.

— Seite 1 von 2 —

(2)

Version 1.0 vom 07.11.2016

3. Übungsblatt Praktische Informatik 3, WS 16/17

A B

C

D

E F 1

1 9

9 1 1

1 1

Abbildung 1: Einfacher Beispielgraph

A

C

B

D 1

3

2 2

Abbildung 2: Beispielgraph ohne Hamilton-Zyklus

3 4

3 5

7

6 8

9

5

4 7

6 7 5 6

4 2

4

7 Neustadt

Kattenturm

Haben- hausen

Hemel- ingen Innenstadt

Viertel Schwach- hausen

Horn Uni

Findorff Walle

Gröpelingen

5

5

Abbildung 3: Die Pizzaliefertour als Graph. Wie man sieht, sind Toni Corleones Pizzen in der ganzen Stadt beliebt.

4. Wie wir in Abb. 2 sehen, haben nicht alle Graphen einen Hamilton-Zyklus. Wir brauchen deshalb noch eine Funktion

nodes :: Eq n⇒Node n→ [n]

numNodes :: Eq n⇒Node n→ I n t

welche die von einem Startknoten erreichbaren Knoten (auf)zählen. Mit dieser Funktion können wir Hamilton-Zyklen erkennen; es sind Pfade der LängenumNodes n+1.

5. Damit können wir dastravelling pizza delivery man problem lösen, indem wir den kürzesten Hamilton- Zyklus berechnen:

tpp :: Eq n⇒Node n→Maybe (Path n)

• Zuerst berechnen wir alle Zyklen, die vom Startknoten ausgehen;

• Aus der Ergebnisliste filtern wir alle Pfade, die nicht so lang sind wie die Anzahl der vom Startkno- ten erreichbaren Knoten;

• aus dieser Ergebnisliste, wenn sie nicht-leer ist, suchen wir den Pfad mit dem minimalsten Gesamt- kosten.

Abb. 3 zeigt die Pizzaliefertour als Graph. Dieser Graph ist auch in dem vorgegebenen Test-Rahmenwerk enthalten. Sie können ihn nutzen, um eigene Tests zu schreiben. Ihre Lösung sollte die kürzeste Pizzatour in diesem Graphen finden.

? Verständnisfragen

1. Was ist Polymorphie?

2. Welche zwei Arten der Polymorphie haben wir kennengelernt, und wie unterschieden sie sich?

3. Was ist der Unterschied zwischen Polymorphie in Haskell, und Polymorphie in Java?

— Seite 2 von 2 —

Referenzen

ÄHNLICHE DOKUMENTE

• Zu guter Letzt implementieren sie eine Funktion convergeCellular rule , welche so lange einen Zustands- übergang des zellulären Automaten mit der angegeben Regel durchführt bis

Steinle beschreibt die Zukunft demnach 72 als Leben in einem „Echtzeit-Datenfluss“ und sieht die Entwicklung vom „gläsernen Kun 73 - den [wird dann die] (zur)

Während die sedimentologischen Untersuchungen einen weitgehend unabhängigen Datensatz lieferten und damit, auch aufgrund der intensiven Vorarbeiten von Grobe (1986),

Das gilt etwa für den Zweiten Weltkrieg, in den er als Jugendlicher noch ziehen musste; das gilt ebenso für den Bau der Mauer 1961 und deren Fall 1989, aber auch das

Im Gegensatz zur Raupe des dunklen Lärchen-Ökotyps (siehe Abb. 4c) hat die helle Arvenform eine orangegelbe Kopfkapsel. Ausserdem ist ihr Vermehrungspotenzial geringer als

Gleiches gilt für Heranwach- sende (18- bis 21jährige), die an den Delikten Raub mit 19,3 Prozent und an Sachbeschädigungen mit 14,7 Pro- zent beteiligt sind. Aus der

Endlich wird mit großer fachli- cher Kompetenz überzeugend deut- lich gemacht, daß vielfach als veral- tet betrachtete Erziehungsgrundsät- ze wieder beachtet werden müssen, wenn

Wenn Sie mit einem messenden Tastsystem arbeiten, dann können Sie in der Betriebsart Positionieren mit Handeingabe Punkte-Tabellen erfassen, um einen beliebig