Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Initial. ifRunthenRun := false else begin Run := true; schedule(Repeat, 0.0) end





Boolean Run;

Run:= false

Endi

event;

if Run then Run:= false else begin Run:= true; schedule(Repeat, 0.0) end

Ende

event Repeat;

out; if Run then schedule (Repeat, T)

Ende

endrout.

Событие Repeat планирует свое повторение только в том случае, если переменная Run имеет значение «истина» (true). Первоначально (в части initial) значение этой переменной установлено как «ложь» (false). Поэтому генератор не работает.

При получении сообщения (не важно какого) срабатывает входное событие, переключающее значение Run на «истину» и планирующее немедленно событие Repeat. Генератор начинает работать.

При поступлении следующего сообщения (опять не важно какого) вновь срабатывает входное событие. Но сейчас значение Run уже «истина» и тогда оно меняется на противоположное. Генератор прекращает работу. Третье сообщение вновь включает генератор, четвертое – вновь выключает и т.д.

Как видно из приведенных примеров, значения сообщений иногда не нужны, а, следовательно, можно обойтись без описания слоя сообщений. В других случаях достаточно предопределенных типов данных (integer, real, Boolean). Специального описания слоя сообщений также не требуется.

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

После описания структуры и рутин необходимо произвести наложение рутин на вершины графа, описывающего структуру. Делается это специальными операторами наложения, имеющими вид

routine(Node[i]):= Generator.

В нашем примере можно произвести наложение одной и той же рутины на все периферийные узлы:

for i:= 1 to n do

routine(System2.Node[i]):= Generator

endf.

При этом создается n экземпляров рутины Generator. Для каждого экземпляра рутины создается свой комплект локальных переменных. Программный код дублировать не обязательно. Дублирование программного кода может быть целесообразным в том случае, когда моделирование распределенной системы производится также в распределенном режиме. В том случае, если имитационная модель распределена по компьютерам кластера или в Grid, для балансировки нагрузки желательно сгенерировать несколько экземпляров программного кода, физически располагающихся на разных узлах кластера.

Важной особенностью языка Triad является возможность выполнения операций над моделями систем и, следовательно, возможность разработки алгоритмов, как исследования, так и синтеза моделей.

Одна из операций над структурой модели продемонстрирована, в частности, выше при описании структуры System2. Там использована операция «+» объединения графов. Могут использоваться операции добавления и удаления вершин, добавления и удаления ребер (ненаправленных связей между вершинами), добавления и удаления дуг (направленных связей между вершинами).

Например, соединение всех периферийных узлов модели System в кольцо осуществляется следующими операторами

for i:= 1 to n – 1 do

System:= System + (System.Node[i] «System.Node[i + 1])

endf;

System:= System + (System.Node[n] «System.Node[1])

В цикле к системе добавляются ребра между первым и вторым узлами, между вторым и третьим узлами, …, между предпоследним и последним узлами. Затем добавляется ребро между последним и первым узлами.

Точно такого же результата можно добиться более короткой записью:

System:= System + cycle(Node[1..n]).

Здесь cycle – графовая константа (простой цикл). После выполнения операции получается объединение звезды с простым циклом.

Возможны операции и над рутинами. Поскольку рутина представляет собой множество событий (событийных секций), в которых производится планирование других событий из этого же множества, рутина может быть представлена графом. В этом графе вершины – события, а дуги – операторы планирования событий.

Следовательно, добавление и удаление событий – добавление и удаление вершин; введение и исключение планирования – добавление и удаление дуг. Поэтому, система операций над структурами (графами) пригодна и для обозначения операций над рутинами. Например, удаление события можно записать так:

ControlledGenerator:= ControlledGenerator – Repeat;

При удалении события автоматически удаляются и все операторы планирования (schedule (Repeat, ·)), связанные с этим событием. Это, опять же, подобно тому, что происходит в графе при удалении вершины: удаляются все входящие в эту вершину дуги и все исходящие из этой вершины дуги.

На рисунке 9 графически изображена связь между событиями ei некоторой рутины. Около дуг, соответствующих операторам указано значение – второй параметр оператора, задающий период времени, через который должно произойти планируемое событие.

На рисунке 10 изображена та же рутина после удаления из нее события e 2.

 

Рис. 9

 

Рис. 10

 








Date: 2015-09-18; view: 443; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию