Dieser klassische Beitrag beschreibt die beliebtesten Methoden zum Erstellen und Durchlaufen von Labyrinthen. Der Artikel ist in vier Teile gegliedert: Klassifizierung, Generierungsalgorithmen, Algorithmen zum Lösen von Labyrinthen und andere Operationen mit Labyrinthen.Labyrinthklassifikation
Die Labyrinthe als Ganzes (und damit die Algorithmen zu ihrer Erstellung) können in sieben verschiedene Klassifikationen unterteilt werden: Dimension, Hyperdimension, Topologie, Tessellation, Routing, Textur und PrioritÀt. Das Labyrinth kann ein Element aus jeder Klasse in einer beliebigen Kombination verwenden.
Dimension: Die Dimensionsklasse bestimmt im Wesentlichen, wie viele Dimensionen im Raum das Labyrinth ausfĂŒllt. Folgende Typen stehen zur VerfĂŒgung:

Zweidimensional : Die meisten Labyrinthe, sowohl Papier als auch Real, haben diese Dimension. Das heiĂt, wir können den Plan des Labyrinths immer auf einem Blatt Papier anzeigen und uns entlang bewegen, ohne andere Korridore des Labyrinths zu ĂŒberqueren.- Dreidimensional : Das dreidimensionale Labyrinth hat mehrere Ebenen. darin (zumindest in der orthogonalen Version) können Passagen zusĂ€tzlich zu den vier Himmelsrichtungen nach unten und nach oben gehen. Ein 3D-Labyrinth wird hĂ€ufig als eine Reihe von 2D-Ebenen mit Treppen nach oben und unten dargestellt.

Höhere Dimensionen : Sie können vierdimensionale und noch mehrdimensionale Labyrinthe erstellen. Manchmal werden sie als 3D-Labyrinthe mit âPortalenâ dargestellt, die durch die vierte Dimension fĂŒhren, z. B. Portale in die âVergangenheitâ und âZukunftâ.
Verflechtung : Labyrinthe mit Verflechtung - dies sind im Wesentlichen zweidimensionale (oder eher 2,5-dimensionale) Labyrinthe, in denen sich jedoch Passagen ĂŒberlappen können. Bei der Anzeige ist es normalerweise ziemlich offensichtlich, wo sich die Sackgassen befinden und wie sich ein Durchgang ĂŒber dem anderen befindet. Labyrinthe aus der realen Welt, in denen BrĂŒcken einen Teil des Labyrinths mit einem anderen verbinden, sind teilweise miteinander verflochten.
Hyperdimension: Die Klassifizierung nach
Hyperdimension entspricht der Dimension eines Objekts, das sich durch ein Labyrinth bewegt, und nicht dem Labyrinth selbst. Folgende Typen stehen zur VerfĂŒgung:

Nicht-Hyperlabyrinthe : Fast alle Labyrinthe, auch solche, die in hoher DimensionalitĂ€t oder mit speziellen Regeln erstellt wurden, sind normalerweise Nicht-Hyperlabyrinthe. In ihnen arbeiten wir mit einem Punkt oder einem kleinen Objekt, zum Beispiel einem Ball oder dem Spieler selbst, der sich von Punkt zu Punkt bewegt, und die asphaltierte Route bildet eine Linie. An jedem Punkt gibt es eine leicht zĂ€hlbare Anzahl von Auswahlmöglichkeiten.- Hyperlabyrinthe: Hyperlabyrinthe sind Labyrinthe, in denen das zu lösende Objekt nicht nur ein Punkt ist. Ein Standardhyperlabyrinth (oder Hyperlabyrinth erster Ordnung) besteht aus einer Linie, die eine OberflĂ€che bildet, wenn sie sich entlang eines Pfades bewegt. Hyperlabyrinth kann nur in 3D oder in einem Medium mit einer gröĂeren Dimension existieren, und der Eingang zum Hyperlabyrinth ist oft kein Punkt, sondern eine Linie. Hyperlabyrinth ist grundlegend anders, weil es notwendig ist, mehrere Teile entlang der Linie zu berĂŒcksichtigen und gleichzeitig mit ihnen zu arbeiten, und zu jedem Zeitpunkt gibt es eine nahezu unendliche Anzahl von ZustĂ€nden und Optionen fĂŒr das, was mit der Linie getan werden kann. Die Lösungslinie ist unendlich oder ihre Endpunkte liegen auĂerhalb des Hyperlabyrinths, um zu vermeiden, dass die Linie zu einem Punkt komprimiert wird, da sie in diesem Fall als Nicht-Hyperlabyrinth betrachtet werden kann.
- Hyperhyperlabyrinth: Hyperlabyrinthe können beliebig hoch dimensioniert sein. Hyperhyperlabyrinth (oder Hyperlabyrinth zweiter Ordnung) erhöht erneut die Dimension des zu lösenden Objekts. Hier ist das zu lösende Objekt eine Ebene, die, wenn sie sich entlang des Pfades bewegt, eine dreidimensionale Figur bildet. Hyperhyperlabyrinth kann nur in einer 4D- oder höherdimensionalen Umgebung existieren.
Topologie: Die Topologieklasse beschreibt die Geometrie des Labyrinthraums, in dem er als Ganzes existiert. Folgende Typen stehen zur VerfĂŒgung:

Normal : Dies ist das Standardlabyrinth im euklidischen Raum.
Planair : Der Begriff âPlanairâ beschreibt jedes Labyrinth mit einer ungewöhnlichen Topologie. In der Regel bedeutet dies, dass die RĂ€nder des Labyrinths auf interessante Weise miteinander verbunden sind. Beispiele: Labyrinthe auf der OberflĂ€che eines WĂŒrfels, Labyrinthe auf der OberflĂ€che eines Mobius-Streifens und Labyrinthe, die denen eines Torus entsprechen, bei dem die linke und rechte, obere und untere Seite paarweise verbunden sind.
Tessellation: Eine Klassifizierung der Geometrie der einzelnen Zellen, aus denen das Labyrinth besteht. Bestehende Typen:

Orthogonal : Dies ist ein rechteckiges Standardgitter, in dem Zellen Passagen haben, die sich im rechten Winkel schneiden. Im Rahmen der Tessellation können sie auch als Gammalabyrinthe bezeichnet werden.
Delta : Delta-Labyrinthe bestehen aus verbundenen Dreiecken, und an jede Zelle können bis zu drei Passagen angeschlossen werden.
Sigma : Sigma-Labyrinthe bestehen aus verbundenen Sechsecken. Jede Zelle kann bis zu sechs DurchgÀnge haben.
Theta : Theta-Labyrinthe bestehen aus konzentrischen Kreisen von DurchgĂ€ngen, bei denen der Anfang oder das Ende in der Mitte und der andere am Ă€uĂeren Rand liegt. Zellen haben normalerweise vier mögliche Verbindungspfade, aber aufgrund der gröĂeren Anzahl von Zellen in den Ă€uĂeren Ringen der DurchgĂ€nge kann es mehr geben.
Epsilon : Epsilon-Labyrinthe bestehen aus verbundenen Achtecken oder Quadraten. Jede Zelle in ihnen kann bis zu acht oder vier DurchgÀnge haben.
Zeta : Das Zeta-Labyrinth befindet sich in einem rechteckigen Raster. Nur neben horizontalen und vertikalen Passagen sind diagonale Passagen in einem Winkel von 45 Grad zulÀssig.
Omega : Der Begriff Omega bezieht sich auf fast jedes Labyrinth mit konstanter nicht orthogonaler Tessellation. Delta, Sigma, Theta und Ipsilon Labyrinthe sind von diesem Typ, wie viele andere Schemata, die Sie sich vorstellen können, zum Beispiel ein Labyrinth, das aus Paaren rechtwinkliger Dreiecke besteht.
Riss : Ein Risslabyrinth ist ein amorphes Labyrinth ohne stÀndige Tessellation, in dem sich WÀnde und Gehwege in zufÀlligen Winkeln befinden.
Fraktal : Ein fraktales Labyrinth ist ein Labyrinth aus kleineren Labyrinthen. Ein fraktales Labyrinth aus verschachtelten Zellen ist ein Labyrinth in jeder Zelle, in dem andere Labyrinthe platziert sind, und dieser Vorgang kann mehrmals wiederholt werden. Ein unendlich rekursives fraktales Labyrinth ist ein echtes Fraktal, in dem sich der Inhalt des Labyrinths selbst repliziert und ein im Wesentlichen unendlich groĂes Labyrinth erzeugt.
Routing: Die Klassifizierung nach Routing ist wahrscheinlich der interessanteste Aspekt bei der Erzeugung von Labyrinthen. From ist Arten von DurchgÀngen innerhalb der Geometrie zugeordnet, die in den oben beschriebenen Kategorien definiert sind.

Ideal : âIdealâ ist ein Labyrinth ohne Schleifen oder geschlossene KreislĂ€ufe und ohne unerreichbare Bereiche. Es wird auch ein einfach verbundenes Labyrinth genannt. Von jedem Punkt gibt es genau einen Pfad zu einem anderen Punkt. Labyrinth hat nur eine Lösung. Aus programmtechnischer Sicht kann ein solches Labyrinth als Baum, als Verbindungsmenge von Zellen oder Eckpunkten beschrieben werden.
Geflochten : Geflochten bedeutet, dass es im Labyrinth keine Sackgassen gibt. Es wird auch das rein mehrfach verbundene Labyrinthlabyrinth genannt. In einem solchen Labyrinth werden Passagen verwendet, die geschlossen sind und zueinander zurĂŒckkehren (daher der Name âKorbweideâ). Dadurch verbringen sie mehr Zeit damit, im Kreis zu laufen, anstatt in Sackgassen zu geraten. Ein hochwertiges gewebtes Labyrinth kann viel komplizierter sein als ein ideales Labyrinth derselben GröĂe.
Single-Route (Unicursal) : Single- Route bedeutet ein Labyrinth ohne Gabeln. Das Einweg-Labyrinth enthĂ€lt einen langen, gewundenen Durchgang, der die Richtung im gesamten Labyrinth Ă€ndert. Es ist nicht sehr kompliziert, nur wenn Sie nicht versehentlich auf halber Strecke zurĂŒckkehren und nicht zum Anfang zurĂŒckkehren.
SpĂ€rlich: Ein spĂ€rliches Labyrinth durchlĂ€uft nicht jede Zelle, dh einige von ihnen werden nicht erstellt. Dies impliziert das Vorhandensein nicht erreichbarer Bereiche, dh in gewissem Sinne ist es das Gegenteil des Weidenlabyrinths. Ein Ă€hnliches Konzept kann beim HinzufĂŒgen von WĂ€nden angewendet werden, sodass Sie ein unebenes Labyrinth mit breiten GĂ€ngen und RĂ€umen erhalten.- Teilweise Wicker: Teilweise Wicker Maze ist ein gemischtes Labyrinth, das sowohl Schleifen als auch Sackgassen aufweist. Das Wort âKorbweideâ kann zur quantitativen Beurteilung verwendet werden, dh ein âLabyrinth mit starkem Webenâ ist ein Labyrinth mit vielen entfernten Schleifen oder WĂ€nden, und es gibt nur wenige im âLabyrinth mit schwachem Webenâ.
Textur: Die Texturklassifizierung beschreibt den Stil von DurchlĂ€ufen mit unterschiedlichem Routing und unterschiedlicher Geometrie. Textur ist nicht nur ein Parameter, der ein- oder ausgeschaltet werden kann. Hier einige Beispiele fĂŒr Variablen:

Bias : In einem Labyrinth mit verschobenen Passagen tendieren gerade Passagen eher in eine Richtung als in andere. In einem Labyrinth mit hoher horizontaler Verschiebung haben wir beispielsweise lange Passagen von links nach rechts und nur kurze Passagen von oben nach unten, die sie verbinden. Ein solches Labyrinth ist normalerweise schwieriger âĂŒber die Fasernâ zu fĂŒhren.
Ăberflug : Die Ăberflugmetrik bestimmt, wie lange es dauert, bis erzwungene Abbiegungen auftreten. In einem Labyrinth mit geringer Spannweite gibt es keine geraden Passagen, die lĂ€nger als drei oder vier Zellen sind, und es sieht sehr zufĂ€llig aus. In einem Labyrinth mit einer hohen Spannweite hat das Labyrinth einen groĂen Prozentsatz an langen DurchgĂ€ngen, wodurch es wie ein Mikrochip aussieht.
Elitismus: Der Indikator â Elitismus â des Labyrinths bestimmt die LĂ€nge der Lösung im VerhĂ€ltnis zur GröĂe des Labyrinths. Elite-Labyrinthe haben normalerweise eine kurze, direkte Lösung, wĂ€hrend in Nicht-Elite-Labyrinthen die Lösung einen groĂen Teil des Labyrinthbereichs durchlĂ€uft. Ein hochwertiges Elite-Labyrinth kann viel komplizierter sein als ein Nicht-Elite-Labyrinth.
Symmetrie : Ein symmetrisches Labyrinth hat symmetrische Passagen, beispielsweise in der Rotationssymmetrie relativ zur Mitte oder entlang der horizontalen oder vertikalen Achse. Das Labyrinth kann teilweise oder vollstÀndig symmetrisch sein und das Muster beliebig oft wiederholen.
HomogenitĂ€t: Ein homogener Algorithmus erzeugt alle möglichen Labyrinthe mit gleicher Wahrscheinlichkeit. Ein Labyrinth kann als homogen bezeichnet werden, wenn es wie ein typisches Labyrinth aussieht, das durch einen homogenen Algorithmus erzeugt wird. Ein heterogener Algorithmus kann theoretisch auch alle möglichen Labyrinthe in jedem Raum erzeugen, jedoch nicht mit gleicher Wahrscheinlichkeit. Die HeterogenitĂ€t kann noch weiter gehen - es kann Labyrinthe geben, die der Algorithmus niemals erzeugen wird.- Flussfluss: Die Eigenschaft âFlussâ bedeutet, dass der Algorithmus beim Erstellen eines Labyrinths nach den benachbarten Zellen (oder WĂ€nden) sucht und diese reinigt, dh sie flieĂt (daher der Begriff âFluiditĂ€tâ) wie Wasser in die noch nicht erstellten Teile des Labyrinths. In einem idealen Labyrinth mit einer geringeren Durchflussrate gibt es normalerweise viele kurze Sackgassen, und in einem âflĂŒssigerenâ Labyrinth gibt es weniger Sackgassen, aber sie sind lĂ€nger.
PrioritĂ€t: Diese Klassifizierung zeigt, dass die Prozesse zur Erstellung von Labyrinthen in zwei Haupttypen unterteilt werden können: HinzufĂŒgen von WĂ€nden und Schnitzen von Passagen. Wenn es darum geht, dies zu generieren, kommt es normalerweise nur auf den Unterschied in den Algorithmen und nicht auf merkliche Unterschiede in den Labyrinthen an, aber es ist immer noch nĂŒtzlich, dies zu berĂŒcksichtigen. Das gleiche Labyrinth wird oft auf beide Arten erzeugt:
- HinzufĂŒgen von WĂ€nden: Algorithmen, fĂŒr die WĂ€nde PrioritĂ€t haben, beginnen mit einem leeren Bereich (oder einem AuĂenrand) und fĂŒgen dabei WĂ€nde hinzu. In der realen Welt fĂŒgen echte Labyrinthe, die aus Hecken, Decken oder HolzwĂ€nden bestehen, definitiv WĂ€nde hinzu.
- GÀnge schneiden: Algorithmen, deren PrioritÀt GÀnge sind, beginnen mit einem festen Block und schneiden dabei Passagen. In der realen Welt sind solche Labyrinthe Minentunnel oder Labyrinthe in Rohren.

