![見出し画像](https://assets.st-note.com/production/uploads/images/91536653/rectangle_large_type_2_309e8df7aaa3ef2536fd3848a52b1931.png?width=800)
【Factorio】ベルト分配器工学入門
本稿ではFactorio中級者(単なるロケット1発打ち上げでは満足できなくなってきた層)向けに分配器の解説を行う。
なるべく丁寧に解説したつもりではあるが、足りない行間はゲーム内で各自検証することで埋めていただきたい。
分配器
分配器(Splitter)は1~2本のベルト入力を1~2本のベルト出力に変換する装置である。このとき、入力と出力がなるべく均等になるように動作する。以下の例をご覧いただきたい。
![](https://assets.st-note.com/production/uploads/images/91007439/picture_pc_1a06cd251308a7029e197fd49b0a7309.gif)
上記では2本の入力を分配器で1本の出力にまとめている。このとき、2本の入力から均等にアイテムを引き込んで出力している。
![](https://assets.st-note.com/production/uploads/images/91007555/picture_pc_eba9da454482e0d2d95ca40e780af507.gif)
上記例では1本の入力を分配器で2本の出力に分配している。このとき、2本の出力へ均等にアイテムを分配して出力している。
以上の観察から分かる通り、分配器は2本のベルト入力のバランス、および2本のベルト出力のバランスを取るための装置である。
バランサー
バランサー(Balancer)とはベルト上を流れるアイテムを均等に分配するための機構のことである。
バランサーには2種類あり、レーンバランサーとベルトバランサーがある。単にバランサーと呼称する場合は後者を意味することが多い。
レーンバランサー
レーンバランサーはレーン間を均等に分配するための機構のことである。
以下の例ではレーンの片側に流れる鉄板を2つの両レーンに等しく分配する。
![](https://assets.st-note.com/production/uploads/images/91021679/picture_pc_55faa2e305ff853aa9d77669263e36de.gif)
もっと簡単な機構(分配器1つ)で実装できると考えるかもしれないが、そうすると後述するバランサーの要件の1つである $${\mathrm{(PI)}}$$ を満たさない。
なお、複数のベルトのレーンをまとめてバランスする機構も知られている。本稿では紹介するに留める。以下はRaynquist氏によるバランサーブックからの引用である。
![](https://assets.st-note.com/production/uploads/images/91017791/picture_pc_42e7c3ec5d39935af86be9bb92639099.gif)
![](https://assets.st-note.com/production/uploads/images/91017935/picture_pc_adee5357c78ae239ebe32c337437a665.gif)
ベルトバランサー
ベルトバランサーは複数本の入力ベルトを、複数本の出力ベルトへ均等に分配するための機構のことである。入力が $${I}$$ 本、出力が $${O}$$ 本のバランサーはしばしば $${I \times O}$$ バランサーと表記される。
本稿では $${I \to O}$$ バランサーという記法を採用する。
最も有名なバランサーは以下の $${4 \to 4}$$ バランサーである。
![](https://assets.st-note.com/production/uploads/images/91008617/picture_pc_c8aef35dd84430989ec46d4c9e2abb35.gif)
上記例の中央に6つの分配器を配置しているが、これら全体をまとめて1つの装置だと見なしてバランサーと呼ぶ。このバランサーは4本の入力を受け付けて4本の出力を返す。
4本の入力は上から順番に100%、25%、25%、50%の割合でアイテムを輸送しているため、入力合計は200%である。
(※ここではベルトに2つのレーンがあるという事実を無視して、1レーンのみを考えている)
これに対し、4本の出力は各50%で均等になっている。これがバランサーたる所以である。
バランサーの最小要件
任意の $${I \to O}$$ バランサーが満たすべき条件は以下の2つである。
$${\mathrm{(PI)}}$$ Partially Input balanced; すべての入力ベルトが満載であればバランサーは出力のために各入力を均等に引き込む。
$${\mathrm{(PO)}}$$ Partially Output balanced; 詰まっている出力ベルトがなければバランサーは入力合計を均等に分配して出力する。
世に出回っているバランサーのBlueprintの一部(特に古いもの)は $${\mathrm{(PI)}}$$ を満たさないものが多いので注意されたい。
上記以外にもバランサーが満たすかもしれない追加の性質を挙げる。
スループット無制限性
$${\mathrm{(PI)}}$$ かつ $${\mathrm{(PO)}}$$ であればその装置はバランサーを名乗ることができる。しかし、実用する上で期待するもう1つの要件がある。それはバランサーそれ自体が輸送のボトルネックにならないことである。
具体例を挙げる。以下は $${\mathrm{(PI)}}$$ かつ $${\mathrm{(PO)}}$$ であるれっきとした $${4 \to 4}$$ バランサーである。
![](https://assets.st-note.com/production/uploads/images/91015891/picture_pc_cf0b63182a9762b2a54827d9b8446f35.gif)
前述した4→4バランサーと少し異なることに気づくかもしれない。前述の4→4バランサーは分配器を6つ使用していたが、上記のバランサーは分配器を4つしか使用していない。
しかしながら、実用上は分配器を6つ使った実装のほうがよく使われる。その理由は、分配器を4つしか使わないほうはバランサーそのものがボトルネックになりうるからである。次の例を見てみよう。
![](https://assets.st-note.com/production/uploads/images/91014473/picture_pc_71556211ff81007fbda3b5644aadc0f2.gif)
上記では2本の出力が供給過多などの理由で詰まっている。
100%、100%、0%、0%で合計200%の入力があるが、出力は0%、50%、50%、0%であり、合計で100%しか出力していない。
一方で、分配器を6つ使った実装を使うとこの問題が解消される。
![](https://assets.st-note.com/production/uploads/images/91015523/picture_pc_4626b94cb89817ffa8f6b4321dd4fbb5.gif)
上記は先ほどと同じ設定で合計200%の入力があるが、出力合計も200%となっている。
このように、ボトルネックにならないバランサーのことをスループット無制限(Throughput Unlimited)であると言い、しばしばTUバランサーと表記する。
普遍性
$${4 \to 4}$$ バランサーの4本の各入力について50%のアイテムを流しているとして、4本の出力のうち1本が供給過多で詰まったとしよう。このとき、入力合計は200%であるから、残りの3本の出力に均等にアイテムを分配して66.6%、66.6%、66.6%、0%という出力配分になることを期待するかもしれない。以下の例を見てみよう。
![](https://assets.st-note.com/production/uploads/images/91011816/picture_pc_da4a2ee634797eef9204d2b5c2aec996.gif)
上記に示した通り、出力は50%, 50%, 100%, 0%となる。詰まっていない3本の出力が均等になるわけではない。
このように、$${I \to O}$$ バランサーは一般にすべての入力および出力が稼働することを前提としている。
入力や出力の流量の設定にかかわらずバランスを維持するバランサーを普遍的(univarsal)であるという。そのようなバランサーはユニバーサルバランサー(Universal Balancer)と呼ばれる。
以下はtzwaan氏による$${4 \to 4}$$ ユニバーサルバランサーである。
![](https://assets.st-note.com/production/uploads/images/91013149/picture_pc_5814ca9c4b6959fca49a09b8984b82dc.gif)
$${4 \to 4}$$ ユニバーサルバランサーはそれよりも入力、出力の本数が少ない任意のバランサーのいずれも兼ねることができる。上記のように $${4 \to 3}$$ バランサーとしても使えるし、例えば $${3 \to 2}$$ バランサーとしても使える。ただし装置は大きくなる。
自明なバランサー
分配器は $${2 \to 2}$$ ユニバーサルバランサーである。
バランサーを使うべき場面
バランサーを使うべき場面は意外と限られる。通常プレイの範疇では列車の貨物車両への荷下ろしや積み荷の際に使うくらいであろう。
![](https://assets.st-note.com/img/1668223969828-JGANkLD5cc.png?width=800)
荷下ろしの際は各貨物車両から均等にアイテムを引き込みたい。つまりバランサーの $${\mathrm{(PI)}}$$ 性質を利用したい。
積み荷の際も同様で、このときはバランサーの$${\mathrm{(PO)}}$$ 性質が効いてくる。
貨物車両間でバランスを取るのは必須であるとして、チェスト間のバランスを取るべきかは読者の判断に委ねたい。
バランサーのBlueprint
2022年現在でお勧めしたいのがRaynquist氏によるバランサーブックを利用することである。九九表のように $${1 \to 1}$$ バランサーから $${9 \to 9}$$ バランサーまでが揃っており、一部のバランサーはTUを満たす。
入力または出力が10本以上のバランサーを利用したい場合は自作する必要がある。
ベルトマージャー
マージャー(Merger)は複数本の入力ベルトを、複数本の出力ベルトへまとめるための機構のことである。
マージャーという呼称はあまり一般的ではないが本稿ではそう呼ぶことにする。
マージャーとバランサーとの違いは以下の3点である。
バランサーは $${\mathrm{(PI)}}$$ および $${\mathrm{(PO)}}$$ を満たすが、マージャーはバランスを気にしない。
マージャーはそれ自身がボトルネックにならないことを保証する(TU)が、バランサーはそうとは限らない。
マージャーは普遍性を満たす。(大きいマージャーは小さいマージャーを兼ねる)
最も単純なベルトマージャーは以下のように分配器を三角形状に配置したものである。
![](https://assets.st-note.com/production/uploads/images/91019581/picture_pc_abd8a424c804bd04547042f0be9c42d7.gif)
この動作原理はバブルソートというアルゴリズムで説明できる。
ベルトマージャーにはもっとコンパクトな実装があり、以下のように正方形状に配置したものも同様に動作する。
![](https://assets.st-note.com/production/uploads/images/91019909/picture_pc_0f2cdef6b05ab68ef672d4a8857045b6.gif)
この動作原理は奇偶転置ソートというアルゴリズムで説明できる。(“奇遇”ではないので注意されたい)
いずれの場合も入力 $${n}$$ 本に対して $${{}_{n} C_{2}}$$ 個の分配器が必要になる。
上記の一連の実装はv0.16で分配器に入出力の優先順位設定機能が実装されたときに様々なプレイヤーによって同時多発的に発見されている。
筆者が調べた限り、ベルトマージャーの動作原理についてはっきりと述べているのはRaynquist氏によるものが最古の記録であった。
なお、入力優先順位はベルトマージャーがTUを満たすことを保証するために必須である。
参考文献
(バランサーについて日本語で書かれた解説を見たことがないので、もしあればご紹介いただきたい)
あとがき
本稿ではFactorioでしばしば用いられるレーンバランサー、ベルトバランサー、ベルトマージャーについて解説した。ベルト分配器工学の名に負けない充実した解説になったのではないかと自負している。
入門と言うよりは概論になってしまったので、実際にバランサーを作る方法も気が向いたら執筆するかもしれない。
筆者は数年ほど前に某所でバランサーおよびマージャーの解説をしたことがあるが、当時はバランサーに対する理解が現在ほど習熟していなかったため、解説が拙い部分が多い。本稿はその贖罪の意味も込めて執筆した。
この記事が気に入ったらサポートをしてみませんか?