PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche...

39
PATHFINDING WITH PROLOG Simon Glumpler, Lukas Schelbert AAI HS16

Transcript of PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche...

Page 1: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

PATHFINDING WITH PROLOG

Simon Glumpler, Lukas Schelbert

AAI HS16

Page 2: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

INHALT

• Einführung

• Verwendung

• Pathfinding Algorithmen

• Prolog

• Pathfinding mit Prolog

Page 3: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

EINFÜHRUNG

• Meistens: Optimaler Weg zwischen zwei Punkten

• Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten

Hindernissen

• Große Anstrengungen um Pathfinding-Algorithmen zu optimieren

• Reduzierung von Laufzeit und Speicherbedarf

Page 4: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

VERWENDUNG

• Games

• Routen-Planer

• Autonomes Navigieren

Page 5: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

PATHFINDING ALGORITHMEN

• Depth First Search

• Breadth First Search

• Dijkstra

• A*

Page 6: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

DEPTH FIRST SEARCH

S

1

862 4

5

97 103

Page 7: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

DEPTH FIRST SEARCH

• Einfach zu implementieren

• Gefundener Pfad ist nicht immer der kürzeste Pfad

• Berücksichtigt Pfadkosten nicht

Page 8: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

BREADTH FIRST SEARCH

S

1

653 4

2

98 107

Page 9: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

BREADTH FIRST SEARCH

• Einfach zu implementieren

• Findet immer kürzesten Pfad

• Schlechte Laufzeit

• Berücksichtigt Pfadkosten nicht

Page 10: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

DJIKSTRA

0

1 ?

4

7

6

2 3

1

7

32

4

Page 11: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

0

1 7

3

7

6

2 3

1

7

32

4

DJIKSTRA

Page 12: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

0

1 6

3

5

6

2 3

1

7

32

4

DJIKSTRA

Page 13: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

0

1 6

3

5

6

2 3

1

7

32

4

DJIKSTRA

Page 14: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

0

1 6

3

5

6

2 3

1

7

32

4

DJIKSTRA

Page 15: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

DIJKSTRA

• Berücksichtigt Pfadkosten

• Greedy Algorithmus

• Kann nicht mit negativen Kantengewichten umgehen

Page 16: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

A*

• Erweiterter Dijkstra-Algorithmus

• Nutzt Kenntnisse über die Suchstruktur zum Vorteil aus -> Heuristiken

• z. B. Luftlinie bzw. Euklidische Distanz

• Nächster zu besuchender Knoten wird gewählt mit

• Kosten total = Kosten bisher + geschätzte weitere Kosten

• Der nächste Knoten ist der mit den geringsten totalen Kosten

Page 17: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

A*

• Schnellster Algorithmus für Pathfinding (falls Heuristik gut gewählt)

• Findet immer optimale Lösung

• Eventuell grosser Speicherverbrauch

Page 18: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

PROLOG

• Deklarative Programmiersprache

• Wichtigste Logische Programmiersprache

• Programmation en Logique

• Alain Colmerauer

• Anfang 70er-Jahre

• Verschiedene Syntax-Dialekte und Implemenationen

• Computerlinguistik und Künstliche Intelligenz

• KI-Systems Watson aus Jeopardy!

Page 19: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

PROLOG

• Wissensdatenbank (Fakten und Regeln)

• Anfragen an die Wissensdatenbank

• Resultat: True wenn ableitbar, sonst False

• Hello-World-Beispiel ist eine Wissensdatenbank mit Stammbauminformationen

Page 20: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

PROLOG

Wissensdatenbank:

mann(adam).

mann(tobias).

frau(eva).

vater(adam,tobias).

mutter(eva,tobias).

Anfragen:

?- mann(tobias). => yes.

?- mann(stefan). => no.

?- mann(X).

X=adam

X=tobias

Page 21: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

PROLOG

Relgeloperator :-

grossvater(X,Y) :- vater(X,Z), vater(Z,Y).

