物流

【Factorio】列车死锁的原因与规避设计

在日本的Factorio玩家中,当列车在交叉口或车站前停下不动时,原因基本可以分为「信号放置方式」「交叉口容量」「车站前待机线不足」这三类。在Factorio原版v2.0和太空时代中,铁路的基本原则是共通的,只要理清这些要点,就能大幅防止死锁。

物流

【Factorio】列车死锁的原因与规避设计

当列车在交叉口或车站前停下不动时,原因基本可以分为「信号放置方式」「交叉口容量」「车站前待机线不足」这三类。
在Factorio原版v2.0和太空时代中,铁路的基本原则是共通的,只要理清这些要点,就能大幅防止死锁。

自己第一次连接多个矿山时,车站前的待机列向分支溢出,导致全线停止。
重新按列车编成长度划分待机线,把交叉口前改成链式信号后,流量立刻恢复了。
那时我才意识到,列车停在哪里的设计有多重要。

本文以通常信号和链式信号的用法为基础,系统整理了单线、复线、环形、堆栈在何种条件下应该选择。不是等到堵塞后再修复,而是在设计阶段就防止堵塞的实践步骤。

对象版本与前提知识

明确对象版本

本文涉及的基础是 Factorio原版v2.0太空时代。太空时代是付费DLC,在『Factorio Wiki』中记录为 2024年10月21日 发布。

关键是,本文的主题「列车死锁对策」在原版v2.0和太空时代中的基本原则几乎相同
交叉口前该停的地方放链式信号,让列车从出口方通过,这一思路完全适用。
自己在v2.0扩展既有存档时也重建过路线,交叉口入口靠近链式信号的原则依然有效。
这里比版本差异更重要的是设计思路是否一致。

另一方面,太空时代往往导致工厂整体物流规模更大,列车网中的列车数量也会增加。换句话说,信号基本规则没有改变,而是基本做不好时,堵塞会更明显

Space Age/ja wiki.factorio.com

本文范围与前提

本文之后讨论的仅限于以铁路为中心的死锁对策。具体包括:交叉口、分支、单线交换、双线化、车站前待机线、环形、train limit流入控制等线路网络设计。

相反,对太空时代增加的行星间物流和太空网络细节不深入讨论。
那是很有趣的领域,但这次堵塞问题的本质是「列车应该在哪里停、在哪里不应该停」要在线路上理清楚。
行星再多,如果交叉口入口还是用通常信号,该堵还是堵;车站前待机位置不足,还是会塞本线。

这里的死锁是指列车互相等待,无法动弹的状态。
只需2编列车就可能发生,有时需要手动移动才能解决。
看起来"只是有点堵",但实际上进路预约已经陷入冲突,是永久停止,不是普通拥堵。

💡 Tip

本文将「信号错误导致的停止」和「容量不足导致的慢性堵塞」分开考虑。即使信号正确,太小的环形或太短的待机线也会堵。这样区分的话,原因判断会快很多。

用语小词典

先把本文用的用语对齐。本文中首次出现时也会补充说明,但预先脑中整理的话会更容易理解。

通常信号看「下一个区块是否可以进」的信号。适合直线区间或进路已经简单的地方。反面是在分支或交叉口前用它,列车容易半路进入交叉口内就停止。

链式信号看的不仅是下一个格子,而是到下一个通常信号或车站的进路是否畅通的信号。简单说就是「宁可不进也别在里面停」。这就是为什么交叉口和分支入口用链式的原因。

闭塞区间是信号划分的占有范围。
一个闭塞区间基本上只能进一编列车。
列车通过占有和释放闭塞区间来行动,所以考虑死锁时「怎么划分闭塞区间」很关键。
说白了,列车堵的时候,问题往往不是列车本身,而是闭塞区间的划分方式

光是记住这3点,「交叉口前链式、出口通常信号」这个金律就很容易理解了。

