Alt-F4 #39 - JOSEF  2021-06-11

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

目录

在本周可以被 13 整除(速算一下)的 Alt-F4 第 39 期中,Drogiwan Cannobi 为本项目作出了首次供稿,他详细介绍了他的鲁布·戈德堡式的自扩张工厂的背景及其内部原理,该工厂被亲切地命名为 JOSEF。这是一个非常酷的概念,若你深入了解其细节甚至会发现它没有那么复杂。

JOSEF 的有机自扩张工厂(JOSEF’s Organically Self-Expanding Factory,JOSEF) Drogiwan Cannobi

JOSEF,自我扩张的工厂:单元格逐个进行分析和填充。一旦全部单元格都已填满,则创建一个新的环带。

这就是 JOSEF,一个自我扩张的工厂。它从少量的材料开始,慢慢成长,收集更多的资源,制造更多的建筑材料来进一步成长。假设我没有留下任何错误(而且你有无限的计算能力)的话,它将永恒的缓慢成长下去。JOSEF 使用递归蓝图 Mod,它允许你使用电路信号自动部署蓝图和红图。之前已有一些自我扩张工厂的例子,其中最值得一提的是由 NiftyManiac 在 2017 年建造的灰蛊。当年看到这个东西最终促使我自己也来试一试!

这篇文章试图解释 JOSEF 内部的工作原理。我将尝试大致完整解释它是如何工作的,尽管我不会详细讲解“逐个运算器”的细节。

我将试图说服你相信自己不需要成为一个程序员或魔术师就可以自己来试试这个东西!我在开始做这个之前对高级电路这类玩意儿没有什么可怕的经验,也只知道非常基本的魔术。我保证,如果你知道如何使用运算器,并保持足够的耐心,你也可以搞清楚的!

首先让我粗略地概述一下 JOSEF 的工作原理,然后再深入挖掘它的不同部分。总体原则如下:

  • 基地是由围绕中央“大脑”单元格的 2x2 区块大小的列车网格环带组成。
  • 一旦现有的环带被填满,就会建立一个新环带。
  • 一辆列车穿过新环带的所有单元格,并检查矿石分布。
  • 其他列车过来把该单元格专精于采矿、太阳能或生产建筑材料。
  • 所有单元格都通过全局机器人网络和电路信号网络相连接。

环带机制

一旦所有现存的单元格都填满了,就立即新建一个环带。这与灰蛊不同,灰蛊是以缓慢而稳定的螺旋方式建立和分析一个个单元格。我选择了完整的环带,因为,说实话,它要简单得多,也能正常工作,我看不出有什么理由要比这更复杂。它只需要 10-15 个运算器,而且不需要复杂的内存(除了存储你当前所在的环数)或类似的东西。

基本的建环机制如下:

  • 每个单元格都由其在二维网格上的位置(X,Y)来描述。最内的单元格的坐标为(0,0)。相邻的左边一格为(-1,0),上面一格为(0,-1),以此类推。
  • 变量 N 定义了目前正在修建的环带(中心单元格被视为 N=1 的环带)。这里我们以 N=3(即从 3x3 到 5x5 的网格)为例。
  • 这个环带被分成水平(上/下)和垂直行(左/右)。为了建立水平(蓝色)行,你希望 X 从最左边(-2)到最右边(2)的坐标连续遍历,Y 在 -2 和 2 之间翻转。将 X 和 Y 交换可得到垂直(橙色)行。

环带机制图示。
基本环带逻辑。水平(蓝色)行是通过让 X 偏移值在 -N 和 N 之间遍历,Y 偏移值在 -N 和 N 之间翻转而建立的。垂直行的建造方式则相反。

最后要让这个机制运行起来,还需要某种方法来增加环数 N。我在每个单元格中加入了一个运算器,发送一个全局的 Q=1 信号。这样一来,JOSEF 就能大致知道环带何时完成建设——准确地说,当 $ Q=(2N-1)^2 $ 时。判断“列车”(前往新单元格并决定如何利用它们)只有在这个条件满足时才会去新单元格。这可以预防列车进入在建中的单元格并将其弄乱。

