算術コンビネータの使い方と最適化の基本
算術コンビネータは、Factorioの回路ネットワークで信号に1つの演算をかける部品で、決定コンビネータのように条件で通す箱ではなく、値そのものを計算する箱です。銅線5と電子基板5で0.5秒、消費電力1kWという安さで序盤から使えますが、ここを決定コンビネータと混同すると回路の役割理解がずれてしまいます。
算術コンビネータの使い方と最適化の基本
算術コンビネータは、Factorioの回路ネットワークで信号に1つの演算をかける部品で、決定コンビネータのように条件で通す箱ではなく、値そのものを計算する箱です。
銅線5と電子基板5で0.5秒、消費電力1kWという安さで序盤から使えますが、ここを決定コンビネータと混同すると回路の役割理解がずれてしまいます。
自分も最初はEach信号の出力モードを取り違えて、列車本数制御の回路がずっと0本のままになり、3時間を溶かしました。
原因は出力を単一信号にして全結果を合算していたことで、In:Each+0、Out:Eachの使い分けまで押さえると、その失敗はすぐ再現不能になります。
算術コンビネータとは:入力に演算をかけて出力する箱
算術コンビネータは、回路ネットワークの中で信号に演算をかけるための部品です。
赤線でも緑線でも受けた入力を、左オペランド・演算子・右オペランドという形で1つの式にまとめ、結果を別の信号として返します。
信号を「通すか止めるか」ではなく「値を作る」側に置くので、まずこの役割を押さえると回路全体の見通しが一気に良くなります。
算術コンビネータの基本構造:左オペランド・演算子・右オペランド
算術コンビネータの核は、入力をそのまま眺める装置ではなく、入力値に対して演算子を1回だけ適用する装置だという点にあります。
左オペランド、演算子、右オペランドの並びで式を組み、加算や減算だけでなく、乗算、除算、剰余、累乗、さらにビット演算まで扱えるため、回路ネットワークに「計算」の手を入れられます。
自分が回路に踏み込んだきっかけも、ボイラーの蒸気を見える化したくて1台置いたことでしたが、あれだけで箱の感覚がつかめて、クロックや列車制御に一気につながりました。
この構造は、プラントエンジニアの本業で触る計装ロジックにもよく似ています。
現実のPLCでも、演算ブロックと判定ブロックは役割を分けて組むのが基本で、Factorio の算術コンビネータはまさにその演算ブロック側です。
入力信号を材料として加工し、別の値を出す。
そう理解すると、後で出てくる平均値、差分、在庫比率、クロック生成の話がひとつの流れでつながります。
決定コンビネータとの違い:計算する箱か条件で通す箱か
よく混同されるのが決定コンビネータですが、こちらは「鉄板が100以上なら信号を通す」といった条件判定を受け持ちます。
つまり、算術コンビネータが値を作るのに対して、決定コンビネータはその値を基準に通すか止めるかを決める箱です。
両者を分けて考えると、回路ネットワークは急に整理しやすくなります。
先に算術で数値を整え、次に決定で分岐させる。
この順序が自然です。
役割分担を現実の制御盤に重ねると、理解はさらに安定します。
算術は加工、決定は判定。
ボイラー制御でも在庫監視でも、まず演算で「今の状態を使える値」に変え、その値を条件にかけて出力を止めたり通したりする。
Factorio の設計思想はそのまま実機の発想に近く、ここを対応づけておくと、後で複雑な回路を見ても怖さが減ります。
クラフトコストと設置:序盤から作れる安価な部品
算術コンビネータは銅線5・電子基板5でクラフトでき、生産時間は0.5秒、産出は1個です。
回路ネットワークの研究が済んでいればすぐ量産できるので、序盤から使う前提で設計してしまって問題ありません。
安い部品だからといって役目が小さいわけではなく、むしろ安いからこそ、倉庫、列車駅、電力管理のような場面に遠慮なく差し込めます。
稼働時の消費電力は1kWで、HPは通常品質150、スタックサイズは50です。
電力負荷もほぼ無視できるため、設計を縛るのは性能ではなく理解のほうだと最初に言い切れます。
回路に慣れていないうちは難しく見えますが、実際には置いて、つないで、信号を眺めるだけで使い道が見えてくるはずです。
おすすめです。
まず1台、試してみてください。
11種類の演算子と挙動:四則演算からビット演算まで
算術コンビネータの演算は11種類あり、四則演算に剰余と累乗を加えた6種に、ビットシフト左右とAND・OR・XORの5種が並びます。
基本は加減乗除だけで回りますが、剰余とビット演算まで押さえると、列車制御や在庫計算、フラグ処理の回路が一段コンパクトになるのです。
特に割り算の切り捨て方向と剰余の符号は見落としやすく、ここを外すと周期やリセット条件が1tickずれます。
四則演算と剰余・累乗:基本の6演算
加算・減算・乗算・除算・剰余・累乗の6種は、算術コンビネータの土台です。
赤線や緑線で入った信号に対して、左オペランド・演算子・右オペランドの形で1つの計算を通し、結果を別信号へ出せるので、単なる数値加工から在庫の平均化、比率づくりまでまとめて扱えます。
しかも本体は銅線5・電子基板5、生産時間0.5秒、消費電力1kWと軽く、回路ネットワークの研究で解禁されるため、量産も導入も難しくありません。
決定コンビネータが「通すか止めるか」を担うのに対し、こちらは値そのものを動かす役目です。
割り算の切り捨てと剰余の符号で起きる計算ズレ
最も事故りやすいのは割り算です。
結果は0方向に切り捨てられるので、21/10=2、-21/10=-2 になります。
負数で「-3になるはず」と思い込むと、列車本数の計算やタイマーの更新が1段ずれ、止まるはずのカウンタが止まらないまま進みます。
実際、メガベースのタイマー回路で剰余の符号を勘違いし、周期が1tickずれてリセットが効かず、カウンタが暴走したことがありました。
13%3=1 の表を手元に貼ってからは、この種のバグが消えています。
剰余は左オペランドの符号に従い、右オペランドの符号は結果に影響しません。
13%3=1、-13%3=-1、13%-3=1 という挙動は、単純な余り計算に見えて実は落とし穴です。
クロックの周期計算で剰余を使うとき、この符号ルールを外すとパルスの立ち方が変わり、1tickだけ立てたい信号が崩れます。
負数を含む在庫差分やリセット条件を組むなら、まずこの3つの例を基準に考えるのが安全でしょう。
ビット演算5種:シフト・AND・OR・XORの使いどころ
ビットシフトは2倍・1/2倍を高速に扱う手段として便利です。
左シフトは値をまとめて倍化し、右シフトでは負数を扱うと符号維持のためMSBに1が挿入されます。
最初は「何に使うんだ」と思っていましたが、駅ごとの状態フラグを1信号にXORでまとめたら配線数を3本減らせて、デバッグも楽になりました。
知っていると引き出しが増える演算だと実感します。
AND・OR・XORは、複数フラグを1信号にパックして扱う場面で効きます。
たとえば駅の満車・待機・出発準備を別信号で流すより、ビットを立ててまとめたほうが線数を抑えやすく、回路図の見通しも良くなります。
Factorio の回路は入力が変化したコンビネータだけを再評価するので、演算を畳んで信号数を減らすほど、メガベースのUPSを守りやすくなるのです。
Each信号(ワイルドカード)の使い方:全信号への一括演算
Each信号は、入力に流れている全種類の信号へ同じ演算をまとめてかけるためのワイルドカードです。
鉄板も銅板も歯車も、同じ式で一括処理したいときに使うと配線がすっきりします。
しかも出力先をEachにするか、単一信号にするかで意味が逆転するため、ここを先に押さえておくと列車本数制御や在庫集計で迷いません。
Eachは1オペランドのみ:右辺は定数か単一信号
Eachはオペランドに最大1つしか置けないので、右辺で参照できるのは定数か単一信号だけです。
入力の全種類に同じ演算を適用する仕組みだからこそ、鉄板だけ別扱い、銅板だけ別扱い、という書き方はできません。
全信号へ共通の処理を通す、と理解すると使いどころが見えやすいでしょう。
この制約は不便に見えますが、実際には設計を単純にするための縛りです。
信号ごとに条件分岐を増やすより、まずはEachでまとめて通し、必要なら前段で信号を絞るほうが読みやすい配線になります。
複雑なメインバス周りでも、処理の入口をそろえるだけで後段の調整がぐっと楽になるのです。
出力Eachモード:信号ごとに個別計算する
出力先をEachにすると、各入力信号に同じ演算を個別に適用し、そのまま同じ信号名で返します。
鉄板100と銅板50に×2をかければ、鉄板200と銅板100が別々に出る形です。
個別演算モードとして使うと、在庫ごとの増減や補正を崩さずに処理できます。
自分が3時間溶かしたのも、最初はここを取り違えていたからでした。
列車本数制御の出力を単一信号にしていたせいで全在庫が合算され、満載量で割っても常に同じ本数しか出なかったのです。
出力をEachに変えた瞬間に直り、モード差の重さを痛感しました。
数字は同じでも、出し方が違うだけで挙動は別物になります。
出力単一信号モード:全信号の演算結果を合算する
出力先を単一信号にすると、各信号への演算結果がすべて合算されて1つの信号になります。
在庫の総量をまとめたい場面では便利ですが、列車本数のように信号ごとの比率を保ちたい制御では危険です。
合計値だけを見て判断する回路になるため、意図せず全体最適ではなく総和最適に寄ってしまいます。
配線が複雑なメインバス周りでロジックが干渉したときも、この性質を踏まえると整理しやすいです。
自分は In:Each+0、Out:Each の絶縁を一枚挟むだけで信号の逆流が止まり、なぜか直った状態を卒業できました。
何もしない演算に見えて、赤線入力を緑線出力に移しつつバックフィードを防ぐ、かなり使い回しの利く定番テクニックです。
1tick遅延を味方にする:クロック・パルス・カウンタ
算術コンビネータの出力は入力より1tick遅れて確定する。
この1tickは単なる待ち時間ではなく、Factorio の回路網では時間を刻むための最小単位になる。
遅延を邪魔者として扱うより、信号の履歴を残す部品として見ると、クロック、パルス、カウンタの3つが一気につながります。
自己加算でクロックを作る:出力を入力に戻す
出力と入力を結線して毎tick+1を足し込むと、値は止まらず増え続けます。
初めて自己加算クロックが動いて数字が無限に伸びたときは、たった1台で時間が生まれる感覚があって素直に感動しました。
ここから列車のダイヤ制御や定周期の在庫チェックまで発想が広がるのは、クロックが単なる数字遊びではなく、設備全体の拍動になるからです。
ゲームは60tick/秒で進行するので、tick数を60で割れば秒数にも直結します。
1tickパルスの生成:×-1と遅延を組み合わせる
値が変化した瞬間だけ取り出したいなら、入力をそのまま流す線と、もう一系統を×-1にした線を用意し、遅延した出力と足し合わせます。
変化していない間は現在値と1tick前の値が打ち消し合って0になり、変化したその1tickだけ差分が残るので、短いパルスとして扱えます。
理屈だけ読むと地味ですが、実際に×-1と遅延を並べて信号をグラフで眺めると、1tickだけ立つ山が見えてようやく腑に落ちました。
遅延が余り物ではなく資源だと理解できるのは、この瞬間でしょう。
60で割って秒を取り出す:分タイマーへの応用
カウンタは入力イベントを足し続け、決定コンビネータでしきい値到達を検知してリセット信号を送る形にすると扱いやすくなります。
60に達したらリセットするだけで1秒の自己リセットタイマーになり、そのまま60回をひとまとまりとして見れば1分の周期回路にも伸ばせます。
出力と入力の結線、1tickパルス、カウンタとリセットは別々の話に見えて、実際には同じ遅延仕様をどう使うかという一点でつながっています。
定周期処理の土台として組んでみてください。
実用回路:列車制御・在庫平準化・ランプ表示
在庫やチェストの中身を算術コンビネータに通すだけで、列車・搬送・表示の3系統を同じ考え方で扱えるようになります。
貨物の流量をそのまま回路に載せると、駅は待つべき列車数を自分で判断でき、倉庫は偏りをならし、基地の状態は数字として見える化できます。
手元の回路がそのまま運用ルールになるので、拡張しても破綻しにくい構成です。
列車本数の動的制御:在庫÷満載量で上限を出す
100駅超の列車網を運用していた頃、自分はトレインリミットを固定本数で置くやり方に何度も限界を感じました。
そこで貨物車両の満載8000で在庫を割り、満タンにできる列車本数を駅ごとに返す回路へ切り替えたところ、需要が薄い駅にまで列車が殺到して詰まる事故が目に見えて減りました。
固定値ではなく在庫に追従するので、荷が足りない駅は静かに待ち、積める駅だけが動く形になるのです。
Eachを使って各資源を個別に割り、さらに上限値とminを取れば、設定した最大本数を超えない安全弁にもなります。
燃料でも流体でも、考え方は同じです。
在庫の平均負荷を出して偏りをならす
在庫平準化は、全ローディングチェストの総量をチェスト数で割って1チェストあたりの平均負荷を出すだけで骨格が決まります。
平均を下回るチェストのインサータだけを動かせば、特定のレーンや炉列に偏っていた供給が少しずつならされ、ベルトのムラが抑えられます。
実際、平準化を入れる前は特定のスマッシング炉列だけ枯れがちでしたが、平均負荷との比較でインサータを間引いたら供給が均一化しました。
割り算1つで現実の偏りが消えるのは、設計の手応えとしてかなり大きいです。
ここでも回路は単なる自動化ではなく、倉庫全体の配分ルールとして働きます。
ランプでクロックを可視化する
クロックで作ったtick値や秒数は、ランプ群に渡すだけで時計や進捗バー、残量メーターとして使えます。
数字を基地の壁面に出しておくと、どのラインが詰まったか、どの工程が遅れているかを一目で拾えるので、異常検知が早くなります。
とくに大規模になるほど、回路の内部値をそのまま見える形にしておく恩恵が大きいです。
自分は進捗バーを置くたびに、デバッグの待ち時間が短くなるのを実感してきました。
見える情報が増えるほど、判断は速くなるでしょう。
UPSを落とさない最適化:更新回数を減らす設計
Factorio の回路最適化でまず押さえるべきなのは、コンビネータは置かれている台数よりも「毎tickどれだけ再評価されるか」で重さが決まる、という点です。
入力が変化した回路だけが再計算され、入力が変わらない回路は出力を据え置いて処理を飛ばすので、安定した入力ほど軽く、入力なしの状態が最も軽くなります。
逆に、在庫や状態が毎tick揺れる設計は、それだけで評価対象を増やしてしまう。
自分が1k SPMのメガベースで UPS が落ちたときも、原因はまさにそこでした。
毎tick変動する在庫信号を大量のコンビネータが律儀に再計算していて、表示系をクロックで数十tick間引くだけで、見た目はほとんど変えずに UPS が戻りました。
部品を減らせば軽い、と漠然と思っていた時期もありましたが、本質は「毎tick評価される台数を減らす」ことでした。
コンビネータ評価のコスト:変化した入力だけ再計算される
Factorio の評価モデルを理解すると、最適化の見え方が変わります。
変化した入力を受けたコンビネータだけが再評価され、入力が据え置きなら出力も据え置きのまま処理が止まるので、負荷は部品数だけでは決まりません。
どれだけ複雑な回路でも、入力が落ち着いていれば静かに済みますし、逆に単純でも入力が荒れ続ければ重くなるのです。
この性質がある以上、設計で狙うべきなのは「正しく動くこと」だけではなく、「動くうえで軽いこと」になります。
常時更新される在庫監視や状態集約は便利ですが、tick ごとに値が揺れれば揺れるほど再計算が積み上がるので、安定した入力に寄せるだけで UPS は目に見えて改善します。
入力なしの回路が最も軽い、という感覚もここから自然に理解できるはずです。
入力をゲーティングして無駄な更新を消す
出力が常時は不要な回路は、クロックやゲートで入力を周期的にパルス化すると一気に軽くなります。
必要なタイミングだけ計算させればよいので、毎tickの再評価を数十tick単位まで間引けるわけです。
在庫表示のように人間が見る用途なら、毎tick追従する必要はまずありません。
表示系を数十tickおきに更新するだけでも、体感はほぼ変わりませんでした。
むしろ、値が落ち着くことで見やすさが増す場面すらあります。
こうしたゲーティングは、回路の見た目を変えずに負荷だけを削れるのが強みです。
おすすめです。
Each信号で部品数を畳んで回路を圧縮する
もう一段進めるなら、Each信号で複数信号を1台に畳み、そもそもの部品数を減らします。
評価対象が少なくなれば、それだけ毎tick動く台数も減るので、軽さはさらに増します。
メガベースでは配線の美しさより、回路全体がどれだけ静かに動くかを見たほうが結果は安定します。
自分も、安定入力とゲーティングを意識するようになってから、同じ機能でも体感負荷がまるで違う回路を組めるようになりました。
Each で信号を圧縮し、必要な場面だけパルスで起こす。
この組み合わせが入ると、回路は「正しい」だけでなく「軽い」段階に入ります。
メガベースの UPS を守るなら、ここまで踏み込みましょう。
Takuma
Factorio 3,000時間超。1k SPM メガベースを複数パターンで達成した生産ライン設計のスペシャリスト。本業のプラントエンジニアの知識を工場最適化に応用しています。