

迷路は、あらかじめ決められたセル配置(最も一般的なのは長方形のグリッドだが、他の配置も可能)と、それらの間に壁となる場所を設けることで生成できる。このあらかじめ決められた配置は、エッジが壁となる場所、ノードがセルを表す連結グラフと考えることができる。迷路生成アルゴリズムの目的は、特定の2つのノード間の経路を見つけるのが難しい部分グラフを作成することである。
部分グラフが連結でない場合、探索空間に貢献しないため、グラフの一部が無駄になります。グラフにループが含まれている場合、選択されたノード間に複数のパスが存在する可能性があります。このため、迷路生成はランダムな全域木を生成するというアプローチで行われることがよくあります。単純な迷路ソルバーを混乱させる可能性のあるループは、アルゴリズムの実行中に結果にランダムなエッジを追加することによって導入できます。
このアニメーションは、長方形グリッド上にないグラフの迷路生成手順を示しています。まず、コンピュータは青色で示されるランダムな平面グラフGと、黄色で示されるその双対グラフFを作成します。次に、深さ優先探索などの選択されたアルゴリズムを使用してFを走査し、経路を赤色で着色します。走査中に、赤色の辺が青色の辺と交差するたびに、青色の辺が削除されます。最後に、Fのすべての頂点が訪問されると、Fが消去され、Gから入口と出口の2つの辺が削除されます。

このアルゴリズムは「再帰的バックトラッカー」アルゴリズムとも呼ばれ、深さ優先探索アルゴリズムのランダム化バージョンである。
スタックを用いて実装されることが多いこの方法は、コンピュータを使って迷路を生成する最もシンプルな方法の一つです。迷路の空間を、大きなセルのグリッド(大きなチェス盤のようなもの)と想像してください。各セルは4つの壁で始まります。コンピュータはランダムなセルから開始し、まだ訪れていない隣接するセルをランダムに選択します。コンピュータは2つのセルの間の壁を取り除き、新しいセルを訪問済みとしてマークし、スタックに追加してバックトラックを容易にします。コンピュータはこのプロセスを続け、未訪問の隣接セルがないセルは行き止まりとみなされます。行き止まりに到達すると、未訪問の隣接セルがあるセルに到達するまでパスをバックトラックし、この新しい未訪問のセルを訪問することでパスの生成を続けます(新しい分岐点を作成します)。このプロセスはすべてのセルが訪問されるまで続き、コンピュータは開始セルまでバックトラックします。すべてのセルが訪問されることは確実です。
前述のように、このアルゴリズムは深い再帰処理を伴うため、一部のコンピュータアーキテクチャではスタックオーバーフローの問題が発生する可能性があります。このアルゴリズムは、バックトラッキング情報を迷路自体に格納することでループ構造に再構成できます。また、任意の地点から開始して先頭に戻ることで、解を素早く表示することも可能です。