由于我不仅仅要建立一个不断扩大的铁路网,还需要满足第二个条件再启动下一个环带建设。每一个现有的单元格必须被采矿(M)、电力(E)或两个生产单元格(I,J)中的一个填满。换句话说,当$ M+I+J+E=(2N-1)^2 $时,再建设一个新的环带。

这就把建造过程分成了两个不同的阶段。环带建造(直到收到足够的 ‘Q’ 信号)和单元格分析(直到收到足够的 M、E、I、J 信号)。

管理单个单元格

正在解耦的新单元格。
正在解耦机器人网络的一个新单元格。列车进站后,全局连接的机器人指令平台将被拆除,并新建一个位于中央的、未耦合的机器人指令平台。

好的,现在有了一堆全新的空置单元格。如何单独处理它们呢?

新的单元格建立时内置一个名为“新单元格”的车站(贼有创意,对吧)以及一片运算器。这些运算器负责输出 建设机器人=N,以便从蓝图簿中部署第 N 张蓝图,该蓝图簿由列车运到单元格中。事实证明,从一开始就把运算器放在那里比在分析部分建造它们要简单得多,因为建设中的运算器组合(以及拆除中的)不会有好结果。

当一个新环带的所有单元格都建成了,而且物流网络中也有足够的材料,建造者列车就开始逐一通过它们。它只包含一些材料和一本蓝图簿,被卸到一个部署箱中。循环浏览蓝图簿涉及一些技巧。整个过程太长了,在此不做描述,但让我们以开始为例看看。所有单元格开始时都有全局连接的机器人指令平台,但为了检查矿石(参见下一段所述),我需要断开机器人网络,所以这就是要做的第一件事:

  • 蓝图 1 是一个机器人指令平台的红图。一个单元格中的初始机器人指令平台(全局连接的)输出 铀-235=1(因为在大脑单元格的一个箱子中正好有一个 铀-235)。因此,最初有一个 铀-235=4 的信号来自这个局部电路网络中的四个机器人指令平台。一旦所有四个机器人指令平台都被拆除(从而使 铀-235=0),一个设置为 铀-235=0 → 建设机器人=1 的运算器就会触发,导致下一个蓝图被部署。
  • 蓝图 2 在单元格的中心建立了一个与全局网络解耦机器人指令平台。预建的传送带开始将 50 个建设机器人从列车上送入其中。这个新的机器人指令平台被设置为“读取机器人统计数量”,一旦 50 个机器人被送入现在已解耦的网络,一个 T=50 → 建设机器人 = 1 的运算器就会触发蓝图 3。
  • 蓝图 3 拆除机器人传送带,并立即触发蓝图 4,这将启动下一段所述的“资源查找”过程。

总的来说,对于循环浏览蓝图,你会想找到一些可以输出电路信号的实体,并将该实体的建造/拆解作为开启下一步的指标。此外,你可以使用“闲置的建设机器人(T=Z)”或“物流仓储中的物品 X”来确保建造过程确实完成。

作为一个例子,如果你不小心或使用时间相关的条件,你会遇到什么样的问题:当 JOSEF 开始变大时,机器人有时需要一点时间来建造未耦合的机器人指令平台。如果(由于以后会出现的原因)200 个传送带在那个机器人指令平台建成之前就被卸下了,蓝图的顺序就会被打乱,这个东西在没有拆除机器人传送带的情况下就开始建设采矿用传送带,然后把这个单元格作为“无采矿”来专用。这会乱成一团,导致工厂被卡住。

资源查找器

检查矿带。解耦后,放置矿工蓝图。只有当供货箱中减少一定数量的采矿机时,才会放置采矿单元格的剩余部分。

现在说说其中的关键部分。如何查找资源?原版中不存在读取“地面上的矿石”的方法,但一旦你解耦了机器人网络,实现这个功能将会非常简单:

  • 建造者列车会卸下固定数量的采矿机。如果你放置一张包含采矿机的蓝图,它们将从这个箱子中取出,所以你就可以精确地判断有多少采矿机被放置在那个单元格。为了安全起见,列车上有 150 个采矿机和 200 个传送带。
  • JOSEF 在放置矿工蓝图后,等待采矿机完全卸载(通过等待 传送带=200),并等待 50 个建设机器人全部闲置(通过等待机器人指令平台的T=Z)。然后检查箱子里剩下的采矿机数量,并将“建设机器人”信号增加 1 或 2,取决于是否已经放置了一定数量的矿工。我选择了 10 个采矿机作为最低限度,以便将整个单元格用于采矿。
  • 这意味着可以部署两种不同的蓝图。“采矿”或“非采矿”蓝图。这其中还有一些步骤,但接下来主要是重命名车站,拆除箱子,重建机器人指令平台以重新连接单元格。此外,蓝图簿将在一切工作完成后被放回列车上。

为了避免混合开采带来的问题,每个采矿单元格都包含铁矿、铜矿、石矿和煤矿的车站各一个。每个车站只有当有足够装满整辆列车的矿石时才会启用。这意味着大多数车站将永远不会被启用。

每一个新的单元格都将以该种方式进行检查。如果放置了 10 个以上的采矿机,它将被专门用于采矿而无视当前需求。这只是个 权宜之计,有着充足的改进空间。

一旦单元格被指定为“采矿”或“非采矿”且机器人网络已重新连接,初始建造者列车的工作就完成了。另一列列车将进入“采矿”单元格,正确标记车站,拆除运算器,并将“M”信号添加到描述单元格类型的常量运算器中。

我寻找矿石的方法有一个很大的问题:你永远不能让采矿机储存在全局物流网络中,否则他们会(部分)被放置在本属于非耦合网络中的采矿机位置。我的单元格很小,建设范围重叠得很厉害,以至于整个单元格都可以从外面进入。有一些保障措施,以防止采矿机在出现在全局网络中(同时仍由物流机器人将他们运送到建造者列车上),但也有可能在基地变得非常大之后出现找矿乱套的情况。但这是很罕见的情况,而且不会破坏其他东西,所以我觉得可以接受。不过在下一个版本中,我将尝试把采矿机完全排除出物流箱,除了目前正在分析的单元格中的物流箱以外。

然后,“非采矿”单元格由两个不同的列车处理,取决于…

…电力

太阳能单元格。
电力:每个单元格可以提供 7MW 的持续电力。当蓄电器电量下降到过低水平时,它就被放置在没有矿带的单元格中。

为了使起步更容易一些,JOSEF 由 EEI(电能接口)提供 30MW 的持续电力。一旦电力需求超过这个数字,JOSEF 将建造“电力”单元格,包括太阳能电池板和蓄电器。一个单元格可生产 7MW 的持续电力(峰值 10MW),所以你会需要好多个这样的单元格。

一旦蓄电器的电量下降到 70% 以下,JOSEF 将认为需要更多的电力。这将允许“电力”列车启动。与“采矿”列车类似,这家伙只是前往车站(这次是去“非采矿”站),部署太阳能蓝图,拆除运算器,给全局运算器添加一个“E”信号,然后离开那里。对它没有进一步的限制,因为我想确保,如果 JOSEF 让自己陷入困境后总是有办法获得更多的电力。

由于我每隔一段时间就会建造完整的、不断增加的环带,所以会出现巨大的功率峰值。这导致 JOSEF 过度建设电力,因为每个环带的前几个新单元格通常会被用于发电。在我较大的几盘游戏中,接近尾声时的平均耗电量约为 500MW,而发电潜力约为 1GW。这并不是世界末日(实际上,从UPS的角度来看,我很高兴每一个单元格都被填满了电力而不是生产),但如果我使用一个较慢的、灰蛊式的扩张机制,它肯定会更有效率。

JOSEF 工厂的电力消耗图。
电力图:你可以通过观察功率消耗的巨大峰值来推断某个环带的建造时间。另外,你还可以看到,整个工厂的扩张总体上是相当线性的。

现在只差一个小细节:我们希望 JOSEF 真的能够制造出它自己使用的材料!因此,所有剩下的单元格都是专门用来…

…生产

建筑材料的生产发生在两个不同的意大利面条单元格中。这些建筑的故事与之前的类似。当一个名为“非采矿”的车站可用,并且物流网络中有足够的建筑材料(并且没有电力不足),一辆列车就会进来,部署一个蓝图,并将“I”或“J”添加到全局常量运算器中,这取决于哪个生产单元格被建造。这家伙还做了一件事:它向物流网络卸下一些煤,以确保列车有燃料可以运行,对于生产单元格 2,它还卸下一些重油桶,以启动煤液化。

建造者列车只是在两个不同的单元格之间交替进行。有一个简单的“机械臂循环”,当列车回家时,将蓝图簿取出,放入另一本,然后等待列车离开后再启用。

JOSEF 基础生产单元格
生产单元格 1:基本的、与石油无关的物品(传送带、机械臂、组装机等等。)

第一种单元格生产各种不同的基本建筑材料。传送带、组装机、采矿机、机械臂、铁轨、列车、车站、信号、电线杆——几乎所有不需要石油的东西。基本生产单元格需要在 JOSEF 用完传送带或铁轨等物品之前建成。如果你在中心地带有太多的矿带,或者你没有给它足量的起始库存,而它决定拉满太阳能板,都将导致问题。但你总是可以通过给它多一些起始材料来解决这个问题。

JOSEF 高级生产单元格
生产单元格 2:使用石油的高级物品(机器人指令平台,机器人,蓄电器,等等。)

第二种单元格生产更先进的东西。机器人指令平台、机器人、物流箱、蓝图部署器、太阳能板和蓄电器。这个单元格需要在 JOSEF 的机器人指令平台用完之前建成。建造者列车带来了 10 桶重油,这些重油桶被倾倒,进入炼油厂,并尽快被重新灌装。JOSEF 不生产桶,而是依靠无限回收最初的桶。

这两个生产单元格远远没有优化到恰当的比例。他们缓慢而稳定地生产所有必要的东西,但可能需要一个小时才能生产出,比方说,他们的第一个车站,因为它需要先装满传送带。不够,事实证明,经过一段时间后,这将不再是一个问题了,后面详谈。

一段时间后,会有很多生产单元格散落在地图上。这意味着全局建设机器人会慢慢停止从中心(最初的建筑材料所在地)取材,而开始从附近的生产单元格取材,这就减少了飞行时间。然而,由于我的懒惰,他们仍然要把相当多的材料带入中心,以装载建设者列车,但这就是另一段故事了(会在JOSEF Mark 2 中处理得更优雅)。

生产单元格由列车供应原料。一旦收到新的“I”或“J”信号,位于中心的一个特殊的“列车部署器”单元格就会生成四辆新的列车(每种矿石各一辆)。有一个专门的单元格来部署列车(而不是把它们包括在生产单元格的蓝图中),可以确保蓝图上的列车和现有的列车不会发生干涉。如果没有这种预防措施,可能会出现蓝图列车附着在现存的列车上的情况,必须避免发生这种情况。

所有的列车都有一个简单的“装满货舱 -> 清空货舱”的时刻表,并将选择最近的车站。这意味着,靠近矿区的生产单元格将比远处的生产单元格获得更多的资源供应,而远处的生产单元格可能会有一段时间是空的。不过,这在一段时间后就平衡了,因为 JOSEF 慢慢地充满了大量的生产材料,许多单元格被闲置。

每个生产单元格有四辆列车,这意味着会有数量惊人的列车,其中大部分是不活跃的。在我 >500 个单元格的游戏中,JOSEF 最后有 750 辆列车。看看这个小而环岛的列车网格,让大部分列车都是闲置的未尝不是件好事。

JOSEF 大脑和列车部署器
左边是 JOSEF 的大脑,右边是列车部署器单元格。大脑几乎配不上它的名字——主要负责建环带和发送/停止建造者列车。所有有趣的逻辑都在单元格内进行。

回顾与未来计划

  • 有关 JOSEF 的几个数字:
    • 在我(不是很好的)电脑上,它最大增长到 25x25=625 个单元格。这花了大约 34 小时的游戏时间。它还在继续增长,但 UPS 已经降到了 40 左右,而且这玩意儿花了太多时间,所以我决定把它叫停。
    • 它已经建造了大约 170 个电力单元格,150 个采矿单元格和每种生产单元格各约 100 个。
    • 一位拥有更强大电脑的友善 reddit 用户将其运行到 29x29=841 个单元格,运行速度为 45 UPS。
  • 当 JOSEF 变大时,它的表现相当有趣。最初,扩张是相当缓慢的,因为必须等待生产建筑材料。看一下电力图,你可以看到它最初是如何加速修建环带的,尽管它必须经过的单元格数量随着环带的增加而增加。这是由于生产按四次方增加,而需求只按线性增加(甚至在后期停滞不前)。在第 9 或第 10 环的某个点上,生产不再是瓶颈,填满一个环带所需的时间会增加,因为需要填满更多的单元格。
JOSEF 达到的最大尺寸:29x29 单元格。
  • 在这个版本中,我很大程度上依赖机器人在整个基地中运输东西(主要是为了给建造者列车备货,以及从新分析的单元格中取回未使用的材料)。这多是由于我的懒惰,计划在未来的版本中改进这一点。不过总的来说,我这个超量修建生产单元格,巨量的建设机器人,并让它们可以取用分散在整个基地的建筑材料的系统,工作起来比我预期的要好得多——建设工作会分配给较近的机器人,它们也总是从最近的地方取货,只要你只给它们同一种物流箱。
  • 我热爱构思这个系统,设计单元格所有这些工作,但我必须说实话:测试这个东西有点烦人,特别是当你缺乏耐心,却想看到它跑起来。这就像测试一台能运行数个小时的鲁布·戈德堡机械机器——你做出任何一个微小的改变,都得重头开始,应用改变并让它运行几个小时。你迅速想出的许多小的修正会导致更多的不可预见的问题,而这些问题可能只在第 6 环左右出现。当然,你可以让事情变得更简单,例如在测试查找矿带机制时,给它无限的建筑材料,但真实条件下的测试是相当乏味的。

当然这不是我要建造的最后一个 JOSEF。事实上,我开始了一个短小的、不专业的教程系列,在其中我正在建造第二个版本,并顺便解释我是如何以及为什么要这么做。这是我到目前为止的成果:

  • 更大的单元格。我目前正计划做 4x4 的区块而非 2x2 区块。我将以非耦合的机器人网络开始,这将大大简化整个找矿过程。
  • 我通过固定运算器的数量和使用粘贴新设置来大大简化且稳定了用于浏览蓝图的决策树。这带来了新的挑战,但允许我在一个蓝图簿中塞进更多的不同单元格,同时不需要额外的运算器。
  • 处理水域,即作为原料也作为障碍:完工!
  • 处理虫群:很难搞好。我不打算挑战死亡世界,但应该可以对付少量的虫群。
  • 处理悬崖:只在心理层面有困难。我一直讨厌它们并直接在游戏设置里关掉。应该不难。
  • 制造科研包:理论上已经实现了(我只是在生产单元格中加入一个小型的、3SPM 的科研设施),但如果真运行起来就会有点麻烦,因为它会极大地增加对资源的消耗和活跃列车的数量。另外,我可能不得不引入一些额外的安全措施,以确保科研不会占用生产材料。毕竟,工厂必须扩张。

最后的感想

几年前,当我第一次看到灰蛊(可能是迄今为止最受欢迎的自扩张工厂)的视频时,我深受震撼,确信这是个来自另一世界的超级天才想出的主意。对于一个普通的、小有经验的异星工厂玩家来说,是根本不可能实现这样的壮举。

我不打算把 JOSEF 和灰蛊相提并论。JOSEF 是一个非常愚蠢的自扩张工厂,有无数的东西可以(也将会)改进。但是我觉得很多人在祝贺我做出它的时候,对 JOSEF 的感觉和我当年看到灰蛊的感觉一样。因此,虽然我有感到自豪,并感谢所有的赞美,但请相信我说的话。真没那么难!任何一位造过回转寿司、平衡车站、智能铀增殖或其他什么包含运算器装置的人,都能做出这个!只要稍微玩一玩,你就会发现这其实是很容易做到的。我希望这个对 JOSEF 的简陋内部原理的小小一瞥已经证明了这一点。我真的很希望看到更多的人在这方面有所尝试。

欢迎使用我的想法作为起点,改进它们,如果你不喜欢它们,就把它们扔出窗外替换掉!当然,我总是乐于讨论、帮助、调试和头脑风暴。JOSEF 的一些功能正是在与这个伟大的社区的杰出人士讨论过后才得以实现的。

征稿

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