使用状态操作和过渡标签定义图表行为
状态操作和转换操作分别是您在状态内部或转换期间编写的指令,用于确定建模期间关系图的行为。
让我们考虑一个具有有限自动机的模型,该模型凭经验验证了[Collatz假设]的变体之一(https://ru.wikipedia.org/wiki/The Collatz假设)。 对于给定的数字输入 图计算Collatz序列 通过重复规则:
*如果 甚至,然后
*如果 如果是奇数,那么
Collatz假设指出,对于每个自然数,都有一个数字序列最终减少到一个。
该图由三种状态组成。 在模拟开始时,Init状态通过设置初始化图表数据:
*本地数据n对应于输入值u。
*本地数据n2除以n2时转换为余数。
*输出数据y设置为false
根据输入数据的奇偶校验,图切换到偶数或奇数状态。 当状态活动在偶数和奇数状态之间切换时,该图按顺序计算数字。 当冰雹序列达到值1时,输出数据y变为true,仿真停止。
国家行动的类型
状态操作确定状态图在状态处于活动状态时执行的操作。 最常见的状态操作类型是entry、during和exit:
*条目-当状态变为活动状态时发生操作。
*during-动作发生在状态已经处于活动状态的时间步长,并且关系图不会从此状态移动。
*exit-图表退出此状态时会发生操作。
您可以使用完整关键字(entry,during,exit)或缩写(en,du,ex)指定状态操作的类型。 您还可以使用逗号组合状态操作的类型。 例如,具有组合类型entry,during的操作发生在状态变为活动状态时的时间步长,以及状态保持活动状态时的每个后续时间步长。
冰雹图包含状态中的操作:
Init-当此状态在模拟开始时变为活动状态时,entry操作确定n的奇偶校验并将y设置为false*。 当图表在一个时间步骤后退出Init状态时,exit操作确定n是否等于一。
Even-当此状态变为活动状态时,并且在该状态为活动状态时的每个后续时间步,组合的条目*,期间动作计算冰雹序列中下一个数字的值和奇偶校验,n/2。
Odd-当此状态变为活动时,并且在该状态为活动时的每个后续时间步,组合的条目*,期间动作检查n值是否大于一,如果是,则计算冰雹序列中下一个数字的值和奇偶校验是3*n+1。
过渡标签的类型
转换标签定义了活动状态更改时状态图的作用。 最常见的转换标签类型是条件和基于条件的操作:[Condition]{Action}。
*条件是确定是否正在发生转换的逻辑表达式。 如果不指定条件,则转换将在初始状态变为活动状态后的一个时间步长内发生。
*条件操作是当提供转换的条件为真时执行的指令。 条件操作在条件之后执行,但在任何退出或进入状态操作之前执行。
冰雹图包含对转换的操作:
*默认过渡到Init—在模拟开始时,应用条件 将输入值u赋给本地数据n。
*从Init切换到Even是一个条件 确定当n为偶数时发生转换。 此转换源中的数字1表示在Init转换到Odd之前评估此转换。
*从奇数切换到偶数是一个条件 确定当n为偶数时发生转换。
*从偶数到奇数的过渡是一个条件 确定当n为奇数时发生转变。 在这种情况下,条件适用 确定n是否等于1。
研究图的行为
让我们对从值9开始的冰雹序列运行一个模拟。 为此,请使用command control加载并运行模型。 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)
状态图

*在时间的那一刻 默认状态是Init。 过渡操作将n的值设置为9。 Init状态变为活动状态。 Entry中的操作将N2的Init值设置为1,将y设置为false。
*在时间的那一刻 条件n2==0未满足,因此图正准备切换到奇数。 Init中的退出操作将y设置为false。 Init状态变为非活动状态,奇数状态变为活动状态。 奇数集合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 然后运行它。 接下来,您可以在Graphs窗口或Data Inspector应用程序中查看仿真结果。
-
在右上角的"应用程序"选项卡上,转到"数据检查器"部分。
-
要查看冰雹序列的值,请在数据检查器中选择记录的信号n。
结论
"冰雹"的序列在19次迭代后达到1的值。 您也可以尝试其他数字。