本文是深入死锁对策,但前提的整个列车网络组织方法也包含在内。
如果想系统理解列车网络整体组织方式,建议和父主题的全景视图对照着读。
特别是复线基本形、车站放置、待机线思路、信号角色分工,单独看死锁对策不如在整个网络设计框架中理解会更透彻。

从自己经验上看,死锁不是单独的错误,而是「交叉口」「车站前」「本线容量」三者连动发生的情况较多。
所以接下来的各项中,不是只修一个地方,而是在列车网的整体流中「在哪里停、在哪里流」要整理一致。

【Factorio】死锁是什么?首先要掌握的发生条件

死锁的定义与拥堵的区别

Factorio中的死锁是列车互相等待,除非手动移动否则无法解除的停止状态
看起来「只是有点堵」,但实际进路预约相互梗阻,即使过时间也恢复不了。
『列车用信号教程 - Factorio Wiki』中也明确指出即使只有2编列车也可能发生
这一点看似小事,其实很重要。
不是大规模网络的问题,初期小路线也很常见。

另一方面,拥堵是指虽然延迟,但前面一空就能依次通行的状态。
交叉口处理能力不足队伍变长、车站卸货慢等待时间延长,这些很难受,但理论上时间过去就能解决。
也就是说,拥堵是「慢但在动」,死锁是「进路组合已经破裂无法动」。

自己最初掉坑的就在这。
只有2编列车为什么堵了?完全想不通,花了好几小时。
原因其实很简单,交叉口内的信号配置让列车能在交叉口中停下来。
问题不在列车数,而在哪里能停的设计

Tutorial:Train signals/ja wiki.factorio.com

3种常见发生模式

实战中常见的死锁基本可分为3类。都是「那个地方不应该停的列车能停下来」开始的。

第一种是交叉口内等待
分支或交叉口前放通常信号的话,列车判断「只要下一个区块空着就能进」。
结果进到交叉口里停了,出口堵了,另一方向也过不了。
这是最典型的,初心者和老手都容易犯。

第二种是单线正面停止
单线区间交换线或待避线不足,从两边来的列车争夺同一区间,互相卡死。
单线虽然初期成本轻,但要用设计来弥补通行规则,交通量一增就马上容易不稳定。

第三种是车站等待占用本线形
车站前待机空间短或没有的话,入站等待的列车队伍溢出本线和分支。
结果原本只是车站堵的问题,待机列伸到交叉口,就把整个网络堵了。
看似「车站的问题」和「本线的问题」其实是连在一起的。

这3类分类看起来独立,其实根源很共通。列车停止位置没有被好好设计,交叉口、单线、车站前都一样容易全面停止。

💡 Tip

死锁对策不是「别加太多列车」,而是要有「限定停止位置」的思路,这样理解会更容易。既然少数列车都能造成死锁,那首先有用的是运用量的限制而不是配置。

现场的识别方法

实际地图上识别时,比起列车数量,先头停在哪里更快判断。自己堵的时候,不看全景,而是先追先头列车的鼻尖。光看这里就能很大程度区分是信号错误还是容量不足。

关键是看信号与信号之间的哪里停止
在交叉口里、分支上、合流直后停止的话,进入判断太甘了,有「能在里面停」的配置。
反之,交叉口前很远就整齐地等着的话,信号思路本身没问题,这时该怀疑处理能力或待机空间不足。

还有就是看停止位置是在交叉口前还是里面这个差别。
前面停的列车至少实现了「进不了就别进」。
里面停的列车,那一刻就有资格牵连其他方向。
这个差别看起来小,实际影响很大。

再看等待列的尾部有没有溢出本线或分支
车站前堆栈不足的话,先头列车只是车站等待,后续的最后一节却在分支上,堵了另一条路线。
现场上,「堵的车站」比「那列队的尾巴在哪」更难引起注意,但原因判断起来后者更有效。

