使用状态动作和转换标签定义图表行为
状态操作和过渡操作*是分别写在状态或过渡中的指令,用于在模拟过程中定义图表的行为。
考虑一个有限自动机模型,该模型对科拉茨假设 的一个变体进行经验测试。对于给定的数字输入 ,图通过重复规则计算科拉茨序列 :
- 如果 是偶数,那么
- 如果 是奇数,那么
科拉茨假设指出,对于每个自然数,都有一个最终归一的数列。
图由三个状态组成。在模拟开始时,初始状态通过设置来初始化图表数据:
- 本地数据 n 与输入值 u 相对应。
- 本地数据 n2 除以 2 时转换为余数。
- 输出数据 y 设置为 false
根据输入数据的奇偶校验,图表切换到偶或奇状态。当状态活动在偶和奇状态之间切换时,图表会计算序列中的数字。当数字网格序列达到值 1 时,y 输出变为true,模拟停止。
状态操作类型
状态操作定义了状态图在状态激活时的操作。最常见的状态操作类型是进入、持续和退出:
** 进入** - 状态激活时发生的动作。
during - 当状态已处于活动状态,而图没有脱离该状态时,在某一时间步发生动作。
- 退出** - 当图表退出该状态时发生操作。
您可以使用完整关键字(entry、during、exit)或缩写(en、du、ex)来指定状态动作类型。也可以使用逗号组合状态操作类型。例如,组合类型为进入、持续的操作会在状态激活的时间步发生,只要状态保持激活状态,就会在随后的每个时间步发生。
梯度图包含状态中的动作:
Init - 当模拟开始时该状态处于活动状态,entry动作决定n的奇偶性,并将y设为false。当图表在一个时间步后离开初始状态时,退出动作将确定n是否等于 1。
Even - 当该状态激活时,以及在该状态激活期间的每个后续时间步,entry、during 组合动作会计算冰雹序列中下一个数字 n/2 的值和奇偶校验。
Odd - 当该状态激活时,以及在该状态激活后的每个时间步长内,entry、during的组合动作会检查n是否大于1,如果大于1,则计算冰雹序列中下一个数字3*n+1的数值和奇偶校验。
过渡标签类型
过渡标签定义了当活动状态发生变化时状态图会做什么。最常见的过渡标签类型是条件和条件动作:[条件]{动作}。
-
条件是指定过渡是否发生的逻辑表达式。如果不指定条件,过渡将在初始状态激活后的一个时间步发生。
-
条件操作是当提供过渡的条件为真时执行的指令。条件动作在条件之后执行,但在任何退出或进入状态动作之前执行。
梯度图包含转场动作:
Init 中的默认转换 - 在模拟开始时,条件操作 将输入值 u 分配给本地数据 n。
-
从 Init 到 Even 的过渡 - 条件指定当 n 为偶数时发生过渡。此过渡源中的数字 1 表示此过渡在 Init 到 Odd 的过渡之前进行评估。
-
从 Odd 到 Even 的过渡 - 条件指定当 n 为偶数时发生过渡。
-
从偶数过渡到奇数--条件 规定,当 n 为奇数时,过渡发生。在这种情况下, 条件的作用决定了 n 是否等于 1。
研究图表的行为
让我们模拟运行一个从数值 9 开始的冰雹序列。为此,请使用控制指令加载并运行模型collatz.engee
。
modelName = "collatz";
model = modelName in [m.name for m in engee.get_all_models()] ? engee.open( modelName ) : engee.load( "$(@__DIR__)/$(modelName).engee");
results = engee.run( modelName )
让我们获取结果并研究图表的行为。
res_n = results["n"].value;
res_t = results["n"].time;
bar(res_t, res_n)
状态图
-
在 时,默认过渡到初始状态。过渡操作将 n 的值设置为 9。初始状态变为活动状态。条目中的操作会将初始值 n2 设为 1,将 y 设为 false。
-
在时间 时刻,n2 == 0 的条件未满足,因此图中准备过渡到奇数状态。Init 中的退出操作将 y 设置为 false。初始状态变为非活动状态,奇数状态变为活动状态。Odd 中的进入操作将 n 设置为 28,n2 设置为 0。
-
在 时,条件 n2 == 0 为真,因此图表准备过渡到 Even 状态。奇数状态变为非活动状态,偶数状态变为活动状态。进入偶数状态的操作将 n 设为 14,n2 设为 0。
-
在 时,条件 n2 ~= 0 未满足,因此图表没有过渡到其他状态。偶数状态保持激活。在偶数态期间的操作将 n 设为 7,n2 设为 1。
* 期间条件 n2 ~= 0 为真,因此图表准备过渡到奇数状态。过渡操作将 y 设为 false。偶数状态变为非活动状态,奇数状态变为活动状态。进入奇数状态的动作将 n 设为 22,将 n2 设为 0。
-
图继续计算冰雹序列,直到时间 到达值 。
-
当 运行时,图形准备从偶数状态过渡到奇数状态。过渡动作将 y 设为 true。偶数状态变为非活动状态,奇数状态变为活动状态。奇数状态下的进入操作不会改变 n 或 n2。
您也可以从建模环境中运行模型模拟。为此,请打开模型collatz.engee
并运行。然后您可以在 "图表 "窗口或 "数据检查器 "应用程序中查看模拟结果。
1.在右上角的 "应用程序 "选项卡上,转到 "数据检查器 "部分。
2.要查看冰雹序列值,请在 "数据检查器 "中选择记录的信号 n。

结论
冰雹 "序列在迭代 19 次后达到了 1 的值。你也可以用其他数字做实验。