Irrgarten-Generationsalgorithmus

Irrgarten-Generationsalgorithmen sind automatisierte Methoden für die Entwicklung von Irrgärten.

Graph-Theorie hat Methoden gestützt

Ein Irrgarten kann durch das Starten mit einer vorher bestimmten Einordnung von Zellen erzeugt werden (meistens ein rechteckiger Bratrost, aber andere Maßnahmen sind möglich) mit Wandseiten zwischen ihnen. Diese vorher bestimmte Einordnung kann als ein verbundener Graph mit den Rändern betrachtet werden, die mögliche Wandseiten und die Knoten vertreten, die Zellen vertreten. Wie man dann betrachten kann, macht der Zweck des Irrgarten-Generationsalgorithmus einen Subgraphen, wo es schwierig ist, um einen Weg zwischen zwei besonderen Knoten zu finden.

Wenn der Subgraph nicht verbunden wird, dann gibt es Gebiete des Graphen, die vergeudet werden, weil sie zum Suchraum nicht beitragen. Wenn der Graph Schleifen enthält, dann kann es vielfache Pfade zwischen den gewählten Knoten geben. Wegen dessen wird Irrgarten-Generation häufig als das Erzeugen eines zufälligen Überspannen-Baums genähert. Schleifen, die naiven Irrgarten solvers verwechseln können, können durch das Hinzufügen zufälliger Ränder zum Ergebnis während des Kurses des Algorithmus eingeführt werden.

Tiefensuche

Dieser Algorithmus ist eine randomized Version des Tiefensuche-Algorithmus. Oft durchgeführt mit einem Stapel ist diese Annäherung eine der einfachsten Weisen, einen Irrgarten mit einem Computer zu erzeugen. Denken Sie den Raum für einen Irrgarten, der ein großer Bratrost von Zellen (wie ein großes Schachbrett), jede Zelle ist, die mit vier Wänden anfängt. Von einer zufälligen Zelle anfangend, wählt der Computer dann eine zufällige benachbarte Zelle aus, die noch nicht besucht worden ist. Der Computer entfernt die 'Wand' zwischen den zwei Zellen und fügt die neue Zelle zu einem Stapel hinzu (das ist der Zeichnung der Linie auf dem Fußboden analog). Der Computer setzt diesen Prozess mit einer Zelle fort, die keine verlassenen Nachbarn hat, die als eine Sackgasse betrachten werden. Wenn an einer Sackgasse es durch den Pfad denselben Weg zurückverfolgt, bis es eine Zelle mit einem verlassenen Nachbar erreicht, die Pfad-Generation durch den Besuch dieser neuen, verlassenen Zelle fortsetzend (einen neuen Verbindungspunkt schaffend). Dieser Prozess geht weiter, bis jede Zelle besucht worden ist, den Computer veranlassend, den ganzen Weg zurück zur beginnenden Zelle denselben Weg zurückzuverfolgen. Diese Annäherung versichert, dass der Irrgarten-Raum völlig besucht wird.

Wie festgesetzt, ist der Algorithmus sehr einfach und erzeugt allzu komplizierte Irrgärten nicht. Spezifischere Verbesserungen zum Algorithmus können helfen, Irrgärten zu erzeugen, die härter sind zu lösen.

  1. Fangen Sie an einer besonderen Zelle an und nennen Sie sie den "Ausgang".
  2. Kennzeichnen Sie die aktuelle Zelle, wie besucht, und bekommen Sie eine Liste seiner Nachbarn. Für jeden Nachbar, mit einem zufällig ausgewählten Nachbar anfangend:
  3. Wenn dieser Nachbar nicht besucht worden ist, die Wand zwischen dieser Zelle und dass Nachbar entfernt, und dann mit diesem Nachbar als die aktuelle Zelle wiederflucht.

Wie gegeben, über diesem Algorithmus schließt tiefen recursion ein, der Stapel-Überschwemmungsprobleme auf einigen Computerarchitekturen verursachen kann. Der Algorithmus kann in eine Schleife durch die Speicherung der denselben Weg zurückverfolgenden Information im Irrgarten selbst umgeordnet werden. Das stellt auch eine schnelle Weise zur Verfügung, eine Lösung, durch das Starten an jedem gegebenen Punkt und das Zurückverfolgen zum Ausgang zu zeigen.

