Alt-F4 #23 - 传送带狂欢节  2021-02-12

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

目录

在为之前两周的 FFF 让出热度而短暂休刊之后,我们又回来了,带来两篇关于传送带的文章。在第一篇文章中,Recon419A 探讨了一个有趣的概念,让传送带以即时化的方式送达物品。然后,pocarski 深入研究了如何利用传送带来构建图灵机,技术宅狂喜。建议读者先获取计算机科学相关学位。

物流传送带 Recon419A

在异星工厂中移动物品有三种主要方式:传送带、物流机器人和列车。传送带适用于单种或两种物品的输入输出,火车适用于大量的单种物品,物流机器人适用于复杂的制作任务。然而,有时候,你需要组合这些方法,这就是诸如回转寿司等技术可以发挥作用的地方。在本文中,我想谈谈另一种我称之为“物流传送带”的方法。和回转寿司一样,物流传送带有没有 Mod 都可以使用,它本身也并不是一个 Mod,而是一种利用传送带和非常简单的电路来控制什么资源去哪里的方法。就像原版的物流网络和某些基于火车的 Mod 例如 LTN,它们的目的是成为一种比基本的传送带更智能的资源运送方式。

物流传送带说明

物流传送带是一个有点复杂的概念,但当你看到一个实际例子后,理解起来就简单多了。在这个例子中,请注意几种物品是如何沿着同一条传送带发送的,每种物品只有在要求时才会被装上传送带。如果只需要铁和铜,那么就不会有钢铁被送来;同样,如果什么都不需要,那么传送带就会保持空的状态。

使用电路条件、筛选分流器和装卸机的物流传送带演示。机械臂可以代替装卸机,但根据传送带速度可能需要增加二至三倍的数量。

在例子中可以看到,电路条件设置为当目的地的物料少于 100 时发送物料。在现实中,传送带的长度会影响到发送材料的数量,如果传送带很长,当一百个材料进入缓冲箱时,还有几百个材料位于传送带上。在不溢出接收箱的要求下,传送带在理论上 长度限制,但在实际操作中,只要你使用的是钢制箱就不大可能碰到;在非常大的距离上,你肯定会用列车来代替。如果你想玩一玩这个物流带的设置,可以在这里下载蓝图字符串,不过请注意该蓝图使用了 Loader Redux Mod 中的装卸机。

物流传送带的电路条件示例。
物流带的电路条件示例。需要注意的是,在这个距离上设置限制为 100 个时会实际发送约 270 个铁板,这是由于切断供应时传送带上还留有铁板。

物流传送带使用案例

物流传送带适用于你在某一时刻需要大量的一种物品,然后在之后很长一段时间内都不再需求的情景。用过物流机器人来自动化传送带生产的人都会熟悉这种被称为“充电云”的现象,这是一种当你向物流网络需求不少于 10000 个齿轮和 1500 个电路板时就会出现的现象。同样,当你需求用以制造核反应堆或火箭发射井的材料时,机器人往往会在一个从未为这种程度的吞吐量设计的区域内,围着一个组装机蜂拥而上。当你需要大量的物品时,通过传送带把它送进去要容易得多:运输 10000 个齿轮只需要不到 4 分钟的时间,而且几乎不会降低你的 UPS;如果使用机器人,则需要 2500 次行程,而且很可能会让这个数量的机器人起飞,淹没从未对此设计过的充电能力,并且再也无法恢复平衡。然而,为每个项目运行专用传送带也会产生自己的一系列问题;通常情况下,传送带会闲置在你的工厂内,占用空间,你甚至可能一开始就没有空间运行 8 路总线。对于你的传送带商城这样的东西来说,发送一大批齿轮夹杂着一大批电路板,对于物流传送带来说是小菜一碟;一旦它们到达那个位置,在内部使用机器人对你的物流网络的压力就会小很多。

局限性:多个目的地

如何将一个物品发送到多个目的地的问题则很困难,这也是我个人一直没能解决的问题。因为筛选分流器会把一个物品全部截断,想要把该物品 仅在某些时候 通过该筛选分流器需要复杂的分流器安排和多个源自不同目的地的电路条件。我对这个问题进行了大量的思考,虽然已经想出了几个原型,但它们大多容易出现堵塞或将过多的一个物品发送到错误的目的地等行为,若不加以处理有可能造成溢出。以异星工厂社区的情况来看,如果这个问题在一两周内得到解决,而且是以几种不同的方式解决,我丝毫不会感到惊讶;也许我们甚至会在未来的 Alt-F4 中看到 你的 解决方案。不过现在,我把它作为一个挑战留给社区。请务必告诉我知道你想出了什么办法!