Vorlage: NatĂŒrlich können Labyrinthe gleichzeitig Passagen schneiden und WĂ€nde hinzufĂŒgen. Einige Computeralgorithmen machen das. Eine Labyrinthvorlage ist ein Grafikbild, das kein Labyrinth ist, das sich in der geringsten Anzahl von Schritten in ein echtes Labyrinth verwandelt, aber dennoch die Textur der ursprĂŒnglichen Grafikvorlage beibehĂ€lt. Komplexe Labyrinthstile wie sich ĂŒberschneidende Spiralen lassen sich leichter als Muster in einem Computer implementieren, als zu versuchen, das richtige Labyrinth zu erstellen und dabei seinen Stil beizubehalten.
Sonstiges: Das Obige ist keineswegs eine vollstĂ€ndige Liste aller möglichen Klassen oder Elemente innerhalb jeder Klasse. Dies sind nur die Arten von Labyrinthen, die ich selbst geschaffen habe. Beachten Sie, dass fast jede Art von Labyrinth, einschlieĂlich Labyrinthen mit speziellen Regeln, als gerichteter Graph ausgedrĂŒckt werden kann, in dem es in jedem Zustand eine endliche Anzahl von ZustĂ€nden und eine endliche Anzahl von Auswahlmöglichkeiten gibt. Dies wird als
Ăquivalenz der Labyrinthe bezeichnet . Hier sind einige andere Klassifikationen und Arten von Labyrinthen:

Orientierung : An bestimmten Stellen können Sie sich nur in eine Richtung bewegen. Aus programmtechnischer Sicht wird ein solches Labyrinth durch einen gerichteten Graphen beschrieben, im Gegensatz zu einem ungerichteten Graphen, der alle anderen Typen beschreibt.
Segmentierung : Das Labyrinth kann verschiedene Teile haben, die verschiedenen Klassen entsprechen.
Labyrinthe von unendlicher LĂ€nge: Wir können ein unendlich langes Labyrinth erstellen (eine endliche Anzahl von Spalten und eine beliebige Anzahl von Zeilen), aber gleichzeitig nur einen Teil des Labyrinths im Speicher speichern, von einem Ende zum anderen âscrollenâ und beim Erstellen der nĂ€chsten die vorherigen Zeilen zerstören. Ein Beispiel ist eine modifizierte Version des Hunt and Kill-Algorithmus. Man kann sich ein möglicherweise endloses Labyrinth in Form eines langen Films vorstellen, der aus einzelnen Bildern besteht. Es werden jeweils nur zwei aufeinanderfolgende Frames gespeichert. Lassen Sie uns den Hunt and Kill-Algorithmus ausfĂŒhren, obwohl er eine Verzerrung erzeugt, die fĂŒr den oberen Frame anfĂ€llig ist, sodass er zuerst endet. Nach der Fertigstellung wird der Rahmen nicht mehr benötigt, Sie können ihn drucken oder etwas anderes damit machen. Wie auch immer, verwerfen Sie es, machen Sie den teilweise erstellten unteren Rahmen zu einem neuen oberen Rahmen und löschen Sie den neuen unteren Rahmen. Wiederholen Sie den Vorgang, bis wir aufhören möchten, und warten Sie dann, bis Hunt And Kill beide Frames abgeschlossen hat. Die einzige EinschrĂ€nkung besteht darin, dass das Labyrinth niemals einen Pfad hat, der sich ĂŒber eine LĂ€nge von mehr als zwei Frames zum Eingang hin verzweigt. Der einfachste Weg, ein endloses Labyrinth zu erstellen, ist der Eller-Algorithmus oder der Sidewinder-Algorithmus, da sie bereits zeilenweise Labyrinthe erstellen, sodass Sie sie einfach endlos Linien zum Labyrinth hinzufĂŒgen lassen können.
Virtuelle fraktale Labyrinthe: Virtuell ist ein Labyrinth, in dem nicht das gesamte Labyrinth gleichzeitig gespeichert wird. Beispielsweise kann nur ein Teil der 100 x 100 DurchgĂ€nge in der NĂ€he Ihres Standorts in einer Simulation gespeichert werden, in der Sie durch ein groĂes Labyrinth gehen. Die Erweiterung verschachtelter fraktaler Labyrinthe kann verwendet werden, um riesige virtuelle Labyrinthe zu erstellen, beispielsweise eine Milliarde pro Milliarde DurchgĂ€nge. Wenn wir eine echte Kopie des Labyrinths von einer Milliarde pro Milliarde PĂ€ssen (mit einem Abstand von sechs FuĂ zwischen den Passagen) bauen wĂŒrden, wĂŒrde es die ErdoberflĂ€che mehr als 6.000 Mal fĂŒllen! Stellen Sie sich ein Labyrinth von 10 9 bis 10 9 DurchgĂ€ngen oder ein geschlossenes Labyrinth mit nur 9 Ebenen vor. Wenn wir mindestens ein 100x100-Teil um uns haben möchten, reicht es aus, auf der untersten Ebene ein Unterlabyrinth von 100x100 DurchgĂ€ngen und sieben 10x10-Labyrinthen zu erstellen, in das es eingebettet ist, um genau zu wissen, wo sich die WĂ€nde innerhalb des 100x100-Teils befinden. (Eigentlich ist es besser, vier benachbarte Teile mit einer GröĂe von 100 x 100 zu haben, die ein Quadrat bilden, falls Sie sich in der NĂ€he der Kante oder Ecke des Teils befinden. Hier gilt jedoch das gleiche Konzept.) Um sicherzustellen, dass das Labyrinth beim Bewegen konstant und unverĂ€ndert bleibt, haben wir eine Formel: Definieren einer zufĂ€lligen Startnummer fĂŒr jede Koordinate auf jeder Verschachtelungsebene. Virtuelle fraktale Labyrinthe Ă€hneln dem Mandelbrot-Fraktal, in dessen Bildern es virtuell existiert, und wir mĂŒssen eine bestimmte Koordinate mit einer ziemlich hohen VergröĂerung besuchen. so dass es erscheint.
Labyrinth-Algorithmen
Hier ist eine Liste verallgemeinerter Algorithmen zum Erstellen der verschiedenen oben beschriebenen Labyrinthklassen:

