Документация 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$

Гипотеза Коллатца утверждает, что для каждого натурального числа существует последовательность чисел, которая в конечном итоге сводится к единице.

Диаграмма состоит из трёх состояний. В начале моделирования состояние Init инициализирует данные диаграммы, устанавливая:

  • Локальные данные n соответствуют входному значению u.
  • Локальные данные n2 преобразуются в остаток при делении n на 2.
  • Выходные данные y устанавливаются false

В зависимости от четности входных данных диаграмма переходит либо в Even, либо в Odd состояние. По мере того как активность состояния переключается между Even и Odd состояниями, диаграмма вычисляет числа в последовательности. Когда последовательность чисел-градин достигает значения 1, выходные данные y становятся true и моделирование останавливается.

Типы действий состояния

Действия состояния определяют, что делает диаграмма состояний, пока состояние активно. Наиболее распространёнными типами действий состояния являются entry, during и exit:

  • entry - действия происходят, когда состояние становится активным.

  • during - действия происходят на временном шаге, когда состояние уже активно, и диаграмма не переходит из этого состояния.

  • exit - действия происходят, когда диаграмма выходит из этого состояния.

Вы можете указать тип действия состояния, используя полное ключевое слово (entry, during, exit) или сокращение (en, du, ex). Вы также можете комбинировать типы действий состояния, используя запятые. Например, действие с комбинированным типом entry, during происходит на временном шаге, когда состояние становится активным, и на каждом последующем временном шаге, пока состояние остается активным.

Диаграмма градин содержит действия в состояниях:

  • Init — когда это состояние становится активным в начале симуляции, entry действие определяет чётность n и устанавливает y в false. Когда диаграмма выходит из состояния Init после одного шага времени, exit действие определяет, равно ли n единице.

  • Even — когда это состояние становится активным, и на каждом последующем временном шаге, пока состояние активно, комбинированное entry, during действие вычисляет значение и чётность для следующего числа в последовательности градин, n/2.

  • Odd — Когда это состояние становится активным, и на каждом последующем временном шаге, пока состояние активно, комбинированное entry, during действие проверяет, больше ли n значение, чем единица, и, если это так, вычисляет значение и чётность для следующего числа в последовательности градин, 3*n+1.

Типы меток перехода

Метки переходов определяют, что делает диаграмма состояний при изменении активного состояния. Наиболее распространёнными типами меток переходов являются условия и действия по условиям: [Условие]{Действие}.

  • Условие - это логическое выражение, определяющее, происходит ли переход. Если вы не укажете условие, переход произойдёт через один временной шаг после того, как исходное состояние станет активным.

  • Действие по условию - это инструкция, которая выполняется, когда условие, обеспечивающее переход, истинно. Действие при условии выполняется после условия, но до любых exit или entry действий состояния.

Диаграмма градин содержит действия над переходами:

  • Переход по умолчанию в Init — в начале моделирования действие условия $n = u$ присваивает входное значение u локальным данным n.

  • Переход из Init в Even — условие $n2 == 0$ определяет, что переход происходит, когда n является четным. Число 1 в источнике этого перехода указывает на то, что этот переход оценивается до перехода Init в Odd.

  • Переход от Odd к Even — условие $n2 == 0$ определяет, что переход происходит, когда n является чётным.

  • Переход от Even к Odd — условие $n2 ~= 0$ определяет, что переход происходит, когда n является нечётным. В этом случае действие условия $y = isequal(n,1)$ определяет, равно ли n единице.

Изучите поведение диаграммы

Проведем моделирование для последовательности выпадения градин, начинающейся со значения 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$ происходит переход по умолчанию в состояние Init. Действие перехода устанавливает значение n равным 9. Состояние Init становится активным. Действия в entry устанавливают Init значение n2 равным 1 и y значению false.

  • В момент времени $t = 1$ условие n2 == 0 не выполняется, поэтому диаграмма готовится к переходу в Odd. Действие exit в Init устанавливает y значение false. Состояние Init становится неактивным, а состояние Odd становится активным. Действие entry в Odd устанавливает n в 28 и n2 в 0.

  • В момент времени $t = 2$ условие n2 == 0 истинно, поэтому диаграмма готовится к переходу в Even. Состояние Odd становится неактивным, а состояние Even становится активным. Действие входа в Even устанавливает n равным 14, а n2 равным 0.

  • В момент времени $t = 3$ условие n2 ~= 0 не выполняется, поэтому диаграмма не переходит в другое состояние. Состояние Even остается активным. Действие в during наборе Even устанавливает n значение 7 и n2 значение 1.

  • Во время $t = 4$ условие n2 ~= 0 истинно, поэтому диаграмма готовится к переходу в Odd. Действие перехода устанавливает y в значение false. Состояние Even становится неактивным, а состояние Odd становится активным. Действия entry в Odd устанавливают n в значение 22 и n2 в значение 0.

  • График продолжает вычислять последовательность градин до тех пор, пока не достигнет значения $n = 1$ в момент времени $t = 19$.

  • Во время работы $t = 20$ диаграмма готовится к переходу с Even в Odd. Действие перехода устанавливает y в true. Состояние Even становится неактивным, а состояние Odd становится активным. Действия entry в Odd не изменяют n или n2.

Также запустить симуляцию модели можно из среды моделирования. Для этого откройте модель collatz.engee и запустите ее. Далее вы можете посмотреть на результат моделирования в окне "Графики" или в приложении "Инспектор данных".

  1. На вкладке «Приложения» в верхнем правом углу перейдите в раздел «Инспектор данных».

  2. Чтобы увидеть значения последовательности градин, в инспекторе данных выберите записанный сигнал n.

sc2.png

Вывод

Последовательность «градин» достигает значения 1 после 19 итераций. Вы также можете провести эксперимент с другими числами.

Блоки, использованные в примере