grossvater(X,Y) :- vater(X,Z), mutter(Z,Y).

?- grossvater(adam,anna). => yes.

?- grossvater(X,frank). => X=adam

Page 22: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

PROLOG

Listen

[1,2,3,4] => Head: 1 und Tail: [2,3,4]

=> [ 1, [ 2, [ 3, [ 4, [] ] ] ] ]

Page 23: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

PROLOG

member(X, [X|_]).

member(X, [_|T]) :- member(X, T).

?- member(2, ['anton', 'berta', 'caesar']).

false.

?- member('berta', ['anton', 'berta', 'caesar']).

true.

Page 24: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

CODE BEISPIEL

• Bahnverbindungen

• Kürzeste Verbindung

• Wissensdatenbank:

kante(saintgall, zurich, 80). kante(zurich, basel, 85).

kante(basel, bern, 100). kante(fribourg, lausanne, 10).

kante(lausanne , geneve, 68). kante(zurich , bern, 120).

kante(bern, fribourg, 10). kante(bern , neuchatel, 48).

kante(neuchatel , lausanne, 78). kante(zurich , solothurn, 99).

kante(solothurn , biel, 27). kante(biel , neuchatel, 29).

Page 25: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

CODE BEISPIEL

• Ziel:

?- go(zurich,geneve,Route).

Route = [zurich,bern,fribourg,lausanne,geneve]

Page 26: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

CODE BEISPIEL

go(Start, Dest, Route) :-

kurz_pfad([r(0, [Start])], Dest, R),

reverse(R, Route).

[ r( 0, [ Start ] ) ]

Page 27: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

CODE BEISPIEL

kurz_pfad([r(0, [Start])], Dest, R):

kurz_pfad(Routes, Dest, Route) :-

shortest(Routes, Shortest, RestRoutes),

proceed(Shortest, Dest, RestRoutes, Route).

Page 28: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

CODE BEISPIEL

shortest(Routes, Shortest, RestRoutes):

shortest([Route|Routes], Shortest, [Route|Rest]):-

shortest(Routes, Shortest, Rest),

shorter(Shortest, Route),

!.

shorter(r(M1,_), r(M2,_)):- M1 < M2.

Page 29: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

CODE BEISPIEL

proceed(Shortest, Dest, RestRoutes, Route):

proceed(r(Dist, [Last|Trail]), Dest, Routes, Route):-

findall(

r(D1, [Z, Last|Trail]),

legalnode(Last, Trail, Z, Dist, D1),

List

),

append(List, Routes, NewRoutes),

kurz_pfad(NewRoutes, Dest, Route).

Page 30: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

CODE BEISPIEL

legalnode(Last, Trail, Z, Dist, D1):

legalnode(X, Trail, Y, Dist, NewDist) :-

(kante(X, Y, Z); kante(Y, X, Z)),

legal(Y, Trail),

NewDist is Dist + Z.

Page 31: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

CODE BEISPIEL

go(Start, Dest, Route) :-

kurz_pfad([r(0, [Start])], Dest, R),

reverse(R, Route).

kurz_pfad(Routes, Dest, Route) :-

shortest(Routes, Shortest, RestRoutes),

proceed(Shortest, Dest, RestRoutes, Route).

Page 32: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

CODE BEISPIEL

shortest: Sucht die aktuell kürzeste Route

proceed: Sucht alle benachbarte Knoten des temporären Endpunktes der

kürzesten Route. Anschliessend wird auf alle gesammelten Routen

wieder die Methode kurz_pfad aufgerufen.

Page 33: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen
Page 34: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen
Page 35: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen
Page 36: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen
Page 37: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen
Page 38: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

DEMO

Page 39: PATHFINDING WITH PROLOG fileEINFÜHRUNG •Meistens: Optimaler Weg zwischen zwei Punkten •Suche nach der kostengünstigsten oder kürzesten Route mit den wenigsten Hindernissen

FRAGEN?