深さ優先探索で生成された迷路は、分岐係数が低く、長い通路が多く含まれる。これは、アルゴリズムが各分岐に沿って可能な限り遠くまで探索してから、後戻りするためである。
迷路生成における深さ優先探索アルゴリズムは、バックトラッキングを用いて実装されることが多い。これは、以下の再帰ルーチンで表すことができる。
これは、領域内の任意の初期セルに対して一度だけ呼び出されます。
最初の方法の欠点は、再帰の深さが大きくなることです。最悪の場合、処理対象領域のすべてのセルでルーチンを再帰する必要があり、多くの環境では再帰スタックの最大深さを超える可能性があります。解決策として、同じバックトラッキング方法を明示的なスタックで実装できます。明示的なスタックは通常、問題なくはるかに大きなサイズまで拡張できます。
このアルゴリズムは、クラスカルのアルゴリズムをランダム化したバージョンです。
セルの集合をモデル化するために使用できるデータ構造はいくつかあります。互いに素な集合のデータ構造を使用した効率的な実装では、2 つの集合に対する各結合と検索操作をほぼ定数償却時間(具体的には、時間;任意の妥当な値に対してしたがって、このアルゴリズムの実行時間は、基本的に迷路で使用できる壁の数に比例します。
壁のリストが最初にランダム化されているか、非ランダムなリストからランダムに壁が選択されているかはほとんど問題ではなく、どちらの方法でもコーディングは同じくらい簡単です。
このアルゴリズムの効果は、均等な重みを持つ辺を持つグラフから最小全域木を生成することであるため、比較的簡単に解ける規則的なパターンを生成する傾向がある。
このアルゴリズムは、プリムのアルゴリズムをランダム化したバージョンです。
ランダムなエッジ重みを持つグラフに対して古典的なプリム法を実行すると、どちらも最小全域木アルゴリズムであるため、クラスカル法とスタイル的に同一の迷路が生成されます。一方、このアルゴリズムでは、始点に近いエッジほど実効重みが低くなるため、スタイル的なバリエーションが生まれます。
古典的なプリムのアルゴリズムでは辺のリストを保持しますが、迷路生成においては、代わりに隣接するセルのリストを保持することもできます。ランダムに選択されたセルが既存の迷路に接続する複数の辺を持っている場合、これらの辺のうち1つをランダムに選択します。この方法は、上記の辺ベースのバージョンよりもわずかに分岐が多くなる傾向があります。
このアルゴリズムは、すべてのセルやエッジの重みを追跡するのではなく、既に訪問したセルに隣接するセルをランダムに選択することで、さらに簡略化できる。
スタート地点のセルへの道を見つけるのは比較的簡単だが、それ以外の場所への道を見つけるのは難しい場合が多い。

上記のアルゴリズムはすべて、さまざまな種類のバイアスを持っています。深さ優先探索は長い通路に偏りがあり、クラスカル/プリムのアルゴリズムは短い行き止まりが多いことに偏っています。一方、ウィルソンのアルゴリズム[ 1 ]は、ループ消去ランダムウォークを使用して、すべての迷路にわたる一様分布から偏りのないサンプルを生成します。
まず、任意に選択した1つのセルで迷路を初期化します。次に、任意に選択した新しいセルから開始し、迷路内のセルに到達するまでランダムウォークを実行します。ただし、ランダムウォークが途中で自身の経路に到達してループを形成した場合は、ループを削除してから処理を進めます。経路が迷路に到達したら、それを迷路に追加します。その後、別の任意の開始セルからループを削除したランダムウォークを再度実行し、すべてのセルが埋まるまで繰り返します。
この手順は、開始セルを任意に選択する方法に関わらず、偏りのないままです。したがって、簡略化のために、(例えば)左から右、上から下の順に、常に最初に空いているセルを選択することができます。
Aldous-Broderアルゴリズムも均一全域木を生成します。しかし、これは最も効率の悪い迷路アルゴリズムの1つです。[ 2 ]
迷路は再帰的分割というアルゴリズムで作成できます。このアルゴリズムは次のように動作します。まず、壁のない迷路の空間を用意します。これを「部屋」と呼びます。次に、ランダムな位置にある壁(または複数の壁)で部屋を分割し、各壁の内側にランダムな位置にある通路の開口部を設けます。そして、すべての部屋が最小サイズになるまで、このプロセスをサブ部屋に対して再帰的に繰り返します。この方法によって、空間を横切る長い直線状の壁を持つ迷路が作成され、避けるべきエリアが分かりやすくなります。
例えば、長方形の迷路の場合、互いに垂直な2枚の壁をランダムな位置に構築します。これらの2枚の壁によって、大きな部屋は4つの小さな部屋に分割され、それぞれの部屋は4枚の壁で区切られます。4枚の壁のうち3枚をランダムに選び、それぞれの壁のランダムな位置に、幅1セル分の穴を開けます。この手順を繰り返し、すべての部屋が2方向のいずれかで幅1セルになるまで続けます。

これは迷路を生成するためのシンプルで素早い方法です。[ 3 ]
このアルゴリズムは、各反復処理において、自身を3回コピーすることで、元の迷路の2倍の大きさの迷路を作成します。各反復処理の終了時には、4つの小さな迷路の間に3つの通路が開かれます。
この方法の利点は、非常に高速であることです。欠点は、指定したサイズの迷路を作成できないことですが、この問題を回避するための様々な工夫があります。

2D迷路の1行または3D迷路の1平面を格納するのに十分なメモリのみを必要とする他のアルゴリズムも存在します。Ellerのアルゴリズムは、現在の行のどのセルが前の行のセルを介して接続されているかを格納することでループを防ぎ、既に接続されている2つのセルの間の壁を決して削除しません。[ 4 ] Sidewinderアルゴリズムは、最上段全体に沿って開いた通路から始まり、後続の行は、上の通路に1つ接続された短い水平通路で構成されます。Sidewinderアルゴリズムは、上向きの行き止まりがないため、下から上に解くのは簡単です。[ 5 ]開始幅が与えられると、どちらのアルゴリズムも高さ無制限の完全な迷路を作成します。
ほとんどの迷路生成アルゴリズムでは、結果が解けるように、迷路内のセル間の関係を維持する必要があります。しかし、有効な単連結迷路は、各セルに個別に注目することで生成できます。二分木迷路は、各セルに常に上方向または左方向への通路があり、両方にはない標準的な直交迷路です。二分木迷路を作成するには、各セルについてコインを投げて、上方向または左方向への通路を追加するかどうかを決定します。境界上のセルでは常に同じ方向を選択すると、左上隅がルートとなる二分木のような有効な単連結迷路が得られます。サイドワインダーと同様に、二分木迷路にはバイアスの方向に行き止まりはありません。

10 PRINT CHR$ ( 205.5 + RND ( 1 )); : GOTO 10各セルに対してコインを投げるのと似た方法として、スラッシュとバックスラッシュの文字をランダムに組み合わせて画像を作成する方法があります。これは有効な単連結迷路を生成するのではなく、閉じたループと一筆書きの通路の集合を生成します。Commodore 64のマニュアルには、このアルゴリズムを使用した BASIC プログラムが掲載されており、より滑らかなグラフィック表示のためにPETSCII斜線グラフィック文字が使用されています。
特定の種類のセルオートマトンを使用して迷路を生成できます。[ 6 ]よく知られているセルオートマトンである Maze と Mazectric の 2 つは、ルール文字列が B3/S12345 と B3/S1234 です。[ 6 ]前者の場合、これは、セルが少なくとも 1 つ、最大で 5 つの隣接セルを持つ場合に、1 世代から次の世代に生き残ることを意味します。後者の場合、これは、セルが 1 ~ 4 つの隣接セルを持つ場合に生き残ることを意味します。セルがちょうど 3 つの隣接セルを持つ場合、そのセルは生成されます。どの世代でも、生きているセルが 1 つ、4 つ、または 5 つの他の生きているセルに隣接していないパターンは、コンウェイのライフ ゲームとまったく同じように動作するという点で、コンウェイのライフ ゲームに似ています。 [ 6 ]ただし、大きなパターンでは、ライフ ゲームとは非常に異なる動作をします。[ 6 ]
ランダムな開始パターンの場合、これらの迷路生成セルオートマトンでは、通路を明確に区切る壁を持つ複雑な迷路が生成されます。ルール B3/S1234 を持つ Mazectric は、ルール B3/S12345 を持つ Maze と比較して、より長くまっすぐな通路を生成する傾向があります。[ 6 ]これらのセルオートマトン規則は決定論的であるため、生成される各迷路は、ランダムな開始パターンによって一意に決定されます。迷路は比較的予測可能である傾向があるため、これは重大な欠点です。
上述のグラフ理論に基づく手法と同様に、これらのセルオートマトンは通常、単一の開始パターンから迷路を生成します。そのため、開始セルへの経路を見つけるのは比較的容易ですが、それ以外の場所への経路を見つけるのは困難になります。