見出し画像

TRPGシナリオ(特にCoC)の複雑度としての位相幾何学

弊シナリオ『不自由落下』の微ネタバレがある可能性があります。

提案

はじまり

キッカケは些細なツイート。

有限オートマトンについての詳細は各自で調べてもらう ※1 として、終了することが明らか ※2 な「シナリオ」というものが有限オートマトンであるのはほぼ自明と言っていいと思う。
であれば、その知識を使うことでシナリオの複雑さというものを定式化出来るんじゃないか、というのが最初の思いつきだ。
以下、詳しく解説をしていく。
また、保険をかけておくと、僕は残念ながらオートマトンの専門家ではないので誤りや知識不足がある可能性が高い。※3

※1:雑にはフローチャートを思い描いておけば問題ないかもしれない
※2:特殊なケースはいくらでもあるかもしれないけど、人間がプレイする以上有限の範囲で収まるはずなので本当は「停止する」とか書きたかったが、なんか怖くなったのでやめた
※3:寧ろ教えてくれると大変嬉しいです

予想

「任意のシナリオに対して、位相幾何的不変量(1次ベッチ数)を考えることが出来、それがシナリオの複雑性を表しているのではないか」

これが今回考えたいことである。
これだけで全部分かった人はもう後は読まなくても良い。
一つも意味が分からなかった人は後を読んでも分からないかもしれない。
じゃあ、誰のための文章なんだ。

前提

「任意のシナリオは有限オートマトンとして記述できる」

厳密な証明をするためには「シナリオ」や「記述できる」の定義が必要だろうが、ここではそれを求められているとも思えないので省略する。
ラフに書くと、有限個のイベントとその遷移としてシナリオは説明できるのでそのまま有限オートマトンに落とし込めるはずだ。
当然だが、これは等価の意味ではなく、シナリオから有限オートマトンを抽出できるというニュアンスが正しい。

状態遷移図

ところで、有限オートマトンでは状態を頂点、遷移を辺としたグラフ構造に注目することが多々ある。
このグラフ構造を図に描き起こしたものが状態遷移図と呼ばれている。
ここで重要なのは「有限オートマトンからグラフ構造が抽出できる」ことにある。

グラフ構造

グラフと聞いて何を思い浮かべるかは人によると思うが、ここではグラフ理論(数学)におけるグラフ構造について言及する。
簡単に言うと頂点と辺から構成される構造のことであり、一番身近な例で言えば路線図を思い浮かべると良い。

1次ベッチ数

ベッチ数は代数的位相幾何学における位相空間の不変量だ。ホモロジー群のランクとして定義される。
特に「1次」は1次元ホモロジー群が対象であることを示している。

と、ここまで書いて数学に興味のない人は何を言っているのか分からないだろう。※1
今回必要な知識は、グラフ構造に対して一つの数字 ※2 が定まり、それがある種の特性を表しているということである。
そして、これが今回も利用できるのではないか、というのが最初の提案だった。

一般のベッチ数を導入するには説明すべき事項がまだまだあるが、グラフに対してであれば単純である。
頂点 n 個、m 本の辺、k 個の連結成分をもったグラフ G の1次ベッチ数は、m − n + k に等しいからだ。
特に、今回、「シナリオ」から導出されたグラフを考える以上は明らかに k = 1 である。※3
つまり、n 個のイベントと m 個の遷移を持つシナリオに対しての1次ベッチ数は m - n + 1 である。

実際に計算してみよう。

※1:今更か
※2:自然数であることが分かっている
※3:連結成分とは字面通りに「繋がっている」ことを想像すれば良いのだが、例えばキャンペーンシナリオでも完全に分離している、ということはないのではないだろうかという過程に基づく。完全に分離しているが一つのシナリオとして成り立っているようなシナリオを考えてみるのも面白いかもしれない。

具体例

一本道クローズドシナリオ

まずは簡単な例として、以下のようなプロットを書いた。

ごく単純なプロット

一本道のクローズドシナリオである。特に元ネタはない。
このシナリオではイベント(丸の部分)が三つ。遷移(棒の部分)が二つである。
つまり、グラフとしてみると、頂点が三つ、辺が二つとなる。
これを上の式に当てはめて計算してみると、

2 - 3 + 1

となり 0 になっていることが確認できる。

自作シティシナリオ(不自由落下)

次に自由度の高いシナリオの例として、自作を取り上げる。
https://aigeiensya.booth.pm/items/2855060  に収録されている『不自由落下』というシナリオだ。
このシナリオには付録としてフローチャートのようなものがついているのでそれを使って計算してみる。
多分次の図を見ても大してネタバレにはならないはずだ。多分。

弊シナリオのフローチャートのようなものをグラフにしたもの

これらの点の数を数えると 40 もある。辺の数は 48 だ。
これで計算してみると、

48 - 40 + 1

という訳で弊シナリオの1次ベッチ数は 9 だ。

※1:実は今回の記事は最初、テーマとしてオイラー標数を使っていたが、これは完全に間違いで、うまく利用することができない。そのために斜線が図中に引かれているが無視して欲しい。描き直すのは面倒なのだ。

妥当性

さて、実際に計算してみた結果、気になるのは妥当性だ。
つまり、この数値は何を意味していて、実際にそれはシナリオの複雑度として有用なのか、という点である。

さて、一次ベッチ数の意味だが、これは数学の言葉では「サイクルの数」として知られている。
簡単に言えば”わっか”になっている部分の個数だ。※1
では、わっかを数えれば良いと思うかもしれないが、必ずしも図を書かなくても計算ができるという点で公式のように利用することが出来るところに有用性を見つけられるだろうか?※2

更に追加の情報として、1次ベッチ数には工学的な応用が知られている。
これは「循環的複雑度」と呼ばれている。
フローとして捉えるとプログラムもシナリオも似たところがあり、そのような観点から言えば十分有用だと考えることもできる。

※1:例で数えてみると面白いかもしれない
※2:とは言え、遷移の計算には図を描いた方がずっと早いような気もする。

最後に

ぶっちゃけ思いつきレベルの話なので、実際にどれくらい役に立つのか、妥当であるのかはこれから大量にサンプルを用意してやっていく必要がある。
しかし、一度自分のシナリオの1次ベッチ数を計算してみるのも面白いのではないだろうか。

この記事が気に入ったらサポートをしてみませんか?