从自己经验看,死锁看全景容易判断错。
地图上看着大拥堵,实际往往是「交叉口里停的1编」或「车站前等待的1编」引发的。
所以观察的起点不是列车数,而是停止位置的精确性
一旦看到这点,该修的地方就很清楚了。

死锁主因1:信号放置错误

通常信号与链式信号的行为差

这个东西光按名字记容易混乱,但实际行为很明显不同。
通常信号只看「下一个区块」
目前这1格空着就让过,所以交叉口里和分支中空着就让列车进。
问题是,再往外出口堵了也会进。
结果列车冲进交叉口就停,横边来的列车进路也被塞。

链式信号看的是「这条路能完全通过吗」
『列车用信号教程 - Factorio Wiki』也是这么解释的,链式看下一个通常信号或车站到底的路线,根据那个判断能否进。
简单说就是能不能进取决于能否退出,而不是下一格能不能进。

这个差别在交叉口特别有效。
光用通常信号组的交叉口看着有信号,好像很安全。
但实际运用中容易成为「能在里面停的交叉口」。
自己最初根本想不通,明明红灯亮着怎么还有问题。
有信号能正确停下来是两码事。

分支·交叉口的基本规则

基本规则很简单。分支或交叉口前用链式,出口用通常。这就是著名的「chain in, rail out」。光这样就能堵掉初级死锁。

原因很明确,进口要「只让能彻底通过的列车进」。
交叉口里不是等待地点。
相反出口要从交叉口脱离后回归通常的闭塞管理,所以出口放通常信号。
这样的话列车在交叉口外整队等,内部是专门用来通过的空间。

官方Wiki的典型例子也说明了交叉口直前的多个信号都是通常的话,列车会在交叉口上停下来,这是问题所在。
把交叉口前的信号改成链式,进入条件变严格,里面就不容易堵。
从自己经验上看,堵的交叉口大多不是「信号少」,而是「进口判断太甘」。

(修正)社区内对v2.0以后的运用知识和信号分割方法有新的观测和讨论,但这里要掌握的核心设计思想本身没变。
如果要说「v2.0官方改了规格」,请附带官方发布说明或Wiki的一手资料。
目前保持「有讨论有观测」这种说法比较稳妥。

💡 Tip

自己交叉口堵的时候,不看「哪个列车坏」,而是看「这编列车有进交叉口的资格吗」。进口是链式的话,这个区分就很容易。

出口区间短时也用链式的例子

基本是出口用通常,但实战中有个例外。
交叉口出口直后的区间很短的时候
出口直后紧接着另一个分支、合流、车站进入部,装不下列车一编的情况,出口用通常的话容易发生「给了交叉口外的许可,但尾巴还在交叉口里」。

这种配置用出口也链式,再往外也得完全通过才允许比较稳定。
社区常说的「短出口区间用chain-out」就是这个原因。
换句话说,交叉口看起来的出口不是真的出口,列车全身到安全地带才算完全脱离。

自己在车站前的小合流也多次这样做过。出口直后放通常,结果那1格一空列车就进,交叉口上留了尾巴。改成链式后,流量突然稳定了。看起来小调整,效果却很大。

常见误配置与修正步骤

初心者最常见的误配置是交叉口进口全都是通常信号。直线的感觉加信号,自然就这样了。但交叉口上反而是坏事。

修正也不难。堵的交叉口按这个顺序直一般最好整理:

  1. 确认交叉口或分支进入直前的信号
  2. 进口是通常的话换成链式
  3. 交叉口出口后放通常信号
  4. 出口直后短,到下一个分支或车站进口余量不多的话,那个出口也改链式
  5. 列车是在交叉口「里」等还是「前」等,确认已经变成前面

这次修正的关键不是增加信号数,而是把停止位置从交叉口里赶出来
自己的地图上,光改交叉口进口的信号,流量就立刻复苏过来了。
感觉上不是「把信号变聪明了」,而是强化了进入条件防止事故
从那以后,标准做法就一直是这样。