关于回转寿司的说明

玩过一段时间游戏的玩家可能已经遇到过类似的概念:回转寿司。和物流传送带一样,回转寿司也是将两种以上的资源放置在一条传送带上,但一般都是设计为循环的方式以来满足复杂的制作。在入口处或整个传送带回路的电路信号有助于控制每一种资源的存在量,甚至诞生了“血管总线”这样复杂的例子——你工厂的循环系统。虽然物流传送带的概念类似,但它还是有一些重要的区别,关键的区别与它们的功能有关:回转寿司走的是 周围,倾向于不按特定的顺序为多个装配机服务,而物流带走的是 到达,倾向于将资源从一个位置引导到另一个位置。事实上,物流带可以用来代替普通总线给回转寿司提供服务——当需要资源时,可以发送资源,并仔细地限制速率控制,防止传送带环路的过度拥挤。其他的概念,如时钟带或机械臂限制等,都可以应用在这里,甚至可以与物流带相结合,实现不朽的工程壮举。在我看来,物流传送带本身只是玩家工具箱的一部分。

一个在大型街区基地中使用回转寿司的疯狂样例。来源:u/dentoid 的 Reddit 帖子

纯传送带计算,第一部分:不太简明的数学 pocarski

在异星工厂中,我们可以使用电路网络来构建系统,从一些简单的布尔逻辑开始,直到一台功能完备的计算机,然后,足够疯狂的人甚至可能在上面运行 DOOM。然而,不那么明显的是,电路网络并不是游戏中唯一图灵完备(不熟悉的话可以看看链接页面)的系统。事实上,你可以用一些很基本的东西来构建一台计算机,这些东西几乎在你开始新游戏的时候就能得到:传送带。

在这个分为两部分的系列中,我将循序渐进的设计两个系统,它们在真实计算机都有应用。该系统仅使用传送带和分流器,别无他物。我将使用装卸机和无限箱,然而在任何时间,进入系统的物品和离开系统的物品完全一样多,所以所有的传送带也可以通过一段缓冲来循环。出于紧凑和避免乱麻的目的,我选择不这么做。我必须要感谢 letao12,他围绕着创建一个只有传送带的 CPU 做了一系列的视频,这也是启发我用自己的想法来回馈他的想法的原因。

任何系统要想成为图灵完备的系统,就必须能够创建一种被称为逻辑门的东西。逻辑门是一种简单的元件,它只根据当前的输入给出一个输出,从而执行逻辑代数的基本运算。逻辑代数中只有 2 个数字:1 和 0,在电路中,它们对应的是高电平和低电平,但在我们的例子中,我们会说有物品的传送带是 1,空传送带是 0,有 3 个基本逻辑门。

  • OR 门(或门,析取)——当至少一个 输入为 1 时输出 1
  • AND 门(与门,合取)——当所有 输入为 1 时输出 1
  • NOT 门(非门,否定)——仅当 输入为 0 时输出 1

下面的真值表显示了它们各自基于可能输入范围的输出。

A B NOT A A OR B A AND B
0 0 1 0 0
0 1 1 1 0
1 0 0 1 0
1 1 0 1 1

众所周知,通过将这些逻辑门以特定的方式进行连接(有时也会有循环),就可以构造出一台图灵机。这三种基本门类型可以完全用传送带和分流器来创建。这里有一个蓝图簿的链接,里面包含了本文的所有内容,如果有人想自己实验一下电路,可以参考。我将不同的物品称为“物品类型 1/2/3/……”,是为了方便和通用,优先/非优先输入和输出称为“初级/次级”,主要只是为了方便。我还将在图片中使用不同的颜色,以区分物品类型。

基础门

AND 门和 OR 门就像一个设置了优先级的分流器一样简单。

初级输出作为 OR 门,而次级输出作为 AND 门。

NOT 门的制作比较棘手,但可以通过使用超过一种物品类型和一些巧妙的筛选和优先级来完成:

