AOP_Tom1 (1021736), страница 82
Текст из файла (страница 82)
[Есть ли вызовы?) Найти наименьшее значение у ф РЬООЕ, для которого САЬЬОР []], САЬЬСАЕ[у] или САЬЬООММ[]] не равно нулю, н перейти к шагу ]]4. Но если такое значение у отсутствует, следует установить | < — 2, если в данный момент подпрограмма ОЕС181ОМ вызывается на шаге Еб; в противном случае следует выйти из подпрограммы. 1]4.
[Изменение состояния.) Если РЬООМ > у, установить ЯТАТЕ < — 601МСООММ; если РЬООЕ ( ], установить ЯТАТЕ е- 601МСОР. Рб. (Лифт ожидает?) Если сопрограмма лифта находится на шаге Е1 и у ф 2, то по прошествии 20 единиц времени перевести лифт к шагу Еб. Выйти из подпрограммы. 1 Эта модель работы лифта гораздо сложнее других описанных выше алгоритмов, но взятый из повседневной жизни пример более типичен для задач моделирования, чем любой состряпанный на скорую руку "учебный пример".
Для понимания принципа работы такого лифта рассмотрим табл. 1, которая представляет собой фрагмент одной из многих попыток моделирования. Вероятно, проще всего начать с проверки простого случая, например с момента 4257, лифт находится в состоянии покоя на этаже 2 с закрытыми дверями во время появления человека по имени Дон (в момент 4334). Две секунды спустя двери открываются и Дон входит в кабину лифта еще через две, секунды. Нажав кнопку "3", он отправляет лифт вверх и наконец выходит на этаже 3, а лифт возвращается на этаж 2.
В первых строках табл. 1 показан более драматичный сценарий: человек вызывает лифт на цокольный этаж, но не дожидается его и уходит спустя 15,2 с. Лифт останавливается на цокольном этаже, но, так как там никого нет, направляется на этаж 4, поскольку несколько вызовов поступило со стороны людей, которые направляются вниз. Программирование этой модели работы лифта для некоторого компьютера (в данном случае для компьютера МХХ) заслуживает внимательного изучения. В любой момент в системе может существовать большое количество моделируемых людей (которые могут находиться в разных очередях, причем они могут не дождаться лифта и уйти в любое время). Кроме того, если сразу несколько человек пытается выйти из кабины лифта во время закрытия дверей, может получиться так, что действия, предусмотренные шагами Е4, Еб и Е9, будут выполняться одновременно. Течение времени и управление "одновременным' выполнением может быть запрограммировано в результате представления каждого элемента модели некоторым узлом, содержащим поле МЕХТТ1МЕ (в нем указывается, когда выполняется следующее действие этого элемента) и поле МЕХТ1МЯТ (в нем хранится адрес, по которому данный элемент начинает выполнять команды аналогично ссылке для обычной сопрограммы).
Каждый элемент ожидает наступления следующего момента в дважды связанном списке ЧА1Т. Так как этот "список действий" сортируется по полю МЕХТТ1МЕ, все действия будут обработаны в правильной последовательности моделируемых моментов. В программе также используются дважды связанные списки ЕЬЕЧАТОЕ и ЦУЕУЕ. Каждый узел, представляющий некоторое действие (т. е. действие человека или лифта), имеет следующий вид: йвкчвП) вьечатов Рнс. 12. Некоторые списки из программы моделирования работы лифта (Заголовки списков указаны слева ) Здесь ЕЕ1МК1 н ЕЕ1ИК1 †свя в списке ИА1Т, а ЕЕ1ИК2 и ЕЕ1ИК2 †свя в списках ЦОЕОЕ и ЕЕЕЧАТОЕ Последние два поля, а также поля 1И и ООТ в структуре (6) относятся к узлу, который представляет человека, и не имеют никакого отношения к узлу, представляющему лифт.
Третье слово этого узла на самом деле является командой "3МР" на языке компьютера И1Х На рис. 12 показано типичное содержимое списков ИА1Т, ЕЕЕЧАТОЕ и одного из списков ЦОЕОЕ Каждый узел в списке ЦОЕОЕ одновременно находится в списке ИА1Т со значением МЕХТ1ИБТ = П4, но это не отражено на данном рисунке, поскольку сложность всех взаимосвязей может помешать читателю понять основную идею. Теперь рассмотрим саму программу.
Она довольна большая, но делится на несколько малых частей (как это обычно бывает со всеми большими программами), каждая нз которых выглядит достаточно просто Сначала идет некоторое количество строк кода с определением начального содержания таблиц. Рассмотрим наиболее интересные из них, а именно — заголовки списка ИА1Т (строки 010 н 011), списка ЦОЕОЕ (строки 026 и 031) и списка Е1.ЕЧАТОЕ (строки 032 — 033). Каждый из них является узлом со структурой (6), в которой удалены ненужные слова Заголовок списка ИА1Т содержит только два первых слова узла, а заголовкам спигков ЦОЕОЕ и Е1ЕЧАТОЯ требуется только последнее слово узла. Кроме того, имеются четыре узла, которые всегда присутствуют в данной модели (строки 012 †0): узел ОБЕЕ1, который всегда представляет шаг П1, подготовку к появлению в системе нового человека; узел ЕЕЕЧ1, который управляет основными действиями лифта на шагах Е1 — Е4, Е6 — ЕВ, а также узлы ЕЕЕЧ2 и ЕЕЕЧ3, которые используются для действий лифта на шагах Е5 и ЕО, которые выполняются независимо от других действий лифта относительно моделируемой шкалы времени.
Каждый из этих четырех узлов содержит только три слова, так как они никогда не бупут входить в состав списков ЦПЕОЕ и Е].ЕЧАТОВ. Узлы, представляющие деятельность людей, будут находиться в пуле после основной программы. 001 002 003 004 005 006 007 006 «МОДЕЛЬ 1И ЫТМК1 В11ИК1 ИЕХТТИЗТ ООТ ЫТИК2 Ы.1ИК2 РАБОТЫ ЛИФТА ЕОП 1:1 ЕОП 2:3 ЕОО 4:5 ЕОП О:г ЕОО 1:1 ЕОО 2:3 ЕОП 4:5 Определение полей внутри узлов. 000 «ТАБЛ РАЗМЕРА И ЗАГОЛОВКИ СПИСКОВ .««2(Ы.ТМК1) Заголовок списка ЧА1Т, где всегда ИЕХТТ1ИЕ = О. ,«-2(Ы.1ИК1) Это узел действия (И, сначала только он находится в списке ЧА1Т. Этот узел представляет действия лифта, кроме действий на шагах Е5 и Е9. Этот узел представляет независимые действия лифта на шаге Е5. Этот узел представляет независимые действия лифта на шаге Е9.
Связь со свободными узлами. Текущее время моделирования, 010 МАТТ 011 012 013 014 015 О!6 017 016 ЕАЕЧ1 ЕЬЕЧ2 Заголовок списка ПОБОЕ[0]. Заголовок списка ПОКОЕ[П. Сначала все очереди пусты. Заголовок списка ОЧЕСЕ[4). «"3(В11МК2) ° "3(В51ИК2) «-3(Е51ИК2) «"3(Ы.1ИК2) ° -3(Ы.1ИК2) > "Дополнение" нулями таблицы САЫ (см строки 178-181). Индикация открытых дверей, активное состояние. 019 020 021 022 022 024 025 026 027 020 020 020 021 032 022 024 020 Обб 067 026 020 040 041 042 042 044 046 046 047 ЕЬЕЧЗ АЧА11 11МЕ ООЕПЕ П.ЕЧАТ САЫ 01 ИПМ ФИК СОИ СОМ СОМ СОИ ЛМР СОМ СОМ ЛМР СОИ СОИ ЛИР СОИ СОМ ЛИР СОИ СОМ КОО СОИ СОИ СОМ СОИ СОИ ОВ ЕРО СОМ СОИ СОИ СОИ СОМ СОМ СОИ СОИ СОИ СОМ СОИ СОИ СОМ СОМ СОМ СИРОВАННОГО ««2ИЛ.1ИК1) 0 ° -2(ььТИК1) 0 01 0 0 Е1 0 0 Е5 0 0 Е9 О О «-3 «-З(ЫТИКг) «-3(ЫХИК2) «-3(ЫТИК2) ° "З(Ы1ИК2) «-З(Л.ТИК2) 3 «-3(Ы1ИК2) О 0 0 О О 0 0 0 О 0 0 о 0 0 > «-3(В11МК2) Заголовок списка Е5ЕЧАТОВ.
"Дополнение" нулями таблицы СА1Л. (см. строки 183-185). САШ)Р [О), САЫСАВ [0), САЫПОЧИ [0) СИ.10Р [1), СЯЛ.САВ [1), СА1100ЧИ [1) САШ)Р[2], САЫСАВ[2], САЫООЧИ[2] САШ)Р[З), САЫСАВ[З], САЫООЧМ[З] САЫОР [4), САЫСАВ [4], САЫООЧИ [4] Индикация состояния бездействия. Индикация открытых дверей, активное состояние $ 04 В 02 040 03 СОИ О СОИ О Следующая часть программы содержит основные подпрограммы и главные управляющие процедуры процесса люделирования. Подпрограммы 1НЯЕНТ и ОЕЬЕТЕ выполняют типичные манипуляции дважды связанными списками. Они помещают текущий узел в список ЦОЕОЕ или ЕЬЕЧАТОЕ либо извлекают его из этих списков.
(В программе "текущий узел" С всегда представлен индексным регистром 6.) Для работы со списком МАТТ также предусмотрены некоторые подпрограммы. Так, подпрограмма БОНТ1И помещает текущий узел в список НА1Т, сортируя его по полю ИЕХТТ1МЕ. А подпрограмма 1ММЕО вставляет текущий узел в середину списка НАХТ. Подпрограмма НОВО помещает текущий узел в список ИА1Т, причем значение поля ИЕХТТ1МЕ равно текущему времени плюс значение регистра А. Подпрограмма ОЕЬЕТЕН удаляет текущий узел из списка ЫА1Т.
Процедура СУСЬЕ является сердцевиной модели управления, поскольку именно она определяет, какое действие будет выполнено дальше (а именно — первый элемент списка ЧА1Т, который, как нам теперь известно, не пуст), и переходит к его выполнению. Существует два особых входа в процедуру СУСЬЕ; во-первых, СУСЬЕ1 устачавливает значение ИЕХТ1ИБТ в текущем узле, а во-вторых, НОЬОС выполняет то же самое с дополнительным вызовом подпрограммы НОЬО. Таким образом, результат выполнения команды ьбМР НОЬОС" со значением 1 в регистре А будет заключаться в приостановке действий на 1 Ециниц по моделируемой шкале врЕМЕНи С ПЕРЕХОДОМ в дальнейшем к следующему адресу.
050 ь ПОДПРОГРАММЫ И ПРОЦЕДУРА 051 1И5ЕЕТ ЗТ1 9Р 055 002 3,1(ЬЬТИК2) 055 БТ2 3,6(ЬЬТИК2) 054 ЗТб 3,1(ЬЬТИК2) 055 БТб 3,2(ЕЬТИК2) 056 ЗТ1 3,6(51.1ИК2) 057 9Н )МР ь 05В ОЕЬЕТЕ 5Т1 9Р 050 Ь01 3,6(ЬЬТИК2) 060 002 З,б(ЕЬ1ИК2) 061 БТ1 3,2(ЬЬТИК2) 065 5Т2 3,1(ЕЬТИК2) Обб 9Н 1МР ь 064 1ММЕО БТ1 9Р 065 1.0А Т1МЕ 066 ЗТА 1,6 067 ЕИТ1 ЧА1Т 06В 1МР 2Р Обб НОЬО А00 ТТМЕ 070 ЗОЕТ1И БТ1 9Р 071 БТА 1,6 075 ЕНТ1 ИА1Т 075 001 0,1(ЬЬТИК1) 071 СИРА 1,1 УПРАВЛЕНИЯ Вставить ИООЕ(С) слева от ПОПЕ(г11).
г12 ~- ЬЬ1ИК2(г11). ЬЬТИК2(С) +- г12, ЬЬТИК2(г)1) +- С. ЕЬ1ИК2(г12) +- С. Е1.1ИК2(С) +- г11. Выйти из подпрограммы. Удалить ИООЕ(С) из списка. Р +- ЬЬХИК2(С) Ц < — Е1.1ИК2(С), ЬЬТИК2(Ц) э- Р. К1.1ИК2(Р) 4- Ц Выйти из подпрограммы. Вставить ИООЕ(С) в начале списка НА1Т.
Установить ИЕХТТ1МЕ(С) <- Т1МЕ. Р <- ЬОС(ЦАП) Вставить ИООЕ(С) справа от ИООЕ(Р). гА с — Т1НЕ+ гА. Рассортировать ИООЕ(С) в списке НА1Т. Установить ИЕХТТ1МЕ(С) +- гА. Р +- ЬОС(ИА1Т) Р ~- Ь1.1ИК1(Р) Сравнить значения в полях ИЕХТТ1МЕ слева направо. 075 11 к-2 Установить МЕХТ1МБТ(С) <- гЛ, Т1НЕ <- МЕХТТ1НЕ(С). Удалить МООЕ(С) из списка МАТТ. Перейти к МЕХТ1МБТ(С). $ Теперь рассмотрим код сопрограммы В. В начале шага ВЕ текущим узлом С является узел ОЗЕН1 (см. выше строки 012 — 014) и указанные в строках 099 и 100 действия повторно помещают человека ОЗЕН1 в список МА1Т так, что следующий человек появится в системе спустя 1МТЕНТ1НЕ единиц времени.