Alt-F4 #27 - 设计不必要的东西  2021-03-12

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

目录

本周,pocarski 继续他的传送带疯狂之旅,来看看通用平衡器。其结果是如此疯狂而又无用,你应该知道我们是在享受这个过程!

通用 8-8:完美平衡,万物皆宜 pocarski

最近,我用传送带和分流器做了一堆电脑零件。本周我将继续我对移动物品的不健康的痴迷,制作一些至少能有点用处东西:平衡器。为什么我要写一整篇文章来设计一个平衡器呢?嗯,那是因为我们今天要做的这个平衡器可不一般!

这篇文章不会很深入地探讨平衡器的设计原理,因为我们将在大多数情况下使用预制且熟知的蓝图。然而,并非所有的平衡器皆生而平等,所以你需要了解一些术语:

  • 输入平衡:均匀地从所有输入中提取。在将多个输入合并为较少的输出时尤其重要。
  • 输出平衡:均匀分配给所有输出。当把几个输入分割成更多输出时尤其重要。
  • 有限吞吐量:存在内部瓶颈。一个有限吞吐量系统的例子是将两条传送带合并成一条,然后再将其分割成两条。这样的一个系统即使在输入和输出上都有两条传送带,但最大吞吐量只有一条传送带。
  • 无限吞吐量:与有限吞吐量相反,不存在内部瓶颈。如果 通过 X 条传送带,它们就 通过。

本文中的所有蓝图(还有一些额外的内容)都可以在这里下载。

前提

想象一下下面的情景:你作为一个新手,刚刚听说了那些被称为“平衡器”的玩意儿以及它们的功能。你想把一条传送带平衡成三条。你本应该使用 1-3 的平衡器,但你还不知道这些,所以,你尝试使用 4-4 的平衡器,但只连接一个输入和三个输出。然而这么做得到的并非预期的 1:1:1 的输出比例,而是 1:1:2 的比例,令你大失所望。

如何错误的使用平衡器

在这篇文章中,我给自己设定了一个目标,就是要做一个平衡器,符合这种直观的工作方式;换句话说,无论输入/输出如何配置,所有的输出总是相等的,所有的输入都是平均抽取的。这种平衡器被称为“通用平衡器”,这个概念最早由 Reddit 用户 u/tzwaan本帖中探讨并命名,他是异星工厂 subreddit 的版主之一。

通用平衡器可以实现其他平衡器都做不到的功能:无论配置如何,都能同时做到输入平衡、输出平衡 无限吞吐量! 这是以前认为只有 2-2 平衡器才具备的一系列特性,即一个分流器。缺点是,它们会很

设计原则

让我们思考一下如何将 4-4 平衡器转换成 3-3 平衡器。这是通过将额外的输出循环回第一个分流器来实现的。我们将以这个想法作为我们的基本原则:

循环 4-4

我们希望满足以下行为:当一个输出开始溢出时,我们希望多余的物品自动回到平衡器的输入端,以维持所有输出的满负荷运转。如何实现这一点呢?很简单,我们使用优先分流器。通过让它们的非优先级输出将物品放到循环上,我们保证溢出的物品且只有溢出的物品,才会走在上面。我们还需要将循环项与输入项合并。为此,我们需要再次使用优先分流器,但这次是输入优先级。我们将循环设置为非优先级的输入,这样循环上的项目就不会以任何方式干扰输入:

自动循环 4-4

经过一些测试,我们会发现一个重大问题。如果回环物品试图进入一个已经满了的传送带,它们就会一直堆积到分离点,并阻挡了溢出物,使我们回到了起点:

失效的自动循环 4-4

为了补救这个问题,我们需要确保循环上的每一个物品都能到达循环的每一个出口。这可以用很多方法来实现,但对于我们的需求来说,我们要寻找所需分流器最少的方案。恰好,最节省分流器的方法就是用另一个平衡器来实现。让我们把它添加到循环中:

修正的 4-4

我们现在有了一个功能齐全的通用 4-4 平衡器。不过,它还可以继续改进。由于特定的平衡器机制,我们实际上并不需要四条传送带回环。一般来说,我们需要比我们的所制作平衡器少三条传送带。这意味着我们可以将回环传送带压缩成两条,然后再将它们分流,以此来优化我们的平衡器:

简化通用 4-4

现在我们可以把这些组件重新安排以降低占地面积,比如这个:

小型通用 4-4

这个平衡器虽然相当长,但只有 6 格宽,这意味着你可以把它放在一个标准的四带总线上,并且有足够的空间把它们挨在一起。需要注意的是,这不是我的设计,虽然它是基于我的一个设计。遗憾的是,我忘记了设计师的名字,所以在此无法恰当的署名。

高级设计

