MarkovJuniorは確率的プログラミング言語であり、プログラムは書き換えルールの組み合わせであり、推論は制約伝播を介して実行されます。MarkovJuniorは、現在マルコフアルゴリズムと呼ばれているものを定義および研究した数学者AndreyAndreyevichMarkovにちなんで名付けられました。
基本的な形式では、MarkovJuniorプログラムは、書き換えルールの順序付きリストです。たとえば、MazeBacktracker(左下のアニメーション)は、2つの書き換えルールのリストです。
RBB=GGRまたは「赤-黒-黒を緑-緑-赤に置き換えます」。
RGG=WWRまたは「赤-緑-緑を白-白-赤に置き換えます」。
各実行ステップで、MJインタープリターは、グリッド上で一致するリスト内の最初のルールを検索し、そのルールに一致するものをすべて検索し、そのルールをランダムな一致に適用します。迷路バックトラッカーの例では、インタプリタは最初に一連の
RBB=GGRルールを適用します。しかし、最終的には緑の自己回避歩行が行き詰まります。この時点で、最初のルールに一致するものがないため、インタープリターは
RGG=WWR、ウォークがスタックから外れるまで2番目のルールを適用します。その後、最初のルールを再度適用できます。ルールに一致するものがない場合、インタプリタは停止します。
MarkovJuniorの確率的推論により、将来の状態に制約を課し、制約された将来につながる実行のみを生成できます。たとえば、倉庫番のルールで推論
{RWB=BRW RB=BR}すると、(赤の)エージェントのグループが(白の)木枠を指定された形に編成します。
これらのアイデアを使用して、ダンジョン、建築、パズル、楽しいシミュレーションの多くの確率的ジェネレーターを構築します。
高解像度のスクリーンショットとより多くのシード:ModernHouse、SeaVilla、Apartemazements、CarmaTower、Escheresque、PillarsOfEternity、Surface、Knots。
アルファベットに対するマルコフアルゴリズム
Aは、規則の順序付きリストです。各ルールは、の形式の文字列です
x=y。ここで、
xおよび
yはの単語で
Aあり、一部のルールは停止ルールとしてマークされる場合があります。単語へのマルコフアルゴリズムの適用は、次の
wように進行します。
x=y最初のルールを見つけます。そのようなルールがない場合は、停止します。
x
w
xを。
wに置き換え
yます。
たとえば、アルファベットのこのマルコフアルゴリズムを考えてみましょう
{0, 1, x}(εは空の単語です)。
1=0x x0=0xx 0=ε
これを文字列に適用すると、次の文字列
110のシーケンスが得られます。
110 -> 0x10 -> 0x0x0 -> 00xxx0 -> 00xx0xx -> 00x0xxxx -> 000xxxxxx -> 00xxxxxx -> 0xxxxxx -> xxxxxx
一般に、このアルゴリズムは、数値の2進表現を1進表現に変換します。
マルコフの学生であるVilnisDetlovs は、どのチューリングマシンにも、同じ関数を計算するマルコフアルゴリズムが存在することを証明しました。対照的に、文法は順序付けられていない書き換えルールのセットであり、Lシステムは並行して適用される書き換えルールです。マルコフアルゴリズムのより興味深い例については、マルコフの本を確認するか、ウィキペディアのコメントセクションまたは乗算の例で最大公約数の例を参照してください。
マルコフアルゴリズムを複数の次元に一般化するにはどうすればよいでしょうか。まず、多次元では、文字列を別の文字列に挿入する自然な方法がないため、書き換えルールの左と右は同じサイズである必要があります。第二に、左端の一致を選択する自然な方法はありません。可能なオプションは次のとおりです。
(exists)ノードが行うことです。
{forall}ノードが行うことです。
新しい手順は決定論的ではないため、チューリング完全性は失われますが、実践では、この形式によって、興味深いランダムプロセスの膨大な範囲を記述できることが示されています。
最も単純なMarkovJuniorプログラムはおそらく
(B=W)です。含まれているルールは1つだけ
B=Wです。各ターンで、このプログラムはランダムな黒い四角を白い四角に変換します。
(B = W)| (WB = WW)| (WBB = WAW)| (WBB = WAW)
成長モデル
(WB=WW)はもっと興味深いものです。各ターンで、隣接するセルの白黒のペアが白と白のペアに置き換えられ
BWます
WW。言い換えれば、各ターンで、いくつかの白いセルに隣接するランダムな黒いセルを選び、それを白に着色します。このモデルは、エデン成長モデルとほぼ同じです。各ターンで、両方のモデルが同じ黒いセルのセットから選択します。それらは確率分布のみが異なります。白いセルに隣接する黒いセル全体の均一な分布は、隣接する黒いセルと白いセルのペア全体の均一な分布と同じではありません。
モデル
(WBB=WAW)は、1行のコードで迷路を生成します!従来の言語での実装と比較してください。MarkovJuniorモデルは、変更せずに任意の数の次元で実行できます。右側には、MagicaVoxelでレンダリングされた3DでのMazeGrowthの最終結果が表示されます。デフォルトでは、PICO-8パレットを使用します。
モデル
(RBB=WWR)は自己回避ランダムウォークです。3Dでの自己回避歩行は、2Dよりも平均して長いことに注意してください。一般に、異なる次元での同様のランダムプロセスの動作を比較することは、魅力的なトピックです。GeorgePólyaの古典的な結果によると、2Dでのランダムウォークは、確率1で初期位置に戻りますが、3Dではこれはもはや当てはまりません。
(RBB = WWR)| LoopErasedWalk | (RB = WR RW = WR)
複数のルールを1つのルールノードに入れることができます。たとえば、
(RBB=WWR RBW=GWP PWG=PBU UWW=BBU UWP=BBR)はループ消去されたランダムウォークです。トレイルモデルは、まともな接続された洞窟
(RB=WR RW=WR)を生成します。
モデルは、 Aldous-Broder迷路生成アルゴリズム
(RBB=WWR R*W=W*R)として知られています。入力のワイルドカード記号は、任意の色を正方形に含めることができることを意味します。出力のワイルドカード記号は、ルールの適用後に色が変更されないことを意味します。たとえば、Aldous-Broderアルゴリズムは、MazeGrowthよりも平均してはるかに多くのターンで迷路を生成しますが、MazeGrowthにはない優れた特性があります。つまり、各迷路は同じ確率で生成されます。言い換えると、MazeTrailは、偏りのない迷路生成アルゴリズムであるか、均一な分布で迷路(またはスパニングツリー)をサンプリングします。Wilsonのアルゴリズムは、より効率的なバイアスのない迷路生成アルゴリズムです。その比較
*従来の言語での実装によるMarkovJuniorの実装!
複数のルールノードをシーケンスノードに配置して、次々に実行することができます。河川モデルでは、最初に2つのソースを使用して確率的ボロノイ図を作成し、形成された領域間の境界を河川のベースとして使用します。次に、ボロノイシードをさらに2つスポーンして、森を育て、同時に川から草を育てます。その結果、ランダムな川の谷ができます!
Apartemazementsでは、WFCノードから始めて、ルールノードを使用して建設的な後処理を行います。
ノードを組み合わせるさらに興味深い方法は、ノードをマルコフノードに配置することです。マルコフノードは、過去のノードに戻ることができるため、私たちができることを大幅に拡張します。マルコフノードがアクティブな場合、インタープリターはそれに一致する最初の子ノードを見つけて適用します。次のターンで、リスト内で最初に一致するノードが再び検索され、以下同様に続きます。マルコフノードの使用の最も簡単な例は、上部のセクションで説明したMazeBacktrackerです。
MarkovJuniorの開発の動機となった私のお気に入りの例の1つは、BobNystromのダンジョン生成アルゴリズムです。それは次のようになります:
{PBB=**P}ます。
(room.png)。
({GWW=**G}(GBW=*WG))。
(GBG=*W* #5)を作成して、結果のダンジョンにサイクルができるようにします。プレイヤーはすでに探索されたゾーンを通り抜けなければならないので、サイクルのないダンジョンはかなり退屈です。
{BBB/BWB=BBB/BBB}。
REFALの場合と同様に、マルコフノードはネストできます。子ノードに入ると、子ブランチが完了するまで外部ノードを無視します。
MarkovJuniorの確率的推論により、将来の状態に制約を課し、制約された将来につながる実行のみを生成できます。言い換えると、推論は、2つの指定された状態(または部分的に観察された状態)を一連の書き換えルールに接続します。
推論の使用の最も簡単な例は、2つのポイントをパスで接続することです。自己回避歩行モデルでは、グリッド上の特定の正方形が赤くなるのを観察
(RBB=WWR)できます。次に、通訳者は、観察された正方形につながる歩行のみを生成します。温度パラメータを変更することで、より厳密に、またはより厳密に目標に従わないようにインタプリタを設定できます。デフォルトでは、温度はゼロに設定されています。
R
私たちができるもう1つのことは、すべての奇数のグリッドの正方形が白または赤になるのを観察することです。次に、通訳者はグリッド全体をカバーする自己回避歩行を生成します。
あらゆる書き換えルールについて推論を行うことができます。たとえば、階段描画ルールの推論は、2つのポイントを階段パスに接続します。ルールの推論
R**/**B=B**/**Rにより、チェスの騎士がたどることができるパスが生成されます。CrossCountryモデルの推論は、地形コストを考慮したパスで2つのポイントを接続します。倉庫番ルールセットの推論は、倉庫
{RB=BR RWB=BRW}番パズル、さらにはマルチエージェント倉庫番パズルを解決します!
MarkovJuniorでの推論は、単方向(高速)または双方向(低速ですが、より強力)の制約伝播を介して行われます。リライトルールの単方向制約伝播は、任意のリライトルールのダイクストラフィールドを一般化するルール伝播フィールドの観点から同等に説明できます。ダイクストラフィールドは、グリッドベースの手続き型生成(1、2、3 )で一般的な手法です。次に、コンピュータグラフィックスで使用される距離フィールドを一般化します。
制約の伝播が完了した場合、それは必ずしも目標状態が達成可能であることを意味するわけではありません。しかし、伝播が失敗した場合、目標が達成できないことは確かです。これにより、倉庫番の間違った壁に木枠が押し込まれたり、グリッドを覆うウォークがグリッドを2つの切断された部分に分割したりする状態をキャッチできます。このブールヒューリスティックに加えて、制約の伝播が完了するために必要な最小ターン数を確認する価値があります。この整数値のヒューリスティックは許容され、A *検索で使用して、2つの指定された状態間の書き換えルールで作成されたパスをサンプリングします。
チューリングマシンやラムダ計算と比較すると、マルコフアルゴリズムは、アルゴリズムが何であるかを厳密に定義するための最短かつ最も簡単な方法です。
演習:次のマルコフアルゴリズムが、一進表現で書かれた2つの数の最大公約数を見つけることを証明します。たとえば、これを適用すると、
111111*1111111111が得られ
11ます。
1a=a1 1*1=a* 1*=*b b=1 a=c c=1 *=ε (halt)
高速パターンマッチング。MarkovJuniorインタープリターのサンプルは均一に一致しますが、グリッド全体を毎ターンスキャンするわけではありません。パターンマッチングを高速に保つために、インタプリタは以前に見つかった一致を記憶し、変更された場所の周りのみを検索します。ルールノードに初めて遭遇したとき、MJインタープリターはボイヤームーアアルゴリズムの多次元バージョンを使用します。
Stochastic relaxation. Markov nodes have a very nice representations as limits of differentiable nodes. Consider an unordered set of rewrite rules where each rule
ris assigned a weight
w(r). On each step the interpreter finds all matches for all rules and chooses a random match according to the Boltzmann distribution
p(r) ~ exp(-w(r)/t). Then in the freezing limit
t->0we get a Markov node, ordered by weights. What's good about this construction, is that for any
t>0and for a typical score function, score's average on multiple runs would be a continuous (and smooth for practical purposes) function of weights. This means that one can find the optimal weights by gradient descent and then freeze the system to get the final discrete program.
Read this essay by Boris Kushner about A. A. Markov and his work in constructive mathematics.
Main used work:
関連作業:
例のソース:
ボクセルシーンは、MagicaVoxelでephtracyによってレンダリングされました。ローグライクレベルの生成でダイクストラフィールドの力を示してくれたBrianBucklewと、多くの良い提案をしてくれたKevinChapelierに特に感謝します。GUIで使用されるフォントはTamzenです。
MarkovJuniorインタプリタは、標準ライブラリのみに依存するコンソールアプリケーションです。.NET Core for Windows、Linux、またはmacOSを入手して、
dotnet run --configuration Release MarkovJunior.csproj
または、Windows用の最新リリースをダウンロードして実行します。
生成された結果はフォルダに入れられ
outputます。編集
models.xmlしてモデルパラメータを変更します。MagicaVoxel
.voxでファイルを開きます。
マルコフジュニア開発はによって資金を供給されました