图解标题案:「交叉口直前改链式」「出口短区间的链式配置」

图要放的话,标题不要过于说明性,而是读者一眼就能掌握意图的文字比较好。
比如「交叉口直前改链式」就要传达通常信号的话交叉口内会停,链式的话进出都不会停这个对比意思会比较强。

「出口短区间的链式配置」要说的是出口后空间不足,所以出口侧也用链式防止交叉口内等待,加上这个说明就好理解。
交叉口单独切出来的图不如整个出口后短区间和下一个分支一起画,这样能看出为什么不是通常而是链式。

这两个图的要点是一样的。列车在「在哪里停」要用信号设计,不是单纯排列红蓝。

链式信号看起来复杂,实际看的重点很实务性。
只看下一格的通常信号交叉口前用了容易堵,往前读路线的链式信号换了就变成「里面不停」设计。
这个差别明白的话,死锁原因的分类就快多了。

死锁主因2:交叉口与环形容量不足

环形大小与列车数的关系

问题是信号都对了,但环形本身太小还是会堵。前面说的是「别让不该进的列车进」,这是进来的地方容纳不了充分的器皿问题。

环岛看起来很整洁,四方向容易汇总,初期就想用。
自己用了很多。
但交通量一增,小环里多方向列车汇聚,进口互相等进路,容易卡。
官方『列车用信号教程 - Factorio Wiki』说明死锁只要2编就能起。
所以不是「列车多的大规模网才的问题」。

特别危险的是进了环的列车堵在出口,下一进口也停了,本线等待列更长这个连锁。
小环越容易这样,一堵很久才能解。
感觉上,环里停了1~2编,交叉口就变成「旋转的死胡同」。

社区常说「编成长对环太短的话,列车的尾巴会自己塞自己的进路」。
自己也经历过,小编成设的环后来用长编成,就全停了。
设计时没问题,列车长或数量一变就容量不足,这是环的可怕之处。

(修正)论坛上的单次测试报告中,特定条件下T型交叉比环形吞吐量高的例子有过报道。
但这个很强地依赖设计、信号配置、编成长等条件,不能一般化说「T字一直都好」。
要作为参考例保留,明确说明条件依赖性。

"只进1编"设计的优缺点

环堵塞对策中最直白的是同时只进1编的方向。
进口链式严格管制,环里不抱多列车。
这是很安全的思路,最少「里面互相塞」的全停不容易发生。
说白了,自己危险环延命时先从这里下手。

优点很清楚。
环内部基本变成通过专用,环内等待减少,堵法就好读了。
问题起来「环里」不是「前面」所以原因分类也容易。
多人环境里别人碰线路时,「坏的方式好理解」这点地味但很重要。

缺点也很明显。进不了环的列车当然要在本线等。安全性提高的同时,等待位置向外推。环里很漂亮,但外面的等待溢到车站进口或分支就反而网络其他地方堵。

这设计本身很优秀,但整个网络看的话是等待位置往哪放的问题。环内不保就外面承,那受皿要足。环进口控制严了但流量没改善时,往往这个受皿不足。

💡 Tip

自己把环大一圈,再在流入前改链式「一看到空就进」,堵法平和多了。但接下来需要的是环调整,而是车站前待避的增设。

本线等待增加的话就加车站前待避

环安全侧靠就本线等待列增加。这时有用的是车站前待避所,俗称堆栈。交叉口不抱的设计的话,等车就该在车站前整队。

思路简单,要停的话就停在本线以外的待避线
车站空着在等、卸货慢、环先面堵。
这种等待放本线的话,交叉口容量不足和车站前拥堵连链,恶性循环。
反过来车站前有待机线,本线和交叉口容易保通过机能。