Mit einer Tiefensuche erzeugte Irrgärten haben einen niedrigen sich verzweigenden Faktor und enthalten viele lange Gänge, der Tiefe zuerst einen guten Algorithmus macht, für Irrgärten in Videospielen zu erzeugen. Zufällig kann das Entfernen mehrerer Wände nach dem Schaffen eines DFS-Irrgartens seine Gänge weniger schmal machen, der in Situationen passend sein kann, wo die Schwierigkeit, den Irrgarten zu lösen, nicht wichtig ist. Das kann auch in Videospielen günstig sein.

In durch diesen Algorithmus erzeugten Irrgärten wird es normalerweise relativ leicht sein, den Weg zum Quadrat zu finden, das zuerst am Anfang des Algorithmus aufgepickt wurde, da die meisten Pfade führen oder von dort, aber es ist hart, den Ausweg zu finden.

Rekursiver backtracker

Der Tiefensuche-Algorithmus der Irrgarten-Generation wird oft mit dem Zurückverfolgen durchgeführt:

  1. Machen Sie die anfängliche Zelle die aktuelle Zelle und kennzeichnen Sie es, wie besucht
,
  1. Während es verlassene Zellen gibt
  1. Wenn die aktuelle Zelle irgendwelche Nachbarn hat, die nicht besucht worden sind
  1. Wählen Sie zufällig einen der verlassenen Nachbarn
  1. Stoßen Sie die gewählte Zelle zum Stapel
  1. Entfernen Sie die Wand zwischen der aktuellen Zelle und der gewählten Zelle
  1. Machen Sie die gewählte Zelle die aktuelle Zelle und kennzeichnen Sie es, wie besucht
,
  1. Sonst
  1. Lassen Sie eine Zelle vom Stapel knallen
  1. Machen Sie es die aktuelle Zelle

Der Algorithmus von Randomized Kruskal

Dieser Algorithmus ist eine randomized Version des Algorithmus von Kruskal.

  1. Schaffen Sie eine Liste aller Wände, und schaffen Sie einen Satz für jede Zelle, jeder, gerade dass eine Zelle enthaltend.
  2. Für jede Wand, in einer zufälligen Ordnung:
  3. Wenn die durch diese Wand geteilten Zellen verschiedenen Sätzen gehören:
  4. Entfernen Sie die aktuelle Wand.
  5. Schließen Sie sich den Sätzen der früher geteilten Zellen an.

