
这是3-3关卡(加法器)中的一个自动机,它能同时满足复杂度和步数这两项要求。自动机预览

这是最终版的自动机,其复杂度为370,平均步数为21.25,均满足限制条件。它使用了两个额外的装置:一个名为【Carry】(进位)的开关,一个名为【Index】(序号)的累加器。在接下来的章节中,我将解释它的工作原理。第一版

为简单起见,我们首先考虑这个自动机。它的平均步数在30以上,但可以通过优化得到最终版本。 我们从右到左计算两个二进制数的加法。在此过程中,我们使用【进位】来记录加法进位,使用【索引】来记录已相加的位数(0表示从右数第一位,1表示第二位,依此类推)。 对于每一位,我们从节点Q1开始。这里有4种情况: (这里我说【进位】为0表示它关闭,将其设为0表示关闭它。1的情况类似。) A1、A2、【进位】均为0。此时我们将A3设为0,【进位】设为0。 A1、A2、【进位】中恰好有一个为1。此时我们将A3设为1,【进位】设为0。 A1、A2、【进位】中恰好有两个为1。此时我们将A3设为0,【进位】设为1。 A1、A2、【进位】均为1。此时我们将A3设为1,【进位】设为1。不过,在第一种和第三种情况下,我们其实不需要将A3设为0,因为它一开始就是0。另外,如果进位没有变化,我们也无需对其进行设置。例如,如果A1为1、A2为0、进位为1,那么我们可以什么都不做,因为我们需要将A3设为0并开启进位(而进位已经是开启状态)。 因此,我们可以重新考虑所有8种情况,发现实际上只有4种情况: - 若(A1,A2,进位)=(0,0,0)或(1,0,1)或(0,1,1),则不执行任何操作。 - 若(A1,A2,进位)=(1,1,1)或(1,0,0)或(0,1,0),则将A3设为1。 - 若(A1,A2,进位)=(1,1,0),则开启进位。 - 若(A1,A2,进位)=(0,0,1),则将A3设为1并关闭进位。 所以我们有三个节点Q2、Q3、Q4和6个过渡……为什么不是8个呢?别忘了我们有一个【默认过渡】。执行完操作后,我们会到达节点Q5。在此处,我们增加计数器【Index】,并将A1/A2/A3向左移动。如果到达最后一位,只需检查进位:若进位开启,则将A3的最高位设为1。若未到达最后一位(Index < 5),则返回Q1并重复该算法。 优化 如何优化上述自动机?其平均步数为30.10。 注意到我们有一个无用节点Q1。我们需要经过它5次。(在本游戏中,步数会计算你经过的所有节点和转换。因此经过一个节点实际上会产生两步。) 如何移除它? 其实很简单。 我们只需将Q1的所有转换复制到起始节点和节点Q5(复制到Q5时必须添加条件“T(Index, {0,1,2,3,4})”)。 但现在这样做并不奏效。 这是因为Q1有一个到Q5的“默认”转换。我们希望将其复制为一个从Q5到Q5的转换,条件为“T(Index, {0,1,2,3,4})”,但这与所有其他从Q5到Q2/Q3/Q4的转换存在冲突。如果我们直接创建一个从Q5到Q5的“默认”转换,可能会导致无限循环。因此,我们创建了一个新节点,通过“T(Index, {5})且T(Carry, {Off})”的转换从Q5连接到该新节点,然后仅使用“默认”转换让Q5指向自身。现在不会出现无限循环了。 另一个问题是复杂度超出了限制。我们注意到在起始节点,进位必须为关闭状态。因此,起始节点只有4种情况,我们可以仅使用3个转换(通过使用默认转换)。现在我们得到了第一章中自动机的最终版本。
2026-03-21 19:00:17 发布在
Alan's Automaton Workshop
说点好听的...
收藏
0
0
