Engee 文档
Notebook

使用状态动作和转换标签定义图表行为

状态操作和过渡操作*是分别写在状态或过渡中的指令,用于在模拟过程中定义图表的行为。

考虑一个有限自动机模型,该模型对科拉茨假设 的一个变体进行经验测试。对于给定的数字输入$u$ ,图通过重复规则计算科拉茨序列$n_0=u,n_1,n_2,...$ :

  • 如果$n_i$ 是偶数,那么$n_{i+1}=n_i/2$
  • 如果$n_i$ 是奇数,那么$n_{i+1}=3n_i+1$

科拉茨假设指出,对于每个自然数,都有一个最终归一的数列。

图由三个状态组成。在模拟开始时,初始状态通过设置来初始化图表数据:

  • 本地数据 n 与输入值 u 相对应。
  • 本地数据 n2 除以 2 时转换为余数。
  • 输出数据 y 设置为 false

根据输入数据的奇偶校验,图表切换到状态。当状态活动在状态之间切换时,图表会计算序列中的数字。当数字网格序列达到值 1 时,y 输出变为true,模拟停止。

状态操作类型

状态操作定义了状态图在状态激活时的操作。最常见的状态操作类型是进入持续退出

** 进入** - 状态激活时发生的动作。

during - 当状态已处于活动状态,而图没有脱离该状态时,在某一时间步发生动作。

  • 退出** - 当图表退出该状态时发生操作。

您可以使用完整关键字(entryduringexit)或缩写(enduex)来指定状态动作类型。也可以使用逗号组合状态操作类型。例如,组合类型为进入持续的操作会在状态激活的时间步发生,只要状态保持激活状态,就会在随后的每个时间步发生。

梯度图包含状态中的动作:

Init - 当模拟开始时该状态处于活动状态,entry动作决定n的奇偶性,并将y设为false。当图表在一个时间步后离开初始状态时,退出动作将确定n是否等于 1。

Even - 当该状态激活时,以及在该状态激活期间的每个后续时间步,entryduring 组合动作会计算冰雹序列中下一个数字 n/2 的值和奇偶校验。

Odd - 当该状态激活时,以及在该状态激活后的每个时间步长内,entryduring的组合动作会检查n是否大于1,如果大于1,则计算冰雹序列中下一个数字3*n+1的数值和奇偶校验。

过渡标签类型

过渡标签定义了当活动状态发生变化时状态图会做什么。最常见的过渡标签类型是条件和条件动作:[条件]{动作}。

  • 条件是指定过渡是否发生的逻辑表达式。如果不指定条件,过渡将在初始状态激活后的一个时间步发生。

  • 条件操作是当提供过渡的条件为真时执行的指令。条件动作在条件之后执行,但在任何退出进入状态动作之前执行。

梯度图包含转场动作:

Init 中的默认转换 - 在模拟开始时,条件操作$n = u$ 将输入值 u 分配给本地数据 n

  • InitEven 的过渡 -$n2 == 0$ 条件指定当 n 为偶数时发生过渡。此过渡源中的数字 1 表示此过渡在 InitOdd 的过渡之前进行评估。

  • OddEven 的过渡 -$n2 == 0$ 条件指定当 n 为偶数时发生过渡。

  • 偶数过渡到奇数--条件$n2 ~= 0$ 规定,当 n 为奇数时,过渡发生。在这种情况下,$y = isequal(n,1)$ 条件的作用决定了 n 是否等于 1。

研究图表的行为

让我们模拟运行一个从数值 9 开始的冰雹序列。为此,请使用控制指令加载并运行模型collatz.engee

In [ ]:
modelName = "collatz";
model = modelName in [m.name for m in engee.get_all_models()] ? engee.open( modelName ) : engee.load( "$(@__DIR__)/$(modelName).engee");
In [ ]:
results = engee.run( modelName )
Out[0]:
SimulationResult(
    "n" => WorkspaceArray{Float64}("collatz/n")
,
    "y" => WorkspaceArray{Float64}("collatz/y")

)

让我们获取结果并研究图表的行为。

In [ ]:
res_n = results["n"].value;
res_t = results["n"].time;
In [ ]:
bar(res_t, res_n) 
Out[0]:

状态图 collatz_13_03_25_15_44_51.png

  • 在$t = 0$ 时,默认过渡到初始状态。过渡操作将 n 的值设置为 9。初始状态变为活动状态。条目中的操作会将初始值 n2 设为 1,将 y 设为 false。

  • 在时间$t = 1$ 时刻,n2 == 0 的条件未满足,因此图中准备过渡到奇数状态。Init 中的退出操作将 y 设置为 false。初始状态变为非活动状态,奇数状态变为活动状态。Odd 中的进入操作将 n 设置为 28,n2 设置为 0。

  • 在$t = 2$ 时,条件 n2 == 0 为真,因此图表准备过渡到 Even 状态。奇数状态变为非活动状态,偶数状态变为活动状态。进入偶数状态的操作将 n 设为 14,n2 设为 0。

  • 在$t = 3$ 时,条件 n2 ~= 0 未满足,因此图表没有过渡到其他状态。偶数状态保持激活。在偶数态期间的操作将 n 设为 7,n2 设为 1。

*$t = 4$ 期间条件 n2 ~= 0 为真,因此图表准备过渡到奇数状态。过渡操作将 y 设为 false。偶数状态变为非活动状态,奇数状态变为活动状态。进入奇数状态的动作将 n 设为 22,将 n2 设为 0。

  • 图继续计算冰雹序列,直到时间$t = 19$ 到达值$n = 1$ 。

  • 当$t = 20$ 运行时,图形准备从偶数状态过渡到奇数状态。过渡动作将 y 设为 true。偶数状态变为非活动状态,奇数状态变为活动状态。奇数状态下的进入操作不会改变 n 或 n2。

您也可以从建模环境中运行模型模拟。为此,请打开模型collatz.engee 并运行。然后您可以在 "图表 "窗口或 "数据检查器 "应用程序中查看模拟结果。

1.在右上角的 "应用程序 "选项卡上,转到 "数据检查器 "部分。

2.要查看冰雹序列值,请在 "数据检查器 "中选择记录的信号 n。

sc2.png

结论

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

示例中使用的块