(修正)社区待避线设计中,最长编成要完全收进信号间闭塞这个基本原则很广泛共享。
自己感觉上,待避线半长的话「待避的名义实际塞分支」最坏的状态。
1-4-0编成的话,社区实测值基础上约37格左右作为容纳目安就好想象。
不用死记数字,编成从头到尾都在1个闭塞里,后面信号和分支都不碰这个本质更重要。
自己经验上,蓝图看起来紧不如「编成1整个能进的箱子」想法,事故能减。

车站前待避增加了地也用,看着大。
但省了这空间,本线给待机队侵蚀,交叉口设计的工夫全泡汤。
就像单线加交换线,运用列车数能增一样,有能等的地方是物理上的能力增长
环要紧还是车站前要广,两边成套考虑的话好很多。

图解标题案:「小环的NG例」「适正大小与信号分割例」

「小环的NG例」就是小直径环有多方向列车进,环内周留了编成出口等待,进口连锁红,本线等待列伸长这个说明合。
图上,环里只留1编进出口都变红的样子看,容量不足的怖就一目。

「适正大小与信号分割例」就是各流入用链式控制,出口能通的时候才进这样看。
环大一点,里面不塞,出口外的受皿也含进来描就能看出「不光大」意思。
比较上,本线等待不是车站前待避发路线合进来的话,此章要点咬。

交叉口堵的理由不光信号。正确信号上容量不足交叉口放、等地奪合就停。环要用的话编成长、信号、列车数的釣合看,它崩了就环前的待避强化或更强交叉口形式移行考虑段。

死锁主因3:车站前待机空间不足

堆栈(待机线)的角色

车站堵时,往往原因不在车站卸货速度,而是入站等的列车停哪。这里有用的是车站前待机线,所谓堆栈。作用简单,入线等待的列车不在本线,在车站前专用地退避。

这思路重要是因为列车的「等」一出本线,问题就不限这车站。
1编在站口停,后面伸到分支,交叉口前也堵了,卸货站的小拥堵能变网络全停。
前章说的交叉口容量话,车站前没受皿的话一下子坏。

自己早期矿石收站就这样。只加了车间数觉得满足,等空的编成分支上留了尾。看着「车站前排队」,实际塞本线了。车站做成了,车站前细的话没意义。这地味很重要。

堆栈换个说法,就是本线的缓冲。卸货慢的车站、多供给列汇的收站、回路制御的开关车站,都该先看堆栈设计,再看车站本体。

编成长与待机闭塞长的设计基准

待机线最重要就是最长编成要完全收进信号和信号间。社区设计例这原则很广共享,短待机「待的名义实塞分支」原因。

重点是不是进车站的列车,而是网里跑的最长编成基准。
1-2-0和1-4-0混在,短的合量会溢。
自己甘く見这,短编成感觉的待机线切,长来的时候才分支塞,原因很难看。

(修正)社区測定値ベースでは、1-4-0編成はおおむね約37タイル前後を収容目安として考えるとイメージしやすいです(公式の公称値ではなく、あくまでコミュニティの実測値に基づく目安)。
タイル数暗記より、編成が丸ごと入って後ろの信号や分岐に触れないことが本質。
自分でも設計図見た目詰めるより「編成1丸ごと入る箱」思考で事故減。

车站用本数对待机线数,厳格万能式也没用,同时来几列,本线溢出的本数受止められ?看吗实践。
矿山复数、1受站汇集なら、车间数だけでなく、手前に何本並べられるまで含站容量。
车站2本受なのに、到着待ち4本目以上出ちゃ、车间增より堆栈见直し効く场面多。

失败例:待机列塞分支/本线溢出

最常见的失败就是待机「待てる觉えで、実は待てない」配置
典型は列最后尾分岐またぐパターン。
するとう待机线に入った列车が后续进路选択そもそも潰。
站空待をしてるだけなのに、别方向いきたい列车まで巻込堵。

もひとつ危险是待机列本

article.share

R

RinSeo

Factorio 2,000時間超。100駅以上の列車ネットワーク運用実績と Death World マラソンクリアの経験から、物流・防衛の実践ノウハウをお届けします。