見出し画像

Outer Wilds探索日誌:中間レポート①

本記事は初見プレイヤーによる探索途中の考察と妄想です。
本人およびクリア済プレイヤーが読んでニヤニヤすることを意図しており、未プレイ者の閲覧は基本オススメしません。
宇宙の謎は君の目で確かめてくれ!

こんにちは、電気系エンジニアの由井河です。考察が大好きなのでやっていきたく存じます。対戦よろしくお願いします。

『灰の双子星プロジェクト』の問題点とは?

『灰の双子星プロジェクト』は『宇宙の眼』の座標を特定するにあたって以下のようなプログラムを実行している時間遡行コンピュータであると考えられます。サボテンが目を離した隙に消えたり現れたりする世界ですが、チューリング完全が成り立つことをここでは固く信じることにしましょう。

画像1

この場合、ループを繰り返して『宇宙の眼』の座標が確定してしまえば、探査機を発射する必要がそもそもありません。観測者たるNomaiたちからすれば、ループ処理に入ったことすら見えず、プログラムを実行した時点で『宇宙の眼』の座標を受信した結果が残っています。軌道探査砲をぶっ壊して始末書を書く心配はなさそうですね。クラゲと泳ぐ必要もありません。

ところがゲーム中では『宇宙の眼』の座標が確定しているにも関わらず、ループ(黄色の処理)を繰り返しています。どうしてでしょうか?

これはプログラムに異常が発生したときのためのフェイルセーフが備わっているためだと思われます。そもそも今回の起動は意図したものではなく、太陽が自然に超新星爆発を起こしたことにより起動したものでしたよね?

こうした「異常な起動」や、機器の故障や諸々の不具合に備えて以下のようなルーチンが組まれていたと想像できます。

画像2

異常事態の発生を検知すると、仮面とリンクされたNomaiに記憶を送信し、ループの中へ召喚します。ループの中に召喚されたNomaiエンジニアは問題を特定し解決にあたる使命をおびています。必要であれば、仮面でリンクされた他のNomaiをさらに召喚して、問題解決の助力を頼むこともできます。

異常発生で即ループを中止すればいいじゃん?と思うでしょうが、そこはNomaiの目の付け所がシャープなところです。ループを即終了してしまうとそもそも何が起きたのかすらわかりません。何もしていないのに起動しない、を防ぐためですね。

再現しない不具合のトラブルシューティングは非常に大変であることが一般に広く知られていますが、Nomaiエンジニアは22分間を繰り返す中で(幸か不幸かはわかりませんが)必ず不具合に遭遇できます!

この場合、プログラムの中止権限は召喚された(事態を把握している)Nomaiエンジニアに委ねられている点にも注目です。原因特定前に勝手にループを終了されては困りますからね。

要約すると『灰の双子星プロジェクト』とは、不具合が発生したときに「全自動でエンジニアを叩き起こし、原因を特定できるまで延々と調査をさせる」というよくできたプログラムであると言えるでしょう。胃が痛くなってきた(甦るトラウマ)

なるほど完璧な作戦っスねーー っ
召喚されるNomaiがいないと成立しないという点に目をつぶればよぉ~

これを読んだみなさんが、問題解決に奔走するエンジニアに対してちょっとやさしくなれることを切に願います。

起こり得る不具合とは?

「起こり得ることは起こる」というのがマーフィーの法則の意味するところですが、ここではループ中に起こりそうな不具合についてもう少し考えてみましょう。

最もあり得る問題としては観測データのスタックオーバーフローがあります。以前の観測データから次の発射方向を決めている(そうでないと同じ方向に探査機を飛ばしてしまう)と考えられるので、毎回毎回データが蓄積していきます。しかしながらメモリの容量には物理的に有限(全宇宙の原子の数すら有限)ですので、いつかはオーバーフローを起こすと容易に想定できます。そうなる前にエンジニアを召喚するように設計されていると考えるのが妥当ですね。皆様におかれましては、無限の処理を実行する前には無限のメモリを確保しておくと良いでしょう。

構成機器のハードウェア的な不具合も十分に起こり得ると言えるでしょう。入念に冗長性を確保しているとは考えられますが、電気的・機械的部品を使用する限り、故障は避けられません。

余談ですが、機器の信頼性を表す指標として平均故障間隔「MTBF:Mean Time Between Failure」というものがあります。MTBF = システムの稼働時間 ÷ 故障回数 で求めることができますが、実際はひとつのシステムをずっと監視するのではなく、同じシステムを複数監視して総動作時間を使ってMTBFを計算するのが実情です。『灰の双子星プロジェクト』はMTBFの算出にとても有用な仕組みと言えそうですね。

無限ループしないようにできないの?

実はプログラムが無限ループするか否か(=有限のループで結果を返すか?)を判定可能なアルゴリズムは存在しないことが知られています。

このことは「停止性問題(The Halting Problem)」と呼ばれ、アラン・チューリングが1936年に証明済みです。以下の動画が非常にわかりやすいのでオススメです。

「無限ループ」はコンピュータプログラムにおける一般的なバグのひとつなので、バグを事前に判定するアルゴリズムは存在しないと言い換えることができます。もし上司に、「バグを発見するプログラムを作れ」と言われたらアラン・チューリングの角で泣くまで殴ってやると良いでしょう。


先人Nomaiたちにとっとと探索に戻れと言われそうなので今回はここらにしておきます。ここまで読んでくださりありがとうございました。


おわり


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