制約で敷き詰める — WFC
タイルの一片一片に「この辺の右にはこの辺しか来られない」という隣接の制約をつけて、矛盾しないように一マスずつ確定させていく。各マスは最初すべてのタイルの可能性を重ね持っていて、いちばん候補の少ないマスから一枚に確定し、その確定が隣の候補を削り、削れた隣がさらにその隣を削る、と制約が伝播する。
Wave Function Collapse は、量子状態の重ね合わせと観測の比喩で組まれた制約充足。各セルが取りうるタイルの集合を持つ、その集合が波(重ね合わせ)。観測=候補が最小のセルを一枚に確定すること、伝播=その確定で破れた隣接制約を波及させて他セルの候補を削ること。エントロピー最小(候補数が最小)のセルから観測すると矛盾が起きにくい。Maxim Gumin が 2016 年に公開し、サンプル画像から隣接ルールを学べる版がレベル生成で広く使われる。
タイルは四辺それぞれが「繋がる/繋がらない」の二値を持つ配管片。上右下左の四ビットで状態を表すと、繋ぎ方は 0(無)から 15(十字)まで 16 通りある。隣接の約束はひとつ——あるタイルが右辺で繋がるなら、右隣は左辺で繋がっていなければならない。辺の有無が合うペアだけが隣り合える。
16 枚すべてが盤に並ぶ。左上が四辺とも繋がらない孤立片、右下が四方へ伸びる十字。隣接の制約は辺ビットの一致で書ける。あるタイルが向き d の辺で繋がっているなら、その隣に置けるのは反対辺で繋がっているタイルだけ。繋がっていないなら、隣は反対辺も繋がっていないものだけ。下は十字(15)を真ん中に固定して、四方それぞれで「右隣に置けるタイル」を回しながら見せる。中央が辺で繋がっている向きには、隣も必ず辺を返す。
四方の隣がどう入れ替わっても、中央の辺が繋がる向きには隣も辺を返し、繋がらない向きには隣も辺を出さない。配管が途切れない。この一致だけを盤面全体で守らせると WFC になる。全マスを 16 ビットの候補集合 0xffff で初期化し、候補の少ないマスを一枚に確定(観測)して、隣接で潰せる候補を波及(伝播)させる。候補集合の AND だけで制約が伝わる。
候補が少ないマスから確定し、確定が波及して隣の候補が潰れ、潰れた隣がまたその隣を削る。確定済みのマスは配管が引かれ、まだ迷っているマスは候補の多さで薄く塗られる。盤が全部確定すると、辺の約束を一つも破らない配管が画面いっぱいに繋がる。途中で候補がゼロになる矛盾に陥ったら盤をやり直す。Wang タイルの「辺の色を合わせて敷く」をバックトラックで解くのを、全マス同時に候補集合で進める版になる。