Ideal : Um ein ideales Standardlabyrinth zu schaffen, muss es normalerweise âwachsenâ, um sicherzustellen, dass keine Schleifen und isolierten Bereiche vorhanden sind. Wir beginnen an der AuĂenwand und fĂŒgen zufĂ€llig ein Fragment der Wand hinzu, das sie berĂŒhrt. Wir fĂŒgen dem Labyrinth weiterhin zufĂ€llig Wandsegmente hinzu, stellen jedoch sicher, dass jedes neue Segment ein Ende der vorhandenen Wand berĂŒhrt und sich das andere Ende im noch nicht erstellten Teil des Labyrinths befindet. Wenn Sie ein Wandsegment hinzufĂŒgen, dessen beide Enden vom Rest des Labyrinths getrennt sind, wird eine nicht verbundene Wand mit einer Schleife erstellt. Wenn Sie ein Segment hinzufĂŒgen, dessen beide Enden das Labyrinth berĂŒhren, entsteht ein nicht erreichbarer Bereich. Dies ist eine Methode zum HinzufĂŒgen von WĂ€nden. Es ist fast analog zum Ausschneiden von Passagen, bei denen Teile der Passagen so geschnitten werden, dass nur ein Ende den vorhandenen Pass berĂŒhrt.
: , , . : (1) , (2) , , -«», (3) , , , (4) , , (3) , , .
: â , , , , . U- , , , , . . , : , , , . , . , .
: , . , , . - , , , , .- 3D : , , , . - .