输入 A 为 0 时,第一个分流器只接收到一个输入,因此物品类型 2 将进入初级输出,这意味着 NOT A 输出 是 1。 当输入 A 开启时,第一个分流器现在得到两个输入;物品类型 1 将进入初级输入,因此它将被放在初级输出上,取代现在从次级输出出来的物品类型 2。次级输出实际上是 A 的副本,但物品类型不同。

第一个分路器的初级输出始终是 1,但会根据输入的情况切换物品类型。使用筛选分流器,我们可以把这个可变物品类型信号分成 2 根线:一根只是信号A直接过来,与原来输入的物品相同,类型 1,另一根则是 NOT A,物品类型 2。

这第二个电路异常有用,因为它结合了一个 NOT 门、一个信号复制器和一个物品交换器。我们需要信号复制器,因为用分流器分流一个传送带,会使物品流不饱和,从而导致它与其他分流器的交互不正确,因为它既不是 0 也不是 1。我们还需要物品交换器,因为一个电路的输出类型和另一个电路的输入类型之间经常会出现不匹配的情况。

半加器

现在我们有了 3 个基本组件,让我们来制作一个半加器。 为什么我们需要一个半加器? 顾名思义,半加器是半个全加器,全加器是一个具有将二进制数相加能力的电路。这将使我们能够做加法,而创造性地使用加法使我们能够实现 字面意义上 可以想象的所有其他数学运算。

半加器是一种将两个 1 位二进制数相加的电路。这听起来像是一项艰巨的任务,但实际上,它非常简单。输入 A 和 B 都是 1 位的二进制数,这意味着最大可能的输出是 2(1+1),不幸的是,这将无法适应 1 位的输出。取而代之的是,我们将使用 2 位的二进制数输出,其中第一个数字的位置值为 2(21),第二个数字的位置值为 1(20)。考虑到这一点,下面是半加器的真值表。

A B A + B 高位 A + B 低位
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0

我们可以看到,高位是简单的 A AND B。然而,对于第二个数字,我们需要一种叫做 XOR 门(异或门,异或)的东西(XOR 代表“eXclusive OR”,排他性 OR,独占性 OR)。如果 正好一个 输入为 1,XOR 门就会输出 1,这正是我们对第二个数字的需求。

XOR 门的逻辑是,“A 或 B,但不是两者都有”,因此 XOR 门只是 (A OR B) AND NOT (A AND B)。下面是如何用前面讨论过的基本门来实现:

请注意,我们还从 复制器-NOT 组合电路中免费得到了 AND 门的输出,使我们有了一个完整的半加器。恰好我们可以将第一项物品交换器和第二项 AND 门结合起来,这样我们就可以节省一个分流器:

最终产品

现在,为了将我们的半加器转换为全加器,我们需要将其中的 2 个加法器依次连接起来(“半加器”正因此得名):

一个全加器示意图

如你所见,一个全加器只是 2 个半加器以特定的方式链在一起。现在,我们可以直接复制粘贴电路,但由于传送带的特性,有一个更好更小的方法。传送带的 2 个通道是由分流器相互独立处理的,这意味着,我们可以不用链上两个半加器,而是 通过一个半加器两次。这在传统的逻辑电路中通常是不可能的,但在异星工厂计算机这个美丽新世界里,一切都可以实现。下面是如何实现的:

在这里,第一个半加器使用传送带的右侧,第二个半加器使用传送带的左侧。首先,输入像正常的一样通过第一个半加法器,在传送带的右侧。接下来,半加法器的 XOR 输出一路回环,放在传送带的左侧。它又经过同样的机制,但由于它在左侧,所以与右侧完全没有互动。不过第二个半加器仍然有一个空闲的输入,所以我们必须连接第三个输入传送带,这次是在左侧,作为 进位 输入。两个半加器的 AND 输出被单侧装到一个传送带上,自动产生一个 OR。内部延迟可能会导致两个半加器的进位同时输出,导致它试图将一个完整的传送带卸载到一半的传送带上。因此,我们还需要一个溢出保护分流器,以避免进位堆积而破坏整个电路。经过一些元件的重新排列,我们得到了这个:

这和上一张图中的电路 完全 等效,我把它留给读者去验证。剩下唯一要做的就是把一堆这样的东西堆在一起,然后给它们喂数字,所以这里是一个纯传送带加法器,计算 01001101 (77) + 10001011 (139) = 011011000 (216):

做加法固然很酷,但没有存储就什么用都没有,而这正是我们下期要探讨的问题。敬请期待!

征稿

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