Alt-F4 #37 - 运算器速成班续集  2021-05-28

作者 pocarski, 编辑 stringweasel, Nanogamer7, Conor_, Therenas, Firerazer,
翻译 Ph.X

目录

在 Alt-F4 发行的第 37 周,我们推出了第 37 期!想不到吧!在这一期中,长期撰稿人 pocarski 又带来了更多简单易懂的内容,为您讲解如何通过一些运算器来调剂和优化你的基地!

运算器 2:增强型物流 pocarski

几周前,我写了一篇关于使用运算器来改善特定建筑的文章。这一次,我们将看看如何更普遍地应用信号网络,来提高你整个工厂的效率。我们将研究传统设计的缺陷,提出解决这些问题的方法,使用信号网络实现这些解决方案。此种改进可以在机器人和列车上进行,而且电路是如此简单几乎不需要判断运算器。让我们直接开始吧!

机器人:网络对网络接口

我们都遇到过这样的问题:你创造了更多的机器人需求,突然间,所有来自你基地远端的机器人都决定要在没有机器人指令平台的地区行驶数千格。在最好的情况下,这将导致类似于现实生活中的送货服务的轻微挫折感,在最坏的情况下,机器人将不断被虫群摧毁,或在中途掉头,在他们刚刚离开的机器人指令平台充电,让你失去吞吐量。这种情况发生在你的物流网络是一个非凸多边形,有一个巨大的物流匮乏区,导致愚蠢的直线寻路机器人进入其中。

一个网络中大部分的机器人被卡在电池续航能力的边境中
这个基地的机器人没有足够的电量来越过凹地,所以它们在中途一直在掉头。

因此,有一条戒律来避免这种情况:“不可修建凹陷的物流网络”。听起来很简单,对吗?只要让你的基地成为一个由机器人指令平台组成的巨大矩形,就不存在任何可以拐弯抹角的地方。这是一个有效的解决方案,但它给你的扩张带来了非常大的限制,因为你将被迫扩大矩形来覆盖你所有新获得的地产。这将导致你实际的基地只占据你的物流网络覆盖区域一小部分的情况。

一个带有尴尬的“长柄”形基地,会导致物流矩形膨胀。
若要将这个基地的物流网络扩大到覆盖底部那个长柄的矩形,意味着需要去消灭相当多的的虫巢。

处理这个问题的一个更好的方法是分割你的网络。从本质上讲,你不是做一个巨大的矩形,而是做一堆不相连的小矩形,然后你可以安排它们来覆盖你想要的任何形状。这样一来,任何单一的网络仍然是凸的,这意味着机器人永远不会离开机器人指令平台的覆盖范围。这是一个很棒的解决方案,但如何让物品穿越网络之间的空隙呢?这就是电路的用处。

让我们构建两个网络,中间有一格的间隙,并称其为 网络 A网络 B。物品将通过放置在优先集货箱和主动供货箱之间的集装机械臂穿过这个间隙。对于任何我们想要从 A 转移到 B 的物品,我们应该在 A 的优先集货箱上的需求设置为我们想要转移的物品的数量。用类似的方式可以将物品从 B 转移到 A。

虽然我们可以设计出复杂的方法来计算出到底有多少东西需要去哪里,但我们将坚持使用一个简单的解决方案,一个在大多情况下都足够有效的方案:保持两个网络的物品数量相等。要做到这一点,我们需要知道每个物品的在网络之间的差额的一半,并强迫拥有较多该物品的网络将其发送给拥有较少该物品的网络。这里有一个蹩脚的图表,概述了这个想法:

构思图

我们将网络 A 中的一个机器人指令平台连接到一对算术运算器,一个乘以 1,另一个乘以 -1。这将为网络中的物品提供一个正值和一个负值。对网络 B 做相同的操作。

取反网络

然后我们将一个网络的负值连接到另一个网络的正值。这将为我们提供它们之间的内容之差。然后我们将这个值除以 2,并将其输入优先集货箱。重要的是,拥有 较多 物品一方的箱子得到 正值,否则系统会做出与我们期望完全相反的事情。同样重要的是,将数值进位到你的作业机器人货物运量,否则他们可能永远来回飞行,试图通过一次移动四件物品来解决两件物品的差异。

计算差额的一半

因为每个方向一个机械臂搬运的有点慢,我们可以增加更多组。如果我们只是盲目地添加更多的箱子,那么 每个箱子 需求是差额的一半,这意味着 实际的 需求将比它应有的值多几倍。我们需要用传来的差额除以箱子的数量,还要把余下的部分加到其中一个箱子上。再一次,进位到作业机器人货物运量是最重要的。这种进位确实意味着网络不会变得严格平等,但这是一种必要的牺牲。

多个优先集货箱

这个电路现在将尽力保持网络内容的平衡,误差为数个物品。机器人会做一些来回的工作,因为物品从一个网络中移除并添加到另一个网络中存在延迟,这意味着一开始会有轻微的过度修正。对于两个以上的网络,没有什么变化。因为每一对网络都试图使物品数量相等,所有物品逐渐在整个系统中分布均匀。