Es gibt mehrere Datenstrukturen, die verwendet werden können, um die Sätze von Zellen zu modellieren. Eine effiziente Durchführung mit einer Datenstruktur des zusammenhanglosen Satzes kann jede Vereinigung durchführen und Operation auf zwei Sätzen in der fast unveränderlichen amortisierten Zeit finden (spezifisch, Zeit;

Es ist wenig von Bedeutung, ob die Liste von Wänden am Anfang randomized ist, oder wenn eine Wand aus einer nichtzufälligen Liste zufällig gewählt wird, ist jeder Weg so leicht zu codieren.

Weil die Wirkung dieses Algorithmus ist, einen minimalen Überspannen-Baum von einem Graphen mit ebenso belasteten Rändern zu erzeugen, neigt es dazu, regelmäßige Muster zu erzeugen, die ziemlich leicht sind zu lösen.

Der Algorithmus von Randomized Prim

Dieser Algorithmus ist eine randomized Version des Algorithmus von Prim.

  1. Fangen Sie mit einem mit Wänden vollen Bratrost an.
  2. Picken Sie eine Zelle auf, kennzeichnen Sie sie als ein Teil des Irrgartens. Fügen Sie die Wände der Zelle zur Wandliste hinzu.
  3. Während es gibt, mauert sich die Liste ein:
  4. Picken Sie eine zufällige Wand von der Liste auf. Wenn die Zelle auf der Gegenseite nicht im Irrgarten noch ist:
  5. Machen Sie die Wand einen Durchgang und kennzeichnen Sie die Zelle auf der Gegenseite als ein Teil des Irrgartens.
  6. Fügen Sie die benachbarten Wände der Zelle zur Wandliste hinzu.
  7. Wenn die Zelle auf der Gegenseite bereits im Irrgarten war, entfernen Sie die Wand von der Liste.

Wie die Tiefe der erste Algorithmus wird es gewöhnlich relativ leicht sein, den Weg zur Startzelle zu finden, aber hart den Weg irgendwo anders zu finden.

Bemerken Sie, dass einfach das Laufen klassischen Prims auf einem Graphen mit zufälligen Gewichten Kruskal stilistisch identische Irrgärten schaffen würde, weil sie beide minimale Überspannen-Baumalgorithmen sind. Statt dessen führt dieser Algorithmus stilistische Schwankung ein, weil die am Startpunkt näheren Ränder ein niedrigeres wirksames Gewicht haben.

Modifizierte Version

Obwohl der Algorithmus des klassischen Prims eine Liste von Rändern für die Irrgarten-Generation behält, konnten wir stattdessen eine Liste von angrenzenden Zellen aufrechterhalten. Wenn die zufällig gewählte Zelle vielfache Ränder hat, die sie mit dem vorhandenen Irrgarten verbinden, einen dieser Ränder aufs Geratewohl auswählen. Das wird zum Zweig ein bisschen mehr neigen als die Rand-basierte Version oben.

Rekursive Abteilungsmethode

Irrgärten können mit der rekursiven Abteilung, ein Algorithmus geschaffen werden, der wie folgt arbeitet: Beginnen Sie mit dem Raum des Irrgartens ohne Wände. Nennen Sie das einen Raum. Teilen Sie den Raum mit einer zufällig eingestellten Wand (oder vielfache Wände), wo jede Wand einen zufällig eingestellten Durchgang enthält, der sich innerhalb seiner öffnet. Wiederholen Sie dann rekursiv den Prozess auf den Subräumen, bis alle Räume nach Größen geordnet minimal sind. Diese Methode läuft auf Irrgärten mit langen geraden Wänden hinaus, die ihren Raum durchqueren, es leichter machend, der Gebiete zu sehen, zu vermeiden.

Zum Beispiel, in einem rechteckigen Irrgarten, bauen Sie aufs Geratewohl Punkte zwei Wände, die auf einander rechtwinklig sind. Diese zwei Wände teilen den großen Raum in vier kleinere durch vier Wände getrennte Räume. Wählen Sie drei der vier Wände aufs Geratewohl, und öffnen Sie ein weite Zelle Loch an einem zufälligen Punkt in jedem der drei. Machen Sie auf diese Weise rekursiv weiter, bis jeder Raum eine Breite einer Zelle in jeder der zwei Richtungen hat.

Einfache Algorithmen

Andere Algorithmen bestehen, die verlangen, dass nur genug Gedächtnis eine Linie eines 2. Irrgartens oder ein Flugzeug eines 3D-Irrgartens versorgt. Sie verhindern Schleifen, indem sie versorgen, welche Zellen in der aktuellen Linie durch Zellen in den vorherigen Linien verbunden werden, und nie Wände zwischen irgendwelchen zwei bereits verbundenen Zellen entfernen.

Die meisten Irrgarten-Generationsalgorithmen verlangen das Aufrechterhalten von Beziehungen zwischen Zellen innerhalb seiner, um sicherzustellen, dass das Endergebnis lösbar sein wird. Gültige einfach verbundene Irrgärten können jedoch erzeugt werden, indem sie auf jede Zelle unabhängig konzentriert wird. Ein binärer Baumirrgarten ist ein orthogonaler Standardirrgarten, wo jede Zelle immer einen Durchgang hat, der führt oder verlassen, aber nie beide führt. Um einen binären Baumirrgarten für jede Zelle zu schaffen, schnipsen eine Münze, um zu entscheiden, ob man eine Durchgang-Führung oder verlassen zusammenzählt. Picken Sie immer dieselbe Richtung für Zellen an der Grenze auf, und das Endergebnis wird ein gültiger einfach verbundener Irrgarten sein, der wie ein binärer Baum, mit der oberen linken Ecke seine Wurzel aussieht.

Eine zusammenhängende Form, eine Münze für jede Zelle zu schnipsen, soll ein Image mit einer zufälligen Mischung des Vorwärtshiebs und der Charaktere des umgekehrten Schrägstrichs schaffen. Das erzeugt keinen gültigen einfach verbundenen Irrgarten, aber eher eine Auswahl an geschlossenen Regelkreisen und unicursal Durchgängen. (Das Handbuch für den Kommodore 64 Geschenke ein GRUNDLEGENDES Programm mit diesem Algorithmus, aber mit PETSCII Diagonale-Linienschriftzeichen stattdessen für ein glatteres grafisches Äußeres.)

Zellautomaten-Algorithmen

Bestimmte Typen von Zellautomaten können verwendet werden, um Irrgärten zu erzeugen. Zwei wohl bekannte solche Zellautomaten, Maze und Mazectric, haben rulestrings 12345/3 und 1234/3. Im ersteren bedeutet das, dass Zellen von einer Generation zum folgenden überleben, wenn sie mindestens einen und höchstens fünf Nachbarn haben. In den Letzteren bedeutet das, dass Zellen überleben, wenn sie einen bis vier Nachbarn haben. Wenn eine Zelle genau drei Nachbarn hat, ist sie geboren. Es ist dem Spiel von Conway des Lebens darin Muster ähnlich, die keine lebende Zelle neben 1, 4 haben, oder sich 5 andere lebende Zellen in jeder Generation identisch dazu benehmen werden. Jedoch, für große Muster, benimmt es sich sehr verschieden.

Für ein zufälliges Startmuster werden sich diese Irrgarten erzeugenden Zellautomaten zu komplizierten Irrgärten mit bestimmten Wänden entwickeln, die Gänge entwerfen. Mazecetric, der die Regel 1234/3 hat, hat eine Tendenz, längere und geradere Gänge im Vergleich zum Irrgarten mit der Regel 12345/3 zu erzeugen. Da diese Zellautomat-Regeln deterministisch sind, wird jeder erzeugte Irrgarten durch sein zufälliges Startmuster einzigartig bestimmt. Das ist ein bedeutender Nachteil, da die Irrgärten dazu neigen, relativ voraussagbar zu sein.

Wie einige von gestützten Methoden der Graph-Theorie, die oben beschrieben sind, erzeugen diese Zellautomaten normalerweise Irrgärten von einem einzelnen Startmuster; folglich wird es gewöhnlich relativ leicht sein, den Weg zur Startzelle, aber härter zu finden, den Weg irgendwo anders zu finden.

Pythonschlange-Codebeispiel

importieren Sie numpy als np

von numpy.random importieren random_integers als rnd

importieren Sie matplotlib.pyplot als plt

Def-Irrgarten (width=81, height=51, Kompliziertheit =. 75, Dichte =.75):

# Nur sonderbare Gestalten

formen Sie sich = ((Höhe//2) *2+1, (Breite//2) *2+1)

# Passen Kompliziertheit und Dichte hinsichtlich der Irrgarten-Größe An

Kompliziertheit = interne Nummer (Kompliziertheit * (5 * (Gestalt [0] +shape [1])))

Dichte = interne Nummer (Dichte * (Gestalt [0]//2*shape [1]//2))

# Bauen wirklichen Irrgarten

Z = np.zeros (Gestalt, dtype=bool)

# Füllen Grenzen

Z [0:] = Z [-1:] = 1

Z [: 0] = Z [:-1] = 1

# Machen Inseln

weil ich in der Reihe (Dichte):

x, y = rnd (0, Gestalt [1]//2) *2, rnd (0, Gestalt [0]//2) *2

Z [y, x] = 1

für j in der Reihe (Kompliziertheit):

Nachbarn = []

wenn x> 1: neighbours.append ((y, x-2))

wenn x

wenn y

Siehe auch

Links

,

Alfred Chester Beatty / Prinz Charles Alexander von Lorraine
Impressum & Datenschutz