Maze Solving Algorithmus?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Schau dir mal den A* Algorithmus an, ich denke der könnte dir weiterhelfen :)

gamestar4124 
Fragesteller
 03.12.2020, 14:58

Sollte ich den noch optimieren? Also an jeder kreuzung ein Node, oder so lassen?

0
drehorgel5000  03.12.2020, 15:34
@gamestar4124

Das ist dir überlassen, wenn du mehr Geschwindigkeit brauchst/dich daran versuchen willst, dann auf geht's :D

1

Da macht man auf die freien Koordinaten im Labyrinth einen Flood-Fill, bei dem man die Ausbreitungsgeschwindigkeit von den einzelnen gefluteten Koordinaten über eine prioritätsgerecht umsortierte Prozeßwarteschlange ausbalanciert. Der Flood-Fill soll sich übrigens nicht wieder an eine bereits besuchte Koordinate ausbreiten. Kam der Flood-Fill ans Ziel, markiert man den Weg der Aufrufe über die noch bestehenden Einträge mit Vorgänger-IDs der Prozeßwarteschlange rückwärts. Das ist zwar nicht das laufzeitschnellste, aber dafür das problemumfassendste Verfahren. Es gehen sogar mehrere Pfade direkt der Länge nach.

bis ich gemerkt habe, dass das ja garnicht in C# geht xD

Hä? Natürlich geht Rekursion mit C#. Genauso wie in jeder anderen Sprache auch.

Dann hab ich per While loop einfach immer geguckt welche Richtungen sind möglich und dann halt random eine Richtung gewählt. Wenns deadend ist, halt wieder zurück, bis eine unbesichtigte Zelle kommt. Vllt habt ihr ja eine Idee wie der heißt.

Sowas nennt sich BackTracking-Algorithmus.

gamestar4124 
Fragesteller
 03.12.2020, 11:51

Rekursion endet bei mir im Stack overflow?

0
ohwehohach  03.12.2020, 12:08
@gamestar4124

Dann hast Du sie falsch programmiert (= ohne Abbruchkriterium). Das ist kein Markenzeichen von C#, sondern von einer nicht endenden Rekursion und kann Dir in jeder Programmiersprache geschehen.

0
gamestar4124 
Fragesteller
 03.12.2020, 12:11
@ohwehohach

Nein. Es funktionierte, solange die Distanz sehr gering war. Ging es aber um längere Wege, dann brach er ab.

Laut Recherche optimiert der Compiler nicht für tail recursion.

0
ohwehohach  03.12.2020, 12:19
@gamestar4124

Nun, natürlich kommt es auf die Rekursionstiefe an dabei. Aber Du könntest Dir mit Trampolining helfen. Es ging mir nur um die generelle Behauptung, dass Rekursion in C# nicht möglich ist. Das stimmt nämlich nicht. Dass sie vielleicht in Deinem Fall nicht die zielführende Lösung ist, steht ja auf einem anderen Zettel.

Jeder rekursive Algorithmus kann aber in einen iterativen überführt werden - und das hast Du ja getan, somit: Kein Problem vorhanden.

0
gamestar4124 
Fragesteller
 03.12.2020, 12:23
@ohwehohach

Ja klar, dass Rekursion möglich ist ist mir klar. Aber bei 10k x 10k kannst dir ja die tiefe dabei ausdenken 😅

Mit dem wallfollower hab ich so um die 90mio steps und mit wave propagation 11k steps (der path jetzt)

0