: , , . ( ): , , , . , . , ; , . , , .
Crack : Crack- , , . , , , «» . , , . , - . , , ; . , .
: «» , , . , - : (1) , . (2) , , , , , (.. ). (3) , , . , .
: â 3D-, -, , . 3D- , , . , , . , . , ( ), , , .
Planair : Planair- , . â . , .
: , , , -, , , , . , . , , , , , .
Es gibt viele Möglichkeiten, perfekte Labyrinthe zu erstellen, und jeder von ihnen hat seine eigenen Eigenschaften. Unten finden Sie eine Liste spezifischer Algorithmen. Alle beschreiben die Schaffung eines Labyrinths durch Ausschneiden von Passagen. Sofern nicht anders angegeben, kann jedes auch durch HinzufĂŒgen von WĂ€nden implementiert werden:
Rekursiver Backtracker : - recursive backtracker, , . , , . , , . , . , . , , , . , . Recursive backtracking , , , .
: , . , «» , , . , , ( ). , . , , . , - , , . , , . , . , - (union-find algorithm): , . . , - .
Prims Algorithmus (true) : Dieser Algorithmus erstellt einen minimalen Spanning Tree, indem er eindeutig zufĂ€llige Kantengewichte verarbeitet. Der erforderliche Speicherplatz ist proportional zur GröĂe des Labyrinths. Wir beginnen an einem beliebigen Scheitelpunkt (das fertige Labyrinth ist das gleiche, egal von oben, wo wir beginnen). Wir wĂ€hlen die Kante des Durchgangs mit dem kleinsten Gewicht aus, das das Labyrinth mit einem Punkt verbindet, der sich noch nicht darin befindet, und befestigen es dann am Labyrinth. Das Labyrinth ist fertig, wenn die fraglichen Kanten nicht mehr ĂŒbrig sind. Um die nĂ€chste Kante effizient auszuwĂ€hlen, benötigen Sie eine PrioritĂ€tswarteschlange (normalerweise mithilfe eines Heaps implementiert), in der alle Kanten des Rahmens gespeichert sind. Dieser Algorithmus ist jedoch ziemlich langsam, da die Auswahl von Elementen aus dem Heap log (n) Zeit benötigt. Daher ist es besser, den Kraskal-Algorithmus zu bevorzugen, der auch einen minimalen Spannbaum erzeugt, da er schneller ist und Labyrinthe mit identischer Struktur erzeugt. TatsĂ€chlich können die Algorithmen Prima und Kraskal mit demselben zufĂ€lligen Startwert dieselben Labyrinthe erzeugen.
Prims Algorithmus (vereinfacht) : Dieser Prims Algorithmus erstellt einen minimalen Spannbaum. Es wird so vereinfacht, dass alle Kantengewichte gleich sind. Es erfordert eine SpeicherkapazitĂ€t proportional zur GröĂe des Labyrinths. Wir gehen von einem zufĂ€lligen Peak aus. Wir wĂ€hlen zufĂ€llig den Rand des Durchgangs aus, der das Labyrinth mit einem Punkt verbindet, der sich noch nicht darin befindet, und befestigen ihn dann am Labyrinth. Das Labyrinth ist fertig, wenn die fraglichen Kanten nicht mehr ĂŒbrig sind. Da die Kanten schwerelos und nicht geordnet sind, können sie als einfache Liste gespeichert werden, dh die Auswahl der Elemente aus der Liste erfolgt sehr schnell und nimmt konstante Zeit in Anspruch. Daher ist es viel schneller als der echte Prim-Algorithmus mit zufĂ€lligen Kantengewichten. Die erzeugte Labyrinthtextur hat eine geringere Flussrate und eine einfachere Lösung als die echte Prim-Methode, da sie sich wie verschĂŒtteter Sirup gleichmĂ€Ăig vom Startpunkt aus verteilt und keine Rippenfragmente mit höherem Gewicht umgeht, die spĂ€ter berĂŒcksichtigt werden.
Prims Algorithmus (modifiziert) : Dieser Prims Algorithmus erstellt einen minimalen Spannbaum, der so modifiziert ist, dass alle Gewichte der Kanten gleich sind. Es ist jedoch so implementiert, dass anstelle von Kanten Zellen betrachtet werden. Die Speichermenge ist proportional zur GröĂe des Labyrinths. WĂ€hrend des Erstellungsprozesses kann jede Zelle einen von drei Typen haben: (1) âinternâ: Die Zelle ist Teil des Labyrinths und bereits darin ausgeschnitten. (2) âGrenzeâ: Die Zelle ist nicht Teil des Labyrinths und wurde noch nicht ausgeschnitten, befindet sich jedoch neben der Zelle, die bereits âinternâ ist, und (3) âexternâ: Die Zelle ist noch nicht Teil des Labyrinths, und keiner ihrer Nachbarn ist auch die âinterneâ Zelle. Wir beginnen mit der Auswahl einer Zelle, machen sie "intern" und setzen fĂŒr alle Nachbarn den Typ auf "Grenze". Wir wĂ€hlen zufĂ€llig die "Grenz" -Zelle aus und schneiden einen Durchgang von einer der benachbarten "internen" Zellen hinein. Wir Ă€ndern den Status dieser "Grenzzelle" in "intern" und Ă€ndern den Typ aller Nachbarn von "extern" in "Grenze". Das Labyrinth ist abgeschlossen, wenn keine "Grenz" -Zellen mehr vorhanden sind (dh keine "externen" Zellen mehr vorhanden sind, was bedeutet, dass jeder "intern" geworden ist). Dieser Algorithmus erzeugt Labyrinthe mit einem sehr niedrigen Ertragsindex, hat viele kurze Deadlocks und eine ziemlich einfache Lösung. Das resultierende Labyrinth ist dem Ergebnis des vereinfachten Prima-Algorithmus sehr Ă€hnlich, mit einem kleinen Unterschied: Die HohlrĂ€ume im Spanning Tree werden nur gefĂŒllt, wenn eine Grenzzelle zufĂ€llig ausgewĂ€hlt wird, im Gegensatz zu der dreifachen Wahrscheinlichkeit, diese Zelle durch eine der dazu fĂŒhrenden Grenzzellen zu fĂŒllen. DarĂŒber hinaus ist der Algorithmus sehr schnell und schneller als der vereinfachte Prim-Algorithmus, da die Kantenliste nicht kompiliert und verarbeitet werden muss.
Aldous-Broder- Algorithmus: Interessant an diesem Algorithmus ist, dass er homogen ist, dh mit gleicher Wahrscheinlichkeit alle möglichen Labyrinthe einer bestimmten GröĂe erzeugt. DarĂŒber hinaus ist kein zusĂ€tzlicher Speicher oder Stapel erforderlich. Wir wĂ€hlen einen Punkt aus und bewegen uns zufĂ€llig in eine benachbarte Zelle. Wenn wir in eine ungeschnittene Zelle geraten sind, schneiden Sie den Durchgang aus der vorherigen Zelle in diese aus. Wir bewegen uns weiter zu benachbarten Zellen, bis wir die Passagen zu allen Zellen herausgeschnitten haben. Dieser Algorithmus erzeugt Labyrinthe mit einer geringen Durchflussrate, die nur geringfĂŒgig höher ist als der Kraskal-Algorithmus. (Dies bedeutet, dass es fĂŒr einen bestimmten Austausch mehr Labyrinthe mit einem niedrigen Ertragsindex als mit einem hohen gibt, da das Labyrinth mit einer durchschnittlichen Wahrscheinlichkeit ebenso niedrig ist.) Das Schlechte an diesem Algorithmus ist, dass er sehr langsam ist, weil er keine intellektuelle Suche nach letzterem durchfĂŒhrt Zellen, das heiĂt in der Tat, haben keine Garantien fĂŒr die Fertigstellung. Aufgrund seiner Einfachheit kann es jedoch schnell viele Zellen durchlaufen, sodass es schneller abgeschlossen wird, als Sie vielleicht denken. Im Durchschnitt dauert die Fertigstellung siebenmal lĂ€nger als bei Standardalgorithmen, obwohl es in schlechten FĂ€llen viel lĂ€nger dauern kann, wenn der Zufallszahlengenerator die letzten Zellen stĂ€ndig vermeidet. Es kann als HinzufĂŒgen von WĂ€nden implementiert werden, wenn die Grenzwand als einzelner Scheitelpunkt betrachtet wird, d. H. Wenn die Bewegung uns beispielsweise zur Grenzwand bewegt, teleportieren wir uns zu einem zufĂ€lligen Punkt entlang der Grenze und bewegen uns erst dann weiter. Beim HinzufĂŒgen von WĂ€nden funktioniert es fast doppelt so schnell, da die Teleportation entlang der Grenzmauer einen schnelleren Zugang zu den entfernten Teilen des Labyrinths ermöglicht.
Wilsons Algorithmus : Dies ist eine verbesserte Version des Aldous-Broder-Algorithmus. Er erzeugt Labyrinthe mit genau der gleichen Textur (die Algorithmen sind homogen, dh alle möglichen Labyrinthe werden mit gleicher Wahrscheinlichkeit erzeugt), aber der Wilson-Algorithmus ist viel schneller. Es braucht Speicher bis zur GröĂe des Labyrinths. Wir beginnen mit einer zufĂ€llig ausgewĂ€hlten anfĂ€nglichen Labyrinthzelle. Wir wĂ€hlen eine zufĂ€llige Zelle aus, die noch nicht Teil des Labyrinths ist, und fĂŒhren einen zufĂ€lligen Spaziergang durch, bis wir eine Zelle finden, die bereits zum Labyrinth gehört. Sobald wir auf den bereits erstellten Teil des Labyrinths stoĂen, kehren wir zur ausgewĂ€hlten zufĂ€lligen Zelle zurĂŒck und schneiden den gesamten Pfad aus, indem wir diese Zellen zum Labyrinth hinzufĂŒgen. Genauer gesagt, wenn wir auf dem Weg zurĂŒckkehren, schneiden wir jede Zelle in der Richtung ein, in der der zufĂ€llige Spaziergang beim letzten Verlassen der Zelle stattgefunden hat. Dies vermeidet das Auftreten von Schleifen entlang des RĂŒckweges, so dass ein langer Durchgang das Labyrinth verbindet. Das Labyrinth ist abgeschlossen, wenn alle Zellen daran befestigt sind. Der Algorithmus hat die gleichen Geschwindigkeitsprobleme wie Aldous-Broder, da es lange dauern kann, den ersten zufĂ€lligen Pfad zur ursprĂŒnglichen Zelle zu finden, aber nach dem Platzieren mehrerer Pfade wird der Rest des Labyrinths ziemlich schnell herausgeschnitten. Im Durchschnitt lĂ€uft es fĂŒnfmal schneller als Aldous-Broder und weniger als zweimal langsamer als die besten Algorithmen. Es ist zu bedenken, dass das HinzufĂŒgen von WĂ€nden doppelt so schnell funktioniert, da die gesamte Grenzmauer anfangs Teil des Labyrinths ist, sodass sich die ersten WĂ€nde viel schneller verbinden.
Hunt and Kill- Algorithmus : Dieser Algorithmus ist praktisch, da er keinen zusĂ€tzlichen Speicher oder Stapel benötigt und daher zum Erstellen groĂer Labyrinthe oder Labyrinthe auf schwachen Computern geeignet ist, da nicht genĂŒgend Speicherplatz zur VerfĂŒgung steht. Da es keine Regeln gibt, die stĂ€ndig befolgt werden mĂŒssen, ist es auch am einfachsten, Labyrinthe mit unterschiedlichen Texturen damit zu Ă€ndern und zu erstellen. Es Ă€hnelt fast einem rekursiven Backtracker, nur dass keine Zelle in der NĂ€he der aktuellen Position erstellt wurde. Wir wechseln in den "Jagd" -Modus und scannen systematisch das Labyrinth, bis wir eine nicht erstellte Zelle neben der bereits geschnittenen Zelle finden. In dieser Phase beginnen wir wieder mit dem Schneiden an diesem neuen Standort. Das Labyrinth ist abgeschlossen, wenn im "Jagd" -Modus alle Zellen gescannt werden. Dieser Algorithmus neigt dazu, Labyrinthe mit einer hohen Flussrate zu erzeugen, die jedoch nicht so hoch sind wie der rekursive Backtracker. Sie können es zwingen, Labyrinthe mit einer niedrigeren Durchflussrate zu erzeugen, die hĂ€ufiger in den "Jagd" -Modus wechseln. Es lĂ€uft langsamer aufgrund der Zeit, die fĂŒr die Jagd auf die letzten Zellen aufgewendet wurde, aber nicht viel langsamer als der Kraskal-Algorithmus. Es kann nach dem Prinzip des HinzufĂŒgens von WĂ€nden implementiert werden, wenn Sie gelegentlich zufĂ€llig teleportieren, um die Probleme zu vermeiden, die einem rekursiven Backtracker inhĂ€rent sind.
Wachsender Algorithmus
Baum (Wachsender Baum-Algorithmus) : Dies ist ein verallgemeinerter Algorithmus, der Labyrinthe mit unterschiedlichen Texturen erstellen kann. Der erforderliche Speicher kann die GröĂe des Labyrinths erreichen. Jedes Mal, wenn eine Zelle geschnitten wird, fĂŒgen wir sie der Liste hinzu. WĂ€hlen Sie eine Zelle aus der Liste aus und schneiden Sie den Durchgang zu der nicht erstellten Zelle daneben aus. Wenn sich in der NĂ€he der aktuellen Zelle keine nicht erstellten Zellen befinden, löschen Sie die aktuelle Zelle aus der Liste. Das Labyrinth ist abgeschlossen, wenn die Liste nichts anderes enthĂ€lt. Das Interessante am Algorithmus ist, dass Sie abhĂ€ngig davon, wie Sie eine Zelle aus der Liste auswĂ€hlen, viele verschiedene Texturen erstellen können. Wenn Sie beispielsweise immer die zuletzt hinzugefĂŒgte Zelle auswĂ€hlen, wird dieser Algorithmus zu einem rekursiven Backtracker. Wenn Sie Zellen immer zufĂ€llig auswĂ€hlen, verhĂ€lt es sich Ă€hnlich, jedoch nicht identisch mit dem Prim-Algorithmus. Wenn Sie immer die Ă€ltesten Zellen auswĂ€hlen, die der Liste hinzugefĂŒgt wurden, erstellen wir ein Labyrinth mit dem niedrigstmöglichen Ertragsindex, der sogar unter dem des Prim-Algorithmus liegt. Wenn Sie normalerweise die allerletzte Zelle auswĂ€hlen, aber gelegentlich eine zufĂ€llige Zelle auswĂ€hlen, hat das Labyrinth eine hohe Flussrate, aber eine kurze und direkte Lösung. Wenn eine der neuesten Zellen zufĂ€llig ausgewĂ€hlt wird, hat das Labyrinth eine geringe Durchflussrate, aber eine lange und gewundene Lösung.
Wachsender Waldalgorithmus : Dies ist ein allgemeinerer Algorithmus, der Typen basierend auf BĂ€umen und Mengen kombiniert. Es ist eine Erweiterung des Baumwachstumsalgorithmus, der im Wesentlichen mehrere Instanzen umfasst, die gleichzeitig erweitert werden. Wir beginnen mit allen Zellen, die zufĂ€llig in einer Liste von "neu" sortiert sind. DarĂŒber hinaus hat jede Zelle wie zu Beginn des Kruskal-Algorithmus ihren eigenen Satz. WĂ€hlen Sie zunĂ€chst eine oder mehrere Zellen aus, indem Sie sie aus der Liste "Neu" in die Liste "Aktiv" verschieben. WĂ€hlen Sie eine Zelle aus der Liste "aktiv" aus und schneiden Sie die Passage zur nĂ€chsten nicht erstellten Zelle aus der Liste "neu" aus. FĂŒgen Sie der Liste "aktiv" eine neue Zelle hinzu und kombinieren Sie die SĂ€tze von zwei Zellen. Wenn versucht wird, in den vorhandenen Teil des Labyrinths zu schneiden, aktivieren Sie ihn, wenn sich die Zellen in verschiedenen SĂ€tzen befinden, und kombinieren Sie die Zellen, wie im Kraskal-Algorithmus. Wenn sich in der NĂ€he der aktuellen Zelle keine "neuen" Zellen befinden, verschieben Sie die aktuelle Zelle in die Liste der "fertigen". Das Labyrinth ist abgeschlossen, wenn die Liste der "aktiven" leer wird. Am Ende kombinieren wir alle verbleibenden Mengen wie im Kruskal-Algorithmus. In regelmĂ€Ăigen AbstĂ€nden können Sie neue BĂ€ume erstellen, indem Sie wie zu Beginn eine oder mehrere Zellen aus der Liste "Neu" in die Liste "Aktiv" verschieben. Durch Steuern der Anzahl der ursprĂŒnglichen BĂ€ume und der Anteile der neu erstellten BĂ€ume können Sie viele eindeutige Texturen generieren, die mit den bereits flexiblen Parametern des Baumwachstumsalgorithmus kombiniert werden.
Ellers Algorithmus : Dies ist ein spezieller Algorithmus, da er nicht nur schneller als alle anderen ist, sondern auch keine offensichtlichen Vorurteile oder MĂ€ngel aufweist. DarĂŒber hinaus wird der Speicher beim Erstellen am effizientesten genutzt. Es ist nicht einmal erforderlich, dass sich das gesamte Labyrinth im Speicher befindet, sondern es wird ein Volumen verwendet, das proportional zur GröĂe der Zeile ist. Es erstellt zeilenweise ein Labyrinth. Nachdem die Generierung der Zeichenfolge abgeschlossen ist, berĂŒcksichtigt der Algorithmus dies nicht mehr. Jede Zelle in einer Reihe ist in einer Menge enthalten. Zwei Zellen gehören zu derselben Gruppe, wenn sich zwischen ihnen entlang des bereits erstellten Labyrinths ein Pfad befindet. Mit diesen Informationen können Sie Passagen in der aktuellen Zeile ausschneiden, ohne Schleifen oder isolierte Bereiche zu erstellen. TatsĂ€chlich ist es dem Kraskal-Algorithmus ziemlich Ă€hnlich, nur dass es hier zeilenweise gebildet wird, wĂ€hrend Kraskal durch das gesamte Labyrinth schaut. Das Erstellen einer Zeile besteht aus zwei Teilen: Verbinden Sie benachbarte Zellen innerhalb der Zeile zufĂ€llig, d. H. wir schneiden horizontale Passagen aus und verbinden dann zufĂ€llig die Zellen zwischen der aktuellen und der nĂ€chsten Reihe, d.h. vertikale Passagen ausschneiden. Beim Schneiden horizontaler Passagen verbinden wir keine Zellen, die sich bereits im selben Satz befinden (da sonst eine Schleife erstellt wird), und beim Schneiden vertikaler Passagen mĂŒssen wir eine Zelle verbinden, wenn sie eine EinheitsgröĂe hat (wenn Sie sie verlassen, wird ein isolierter Bereich erstellt). Wenn wir horizontale Passagen schneiden, verbinden wir Zellen, wenn sie sich im selben Satz befinden (weil jetzt ein Pfad zwischen ihnen besteht), und wenn wir vertikale Passagen schneiden, wenn wir keine Verbindung mit der Zelle herstellen, legen wir sie in einen separaten Satz (weil sie jetzt vom Rest des Labyrinths getrennt sind ) Die Erstellung beginnt mit der Tatsache, dass vor dem Verbinden der Zellen in der ersten Zeile jede Zelle ihren eigenen Satz hat. Die Erstellung ist abgeschlossen, nachdem die Zellen in der letzten Zeile verbunden wurden. Es gibt eine spezielle Regel fĂŒr die Fertigstellung: Zum Zeitpunkt der Fertigstellung sollte sich jede Zelle im selben Satz befinden, um isolierte Bereiche zu vermeiden. (Die letzte Zeile wird erstellt, indem jedes der Paare benachbarter Zellen kombiniert wird, die sich noch nicht in derselben Gruppe befinden.) Es ist am besten, die Gruppe mithilfe einer zyklisch doppelt verknĂŒpften Liste von Zellen zu implementieren (die nur ein Array sein kann, das Zellen mit Zellenpaaren auf beiden Seiten derselben Gruppe verbindet) FĂŒhren Sie das EinfĂŒgen, Löschen und ĂberprĂŒfen des Vorhandenseins benachbarter Zellen in einem Satz fĂŒr eine konstante Zeit durch. Das Problem bei diesem Algorithmus ist das Ungleichgewicht bei der Verarbeitung der verschiedenen Kanten des Labyrinths. Um Flecken in Texturen zu vermeiden, mĂŒssen Sie Verbindungszellen in den richtigen Proportionen verbinden und ĂŒberspringen.
Rekursive Division: Dieser Algorithmus Ă€hnelt dem rekursiven Backtracking, da beide Stapel verwenden. Nur funktioniert er nicht mit GĂ€ngen, sondern mit WĂ€nden. Wir beginnen mit der Erstellung einer zufĂ€lligen horizontalen oder vertikalen Wand, die einen zugĂ€nglichen Bereich in einer zufĂ€lligen Zeile oder Spalte schneidet, und platzieren zufĂ€llig leere RĂ€ume entlang dieser. Dann wiederholen wir rekursiv den Vorgang fĂŒr die beiden durch die Trennwand erzeugten Teilregionen. Um optimale Ergebnisse zu erzielen, mĂŒssen Sie eine Abweichung bei der Auswahl von horizontal oder vertikal hinzufĂŒgen, die auf den Proportionen des Bereichs basiert. Beispielsweise sollte ein Bereich, dessen Breite doppelt so hoch ist wie die Höhe, hĂ€ufiger durch vertikale WĂ€nde geteilt werden. Dies ist der schnellste Algorithmus ohne Richtungsabweichungen und kann oft sogar mit Labyrinthen konkurrieren, die auf BinĂ€rbĂ€umen basieren, da mehrere Zellen gleichzeitig erstellt werden, obwohl er einen offensichtlichen Nachteil in Form langer WĂ€nde aufweist, die das Innere des Labyrinths schneiden. Dieser Algorithmus ist eine Art eingebetteter fraktaler Labyrinthe, aber anstatt stĂ€ndig Labyrinthe von Zellen fester GröĂe mit Labyrinthen gleicher GröĂe in jeder Zelle zu erstellen, teilt er einen bestimmten Bereich zufĂ€llig in ein Labyrinth zufĂ€lliger GröĂe: 1x2 oder 2x1. Rekursive Division kann nicht zum Ausschneiden von Passagen verwendet werden, da dies zur Schaffung einer offensichtlichen Lösung fĂŒhrt, die entweder entlang der AuĂenkante folgt oder auf andere Weise die Innenseite direkt schneidet.
Labyrinthe basierend auf BinĂ€rbĂ€umen : TatsĂ€chlich sind dies die einfachsten und schnellstmöglichen Algorithmen. Die erstellten Labyrinthe weisen jedoch eine Textur mit einer sehr hohen Vorspannung auf. FĂŒr jede Zelle schneiden wir einen Durchgang entweder nach oben oder nach links, jedoch niemals in beide Richtungen. In der Version mit zusĂ€tzlichen WĂ€nden wird fĂŒr jeden nach unten oder rechts fĂŒhrenden Scheitelpunkt ein Wandsegment hinzugefĂŒgt, jedoch nicht in beide Richtungen. Jede Zelle ist unabhĂ€ngig von allen anderen Zellen, da wir beim Erstellen nicht den Status einiger anderer Zellen ĂŒberprĂŒfen mĂŒssen. Daher ist dies ein realer Algorithmus zum Erzeugen von Labyrinthen ohne Speicher, der nicht durch die GröĂe der erstellten Labyrinthe begrenzt ist. TatsĂ€chlich ist dies ein BinĂ€rbaum, wenn wir die obere linke Ecke als Wurzel betrachten und jeder Knoten oder jede Zelle einen eindeutigen ĂŒbergeordneten Knoten hat, der eine Zelle darĂŒber oder links davon ist. Auf BinĂ€rbĂ€umen basierende Labyrinthe unterscheiden sich von idealen Standardlabyrinthen, da mehr als die HĂ€lfte der Zelltypen in ihnen nicht existieren können. Zum Beispiel wird es niemals Kreuzungen in ihnen geben, und alle Sackgassen haben Passagen, die nach oben oder links und niemals nach unten oder rechts fĂŒhren. Labyrinthe haben in der Regel Passagen, die diagonal von links oben nach rechts unten fĂŒhren, und es ist viel einfacher, sich von rechts unten nach links oben zu bewegen. Sie können sich immer nach oben oder links bewegen, aber niemals gleichzeitig in beide Richtungen, sodass Sie sich immer deterministisch diagonal nach oben und links bewegen können, ohne auf Barrieren zu stoĂen. Sie haben die Möglichkeit zu wĂ€hlen und in Sackgassen zu geraten, indem Sie sich nach unten und rechts bewegen. , , , .
Sidewinder: , . : , , . , , , , , . , ( , ). , sidewinder . , sidewinder . , sidewinder , , . sidewinder , « ». , sidewinder â , , , , . sidewinder , , , .
Algorithmus | % Sackgassen | Typ | PrioritÀt | Keine Voreingenommenheit? | Homogen? | Die Erinnerung | Zeit | % Lösung |
Einzelne Route | 0 | Baum | Die WĂ€nde | Ja | Niemals | N ^ 2 | 379 | 100,0 |
Rekursiver Backtracker | 10 | Baum | Gehwege | Ja | Niemals | N ^ 2 | 27 | 19.0 |
Jagen und töten | 11 (21) | Baum | Gehwege | Ja | Niemals | 0 | 100 (143) | 9,5 (3,9) |
Rekursive Division | 23 | Baum | Die WĂ€nde | Ja | Niemals | N * | 10 | 7.2 |
BinÀrer Baum | 25 | Viele | Beides | Nein | Niemals | 0 * | 10 | 2.0 |
Sidewinder | 27 | Viele | Beides | Nein | Niemals | 0 * | 12 | 2.6 |
Eller-Algorithmus | 28 | Viele | Beides | Nein | Nein | N * | 20 | 4,2 (3,2) |
Wilson-Algorithmus | 29 | Baum | Beides | Ja | Ja | N ^ 2 | 48 (25) | 4.5 |
Aldous-Broder-Algorithmus | 29 | Baum | Beides | Ja | Ja | 0 | 279 (208) | 4.5 |
Kraskal-Algorithmus | 30 | Viele | Beides | Ja | Nein | N ^ 2 | 33 | 4.1 |
Prima-Algorithmus (wahr) | 30 | Baum | Beides | Ja | Nein | N ^ 2 | 160 | 4.1 |
Prima-Algorithmus (vereinfacht) | 32 | Baum | Beides | Ja | Nein | N ^ 2 | 59 | 2.3 |
Prima-Algorithmus (modifiziert) | 36 (31) | Baum | Beides | Ja | Nein | N ^ 2 | 30 | 2.3 |
Baum wÀchst | 49 (39) | Baum | Beides | Ja | Nein | N ^ 2 | 48 | 11.0 |
Wald wÀchst | 49 (39) | Beides | Beides | Ja | Nein | N ^ 2 | 76 | 11.0 |
Diese Tabelle fasst die Eigenschaften der oben beschriebenen Algorithmen zur Erzeugung idealer Labyrinthe zusammen. Zum Vergleich wurde ein Einweg-Labyrinthalgorithmus hinzugefĂŒgt (theoretisch sind Einweg-Labyrinthe ideal). SpaltenerklĂ€rung:- : , , , 2D-. . , , , . 10% ( ) 49% ( ). Recursive Backtracker 1%. 66%: .
- : : , , . , , , , . , , .
- : , . . , , . Recursive Backtracker , , , . , , . , Hunt and Kill , , .
- : , . , . Sidewinder , . , . Hunt and Kill , , , .
- : . «» , . «» , , . «» , , . , .
- : , . , , (N), (N^2). , ( ). , , . Sidewinder , . , .
- : , , , . , ( 10), . 100x100 Daedalus. , , , .
- : , , . , 100x100 . . «» . , . , . , , , .
Es gibt viele Möglichkeiten, Labyrinthe zu lösen, und jede hat ihre eigenen Eigenschaften. Hier ist eine Liste spezifischer Algorithmen:
Folgen entlang der WÀnde (Wall Follower) : . («»), . ( ). , ( ) . , . , , . , , , . 3D- , 3D- 2D-, .. , -, -, .
: , «» , . 2D- , , .. . , , . . , , . , , . , , . , , â -1, â 1. , , .. 360 , «». , «», , , , , . , , . , â , .
: (Chain algorithm) , ( ) . , , . , . , , . , . ( ) , . . , , . «» , . , , , . , . , .
Recursive backtracker: , . , . : ( ), «», , , «», , . , , «»; «» . (backtracking) , , . , . , , .
(Trémaux's algorithm): . recursive backtracker : , . , . , , . , , , . ( , .) , (.. ), , , , (.. , ). , , , , , . , . , , .
(Dead end filler) : . , . , , . , . , , . , , .
Cul-de-sac filler : , , . dead end filler, , . ( â , , ) , . dead end filler. , , , , . , , , dead end filler.
Blind alley filler : , , . , . â , , . , , cul-de-sac filler, . . , , , , . , , , ( ). , , . , cul-de-sac filler - , collision solver , - .
Blind alley sealer : blind alley filler , , . . . , , blind alley filler, . . , , , , . , , . , . , , . , , .
(Shortest path finder): , , . , , . collision solver, , , «» , ( ), «» , , . «», , . , - , . , , , A* , .
(Shortest paths finder) : , . , , , , , , , - , . , , , «» , , , . , , , , . , .- Collision solver: "amoeba" solver. . , . «» , ( ). « » ( ), , . «», , , , . ( , «», . , , , .) , shortest paths finder, ( ) ( ).
- Random mouse: , , .. , . 180 , . , , . , , .
| | ? | PrioritÀt | ? | ? | ? | ? |
Random Mouse | 1 | Nein | Du bist | / | Nein | Ja | Nein |
Wall Follower | 1 | Nein | Du bist | / | Ja | Ja | Ja |
| 1 | Nein | Du bist | / | Ja | Ja | Ja |
| 1 | Ja | + | Nein | Ja | Nein | Ja |
Recursive Backtracker | 1 | Ja | Du bist | Nein | Ja | Nein | Ja |
Tremo-Algorithmus | 1 | Ja | Du bist | Innen / ĂŒber | Nein | Nein | Ja |
Sackgasse FĂŒller | Alle + | Nein | Labyrinth | Ăber | Nein | Ja | Ja |
Sackgasse FĂŒller | Alle + | Nein | Labyrinth | Ăber | Nein | Ja | Ja |
Sackgasse Sealer | Alle + | Ja | Labyrinth | Nein | Nein | Nein | Ja |
SackgassenfĂŒller | Alle | Ja | Labyrinth | Ăber | Nein | Ja | Nein |
Kollisionslöser | Alles am kĂŒrzesten | Ja | Sie + | Nein | Nein | Nein | Ja |
Suche nach kĂŒrzesten Wegen | Alles am kĂŒrzesten | Ja | Sie + | Nein | Ja | Nein | Ja |
Suche nach dem kĂŒrzesten Weg | 1 kĂŒrzeste | Ja | Sie + | Nein | Ja | Nein | Ja |
In dieser Tabelle sind die Eigenschaften der oben beschriebenen Labyrinthlösungsalgorithmen kurz aufgefĂŒhrt. Nach diesen Kriterien ist es möglich, Algorithmen zur Lösung von Labyrinthen zu klassifizieren und zu bewerten. SpaltenerklĂ€rungen:- : , . . , () . Dead end filler cul-de-sac filler ( blind alley sealer ) , , , «+».
- : . Random mouse «», , wall follower «», , . dead end filler cul-de-sac filler «», .
- : : «» ( ) . , ( «») («+») . , .
- : , , . , «», , ( ), , , , . .
- : . , , , , . Wall follower, . Recursive backtracker shortest path(s) finder .
- : . .
- Schnell: Wird der Entscheidungsprozess als schnell angesehen? Die effizientesten Algorithmen reichen aus, um jede Zelle des Labyrinths nur einmal zu betrachten, oder sie können Teile davon vollstĂ€ndig ĂŒberspringen. Die Laufzeit sollte proportional zur GröĂe des Labyrinths oder O (n ^ 2) sein, wobei n die Anzahl der Zellen entlang einer Seite ist. ZufĂ€llige MĂ€use sind langsam, da ihre Fertigstellung nicht garantiert ist und der SackgassenfĂŒller möglicherweise das Labyrinth von jeder Gabel löst.
Andere Operationen mit Labyrinthen
Neben dem Erstellen und Lösen von Labyrinthen können Sie mit ihnen auch andere VorgĂ€nge ausfĂŒhren:
: « », , Fill FloodFill. FloodFill , , . , , FloodFill , . , , FloodFill , , . «» .
(Isolation remover): , , . , . , . ( , ) , . , , . .
: , , . , , . , . ( , ) . , , , . , .
: , . , , , , . , , . , . , blind alley sealer ( , ). , , .
- Daedalus : Daedalus, Windows. Daedalus .