Factorio K2+SE(0.6) アルコスフィア・バランサーの解説
はじめに、そして注意点
これはFactorio K2+SE(0.6)の最終盤のラインの解説で、自分で考える楽しみが重要なゲームにおける重大ネタバレコンテンツとなっております。
どうしてもアルコスフィアのバランスの取り方についての解法を知りたい人や、すでに解いた人向けの記事ですので、ご注意をよろしくお願いします。
アルコスフィアの扱い
アルコスフィアは「偏光」させることで素材として使用可能な「[ギリシャ文字]スフィア」というアイテムになるのですが、ギリシャ文字が分かりにくすぎるのでここでは全部数字に置き換えて説明します。
(そしてこの方法は自分のラインを組むときや管理する時にとても有効です)
こうすることで、 「アルコスフィアフォールディング」「アルコスフィアの反転」によって行われる変換も「(1,8)→(2,4)」のように分かりやすく書くことができるようになります。以下にその対応リストを示します。
アルコスフィアバランサーの原理
1種変換
「アルコスフィアフォールディング」は2つのアルコスフィアを別の種類のものに変換する処理ですが、これを4つ上手く組み合わせることで「1種類のアルコスフィア2つを別の1種類のアルコスフィア2つに変換する」というシンプルな処理を実現することができます。
これは4つの変換の選び方によって8通り作成することができ、(1,6) , (2,5) , (3,8) , (4,7)のアルコスフィアのペアが互いに変換可能な処理があることを示しています。
これを利用すると「1,6を比較して1が多ければ 1→6の変換、少なければ6→1の変換を行う」という条件回路2つで実現するシンプルな回路で1と6のアルコスフィアの数のバランスを取ることができるようになります。
つまり、(1,6) , (2,5) , (3,8) , (4,7)の4ペアについてはそのペアを構成する2種類ずつのアルコスフィアの数のバランスが取れることになります。
4種変換
次に、先程バランスの取れた4つのペアについて個数バランスを取る事を考えます。
例えば、(1,6)が10個 , (2,5)が20個 , (3,8)が30個 , (4,7)が40個、というケースではすべてのペアを20個ずつにしたいです。そうすれば「1種変換」を使って全種類のアルコスフィアを10個ずつにすることができるからです。
これにはまず「アルコスフィアの反転」が有用です。これは(1,2,5,6)→(3,4,7,8)という変換を行うレシピで、これは先程考えたペア2組が別のペア2組になるという変換になっています。
つまり、この大小を比較してバランスをとることで、(1,6) , (2,5)の2ペアと (3,8) , (4,7)の2ペアを構成するアルコスフィアの総数を等しくすることができます。
これだけではすべてのペアのバランスを取るには不足しているので、別のタイプのアルコスフィアの反転のような4種変換をアルコスフィアフォールディングの組み合わせで作ることで対応します。
ちょうどうまいことに、(1,6) , (4,7)と(2,5) , (3,8)のバランスを取る4種変換と、(1,6) , (3,8)と(2,5) , (4,7)のバランスを取る4種変換を作るためのアルコスフィアフォールディングの組み合わせが見つかりました。
この3種類×2方向、計6つの4種変換を使うと4つのペアのバランスを取ることができます。数学的には、4つのものを2個ずつに分けて選ぶ場合の数は6通りなので、その全てにおいて大小を比較できれば4つのもののバランスを取ることが可能であるということが言えます。
これで4つのペアのバランスと、ペアの中の2種類のアルコスフィアのバランスを取ることができて、8種類のアルコスフィアの数のバランスを取ることができるという流れが完成しました。
アルゴリズムまとめ
【1】
1~8の番号に対応したアルコスフィアについて、(1,6) , (2,5) , (3,8) , (4,7)の4ペアにおいてその2種類のバランスを取るための変換を行う。
例: 1>6 なら 1→6 の1種変換を行う。
【2】
(1,6) , (2,5) , (3,8) , (4,7)の4ペア同士のバランスを取るための6種類の4種変換を行う。
例: (1,2,5,6の合計)>(3,4,7,8の合計) なら (1,2,5,6)→(3,4,7,8) の4種変換を行う。
この【1】【2】を同時進行で可能な限り実行することで、最終的に8種類のアルコスフィアの個数が等しくなるような個数の増減が起きます。
(実運用上ではループを止めるために一定の誤差を許容して変換を止める処理を行うと良いでしょう)
1種変換は4つのペアの大小、4種変換は4種類ずつのグループ(3通り)の大小を比較して行うので、合わせて7つの大小関係比較を行えば良いというシンプルなアルゴリズムができました。
実装
上記の処理を実際に組み上げたのが以下のラインです。
基本的に倉庫の周りに装置を囲むように置き、それぞれの区画で1種変換や4種変換を行っています。文字プレートMODで変換する番号をコメントとして設置してみました。
中心のバッファ倉庫以外のすべての倉庫には8種類のアルコスフィアが常に規定数入るような回路を組んでいます(説明省略)
それらの倉庫から変換装置にアルコスフィアが投入され、別の種類に変換されたアルコスフィアはまた同じ装置に戻されます。そして回路制御されたインサータによって各倉庫に規定数より多く入ったアルコスフィアは中心のバッファ倉庫まで運ばれ、同時に不足したアルコスフィアは中心のバッファ倉庫からすべての倉庫に送られます。
この倉庫の管理によってロボット輸送なしで高速で装置を動かし続けることが可能となりました。
変換装置はすべての倉庫の中身のアルコスフィアの数を参照し、先程のアルゴリズムに従って稼働と停止をするようになっています。この制御は単純なアルコスフィアの個数比較によるインサータのオンオフを行っているだけなのでとても単純です。
後は緊急停止のための回路や誤差を許容するための回路などで微調整されていますがここでは説明を割愛します。
まとめ
アルコスフィアフォールディングを上手く組み合わせることで使い勝手の良い変換を必要分だけ作ることで、シンプルな判定によって確実にバランスを取ることができるアルゴリズムを作ることができました。
多次元の連立方程式を解いたり、大量の大小比較を行って装置を稼働させる力技を使うことなく、分かりやすい処理方法でアルコスフィア・バランシングを行うことが出来るようになったのが良かったです。
性能についてはまだ評価の途中ですが、おそらく多次元の連立方程式を解いて最小手数でバランスをとるようなアルゴリズムを組む方が効率は高くなると思われるので、これはあくまで「素朴な方法」といった部類になるのではないかと思います。とはいえ「ゲームクリア」には十分すぎるほどの性能があることは確認できているので、良かったら試してみて下さい。