Hallo Algo-Experten,
ich habe einen Generator programmiert, der zufällige Labyrinthe erstellt. Dafür benutze ich die java.util.Random-Klasse. Über Backtracking bekomme ich raus, ob wenigstens ein Weg zum Ziel gefunden wird.
Zuerst erstelle ich Eingang am Rand in irgendeinem Viertel der Gesamtfläche, danach das Ziel im gegenüberliegenden Viertel, damit Eingang und Ziel stets voneinander entfernt sind. Das klappt auch sehr gut.
Das Problem sind die Wege und Mauern zu realisieren. Dazu habe ich schon verschiedene Möglichkeiten ausprobiert:
1. nur Mauern und dann per Zufall jeweils ein Weg-Element setzen, solange bis ein Weg gefunden wurde
2. nur Wege und dann per Zufall jeweils ein Mauer-Element setzen, bis nur noch ein Weg gefunden wurde
3. per Zufall Mauer- und Weg-Elemente setzen, bis ein Weg gefunden wurde
Alle 3 Möglichkeiten haben einen gravierenden Nachteil. Je größer das Labyrinth, desto länger dauert die Berechnung, weil ich für jedes Einzel-Element die recursive Wegberechnung durchführe.
Zeitdauer (ca.):
6x6 = 15s
10x10 = 3min
15x15 = 10min
Ein weiteres Problem besteht darin, daß ich > 15x15 stets "StackOverflow"-Error bekomme. Das liegt höchstwarscheinlich daran, daß der GC mit dem Aufräumen meiner Maps nicht mehr hinterher kommt.
In meiner Not fing ich an, ohne Weg-Check eine bestimmte Anzahl an Feldern mit Mauern per Zufall zu belegen und den Weg-Check danach erst durchzuführen. Die Performancegewinne halten sich in Grenzen (15x15 immernoch ca. 7min), dafür sind die so kreierten Labyrinthe öfters nicht lösbar (Weg = 0), also auch nicht der Weisheit letzter Schluß.
Eine andere Möglichkeit war, solange fertige Labyrinthe zu erzeugen, bis ich "per Zufall" mindestens einen Weg finde. Auch wenn ich nun die Wegfindung erst mit dem kompletten Labyrinth beginne, ist die Performance extrem schlecht (10x10 bereits > 10min), da ich nun viel zu viele "Nieten" bekomme, ehe ich ein Labyrinth mit wenigstens einem Weg erhalte. :suspekt:
Schlau wollte ich sein. Erstelle nun den Lösungsweg per Zufall und fülle den Rest mit Mauern und Wegen per Zufall auf. Die Performance ist toll, jedoch das Labyrinth viel zu leicht. Nun habe ich eine Vielzahl offensichtlicher Wege, also zu leicht. Mit nur Mauern aufzufüllen ist ebenfalls viel zu leicht. Die einzige Lösung sticht sofort ins Auge.
Gibt es nicht irgend einen sinnvolleren performanteren Weg zum Ziel zu kommen?
Bin schon arg am verzweifeln.
ich habe einen Generator programmiert, der zufällige Labyrinthe erstellt. Dafür benutze ich die java.util.Random-Klasse. Über Backtracking bekomme ich raus, ob wenigstens ein Weg zum Ziel gefunden wird.
Zuerst erstelle ich Eingang am Rand in irgendeinem Viertel der Gesamtfläche, danach das Ziel im gegenüberliegenden Viertel, damit Eingang und Ziel stets voneinander entfernt sind. Das klappt auch sehr gut.
Das Problem sind die Wege und Mauern zu realisieren. Dazu habe ich schon verschiedene Möglichkeiten ausprobiert:
1. nur Mauern und dann per Zufall jeweils ein Weg-Element setzen, solange bis ein Weg gefunden wurde
2. nur Wege und dann per Zufall jeweils ein Mauer-Element setzen, bis nur noch ein Weg gefunden wurde
3. per Zufall Mauer- und Weg-Elemente setzen, bis ein Weg gefunden wurde
Alle 3 Möglichkeiten haben einen gravierenden Nachteil. Je größer das Labyrinth, desto länger dauert die Berechnung, weil ich für jedes Einzel-Element die recursive Wegberechnung durchführe.

Zeitdauer (ca.):
6x6 = 15s
10x10 = 3min
15x15 = 10min
Ein weiteres Problem besteht darin, daß ich > 15x15 stets "StackOverflow"-Error bekomme. Das liegt höchstwarscheinlich daran, daß der GC mit dem Aufräumen meiner Maps nicht mehr hinterher kommt.

In meiner Not fing ich an, ohne Weg-Check eine bestimmte Anzahl an Feldern mit Mauern per Zufall zu belegen und den Weg-Check danach erst durchzuführen. Die Performancegewinne halten sich in Grenzen (15x15 immernoch ca. 7min), dafür sind die so kreierten Labyrinthe öfters nicht lösbar (Weg = 0), also auch nicht der Weisheit letzter Schluß.

Eine andere Möglichkeit war, solange fertige Labyrinthe zu erzeugen, bis ich "per Zufall" mindestens einen Weg finde. Auch wenn ich nun die Wegfindung erst mit dem kompletten Labyrinth beginne, ist die Performance extrem schlecht (10x10 bereits > 10min), da ich nun viel zu viele "Nieten" bekomme, ehe ich ein Labyrinth mit wenigstens einem Weg erhalte. :suspekt:
Schlau wollte ich sein. Erstelle nun den Lösungsweg per Zufall und fülle den Rest mit Mauern und Wegen per Zufall auf. Die Performance ist toll, jedoch das Labyrinth viel zu leicht. Nun habe ich eine Vielzahl offensichtlicher Wege, also zu leicht. Mit nur Mauern aufzufüllen ist ebenfalls viel zu leicht. Die einzige Lösung sticht sofort ins Auge.

Gibt es nicht irgend einen sinnvolleren performanteren Weg zum Ziel zu kommen?

Bin schon arg am verzweifeln.