现在,让我们试试更大的东西:通用 8-8。我们先做与 4-4 相同的步骤,只是拿用 8-8 平衡器来代替。这就是我们所得到的东西:

基础通用 8-8

不幸的是,我们这样得到的通用 8-8 是不完善的。与标准的 4-4 平衡器不同,标准的 8-8 平衡器是有限吞吐量的,这使得整个通用 8-8 平衡器也是有限吞吐量的。以下是一个状况能导致其出现瓶颈:

基础 8-8 瓶颈

如你所见,有六条输入输出传送带,但吞吐量不足六条。幸运的是,这种情况很容易解决,只需将核心平衡器换成无限吞吐量的平衡器即可:

正确的通用 8-8

请注意次级平衡器依然可用有限吞吐量的平衡器,因为它的唯一工作是让物品抵达所有的传送带。现在,我们可以尝试使用我们的回环压缩技巧,但我们需要将八条传送带压缩成五条,然后再分割成八条。这比我们直接跳过压缩和平衡八条传送带所需要的分流器要多得多。由于我们使用的是蓝带,所以我们可以采用编织传送带的方法,将八条蓝带的回环压缩成位于两侧的两格宽走廊:

压缩的 8-8 通用

整个东西都无法辨认了,但这是因为次级平衡器现在和主平衡器是一致的,也就是说我们要面对多达十二条传送带塞进八格宽的空间,这就迫使辅助平衡器的位置极其分散。当我们从蓝带降级为红带的时候,我们也可以完全抛弃编织传送带,只需要用几个蓝色的地下传送带,就可以把八条红带塞进四条的空间里。这样一来,我们降级到黄带也很容易,当然,我们还是要用一些红蓝地下传送带:

蓝,红和黄通用 8-8 并列

在没有任何蓝色地下传送带的情况下,做黄带设计肯定是可能的,但是那样会让整个设施变得更长。也可以让红色和黄色的设计都完全没有任何更高级的地下传送带,但那样会让整个产物变宽 33%,以及不知道要多长多少。

最后说明

我故意在这篇文章中留下了一些谜团,因为有些在过程中解释起来太尴尬了,有些我自己也不是那么理解。这是我(试图)澄清它们的部分,所以先警告一声,以下将有一些技术性的东西。

  • 你怎么知道平衡器是在传送带上分配物品最有效的方式?

让我们用归纳法来证明这一点。首先,想象一下,我们已经有了横跨 2N-1 个传送带的最有效的分配器,我们称它为“小分配器”。现在,让我们增加一排分流器,将它的每一个输出一分为二。我们现在有一个 2N-1-2N 的分配器。为了获得正确的输入数量,让我们克隆小型分配器,并将其输出回送到添加的一排分流器的剩余输入端。现在我们有了一个 2N-2N 的分配器,其使用的分流器数量尽可能少。现在我们可以说 2-2 分配器是一个单一的分流器,显然这是最高效的。这种高效的再分配器生成算法和最简单的平衡器生成算法是一样的,你可以自己随意测试。

  • 你怎么保证输入平衡的?

对于任何 N-N 平衡器而言,如果没有任何输出是拥挤的,那么无论输入如何,所有的输出都有相同的吞吐量。同样,如果没有输入存在不足,那么无论输出如何,所有的输入都有相同的吞吐量。只要回环有足够的容量来供给所有缺失的输入,就可以保证输入平衡。

  • 为什么回环的传送带可以减少了三条?

实话实说,我自己也不完全明白这个原理。这是一个实验观测得到的结果,这和三是不能被被 2N 整除的最小数字有关,这就使得三个开路输出是环回要处理的最坏情况。不过我无法解释为什么一和二不需要全环回吞吐量。如果有谁愿意自愿帮我解决这里的数学问题,我将非常感激。

结论

这多少是对通用平衡器世界的表面观察。我们本可以更深入地探讨,比如探索 N-3 定理,但我不认为通用平衡器有足够的用处。它们其实更像是一个玩具和一个整洁的好奇心,而不是适用于实际问题的东西。我只能想到通用平衡器的两个潜在用例,一个是装载/卸载可变长度的列车,另一个是不想翻阅平衡器的蓝图书。通用平衡器(实际上所有的平衡器)实在是太大了,没有足够的效益,反正你应该使用基于优先级的传送带压缩来代替。通用 8-8 平衡器是对传送带可以做什么的实验(它几乎就像是传送带加法器和内存的精神继承者),并不打算以任何有意义的方式使用。如果你能为它找到一个合适的位置,请告诉我,因为我自己也非常好奇这个怪兽能有什么用处。如果你是一个绝对的疯子,并且有太多的空闲时间,也欢迎你尝试把所呈现的设计小型化。

征稿

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