这个电路是可以无限调整和定制的。你可以添加一个偏置因子,使网络内容处于一个特定的比例,或者你可以添加何时应用偏置的条件,以及对哪些物品的偏置,还有其他任何你能想出来的方法。在我看来,这是一个甚至比简单性更重要的功能。

列车:原版 LTN 模拟

让我们从机器人转移到列车:列车非常强大,但也十分愚蠢。在一个复杂的系统中,如果有许多车站都有相同的名字,你就不得不使用电路,否则,列车就会不断地驶向相同的车站,使它们过度拥挤,而其他的车站无人问津。控制列车路径的传统方法是禁用那些不需要列车的车站,迫使列车去别的地方。然而,这是一个非常粗略和低效的方法,存在多种问题:列车在路口内重新寻路可能会导致死锁,一个车站被启用会引发列车雪崩,而雪崩产生的额外列车会造成不必要的交通。现有的一些电路系统,如 Haphollas 的原版列车网络,缓解了其中的一些问题,但仍然不是所有的问题。

规避此种混乱的常见方式是使用 Mod。异星工厂最流行和最有影响力的 Mod 之一是 LTN,即逻辑列车网络。它本质上是将物流机器人的大脑植入你的列车,并给你的车站提供集货箱和供货箱的功能。你只需设置每个车站想要的东西,列车就会自己想办法解决其他问题。不用说,这个 Mod 可以极大地提高效率。人们会认为想要对系统做出这种根本性改变几乎不可能用运算器来重新实现,这一观点本应是正确的。然而,使用电路创建一个简单得多的、尽管效率较低的 LTN 是非常容易的。

今天,我为大家带来“列车限制调度器和集货器(Train Limit Dispatcher and Requester)”,简称 TLDR。它是一套非常基本的电路,由多人独立发明,利用 1.1 版中引入的列车限制作为列车请求标志。主要的简化是,与 LTN 本身不同,在 TLDR 系统中,几乎每辆列车或车站都专门用于一个资源。其逻辑很简单。对于每一个供货站,计算你所储存的“列车满载”数量,并将其设置为你的列车限制。对于每个集货站,用需求和库存之间的差异做同样的事情。然后,每辆列车只是在供货站和集货站之间运行,发车条件为“装满货舱”和“清空货舱”。

一个极其简单的供货站
在这个例子中,一个供应站储存的铁板要除以 16000,因为这是四节货运车厢能装下的铁板数量。

TLDR 解决了传统车站禁用方案的所有问题。列车永远不会因为在交叉口内重新寻路而造成死锁,因为与停用车站不同,改变其列车限制并不强制重新寻路。不会有过多的列车被放进车站,因为只有列车限制允许的数量才能离开。没有列车雪崩意味着更少的交通,更高的吞吐量,以及更少的列车需求,这也意味着更好的游戏性能。

然而,事实并不像听起来那么简单。例如,如果一辆列车在集货站处卸货,但没有供货站准备好,那么它就会听在那里,阻塞集货站。这意味着我们需要一个中央车辆段,所以列车总是有地方可去,以腾出集货站。这个车辆段可以是最简单的:只是一堆车站,列车限制恒定为 1,还有一些加油机械臂。列车现在也会从集货站到车辆段再到供货站,在车辆段稍作停留。有些列车在离开供货站后也可能会停在车辆段,例如在供货站离得很远的情况下。

一个车辆段样例
一个可容纳 100 辆列车且对网格友好的车辆段样例。

但是,等等,还有更多! 车站的等待空间并不是无限的,如果一次有太多的列车被请求,它们可能会开始在本不应有任何队列的轨道上排队。为了解决这个问题,我们添加了两个判断运算器。它们将检查所请求的列车数量是否大于某个常数。若为否,直接通过请求数。若为是,就输出一个常数。它们的输出是相加的,因为常数和列车限制使用不同的信号,但它们需要相同的信号。然后,这个和被交给车站作为列车限制。

列车限制限制器

这个电路,就像本文的第一个电路一样,是可定制的。例如,你可以让集货站自动确定和设置他们自己的需求,或者你可以让一些完全独立的东西来控制他们的请求,或者你甚至可以改变装入列车的物品数量。基本上,系统采取的任何常数,你都可以变成动态值,通过一些独立的电路或者手动控制。你还可以搞乱列车的时间表和条件,例如,让车站在列车的需求得到满足后立即踢出列车,或者让列车处理一种以上的资源。

结论

这里给出的电路既可以作为最终的可用产品,也可以作为你自己电路项目的基础。我想说的是,它们类似于手办的白模:在你拿到它们的状态就可以从它们身上得到很多东西,但如果你发挥一些创造力和技能,就会有无限的可能性。这篇文章故意没有蓝图,因为它的目标不仅仅是给你一些整洁的电路,也是为了让你更好地理解它们。祝你在接线好运!

征稿

一如既往的,我们正在召集任何想要为 Alt-F4 做出贡献的人,无论是提交文章还是帮助翻译都可以。如果您有些有趣的想法,并乐于与社区分享,这里就是一个好地方。如果您没有太大把握,我们会很乐意帮助您讨论内容创意和结构问题。如果您有意参与,从加入 Discord 开始吧!