AOP_Tom1 (1021736), страница 81
Текст из файла (страница 81)
В приведенном ниже описании переменная Т1МЕ представляет текущее значение моделируемых часов. Все единицы времени даны в десятых долях секундм. Кроме того, в алгоритме используются другие переменные: РЬООЕ, текущее положение кабины лифта; 01„переменная, которая всегда равна нулю, за исключением промежутков времени, когда люди входят в лифт или выходят из него; 02, переменная, которая становится равной нулю, если лифт более 30 с находится на одном из этажей без движения; 03, переменная, которая всегда равна нулю, за исключением ситуации, когда двери открыты, но никто не входит в лифт и не выходит из него; ЯТАТЕ, текущее состояние лифта (601МСОР, 601МСООЫМ или МЕОТЕАЬ).
В исходном состоянии РЬООЕ = 2, 01 = 02 = 03 = О и ЯТАТЕ = МЕОТЕАЬ. Сопрограмма Ю (Пользователи) Каждый входящий в систему человек (т. е. тот, кто желает пользоваться лифтом) приступает к выполнению описанных ниже действий, начиная с шага 1)1. Ш. [Вход в систему, ожидание следующего человека.] Перечисленные ниже величины легко определить, но эти определения здесь не приводятся. 1И, этаж, на котором следующий человек входит в систему; СОТ, этаж, на который этот человек хочет попасть (СОТ ф 1М); 61ЧЕОРТ1ИЕ, максимальное время ожидания человеком лифта, после которого его терпение исчерпывается н он решает воспользоваться лестницей; 1МТЕКТ1ИЕ, время до прихода другого человека. После вычисления этих величин программа моделирования работы лифта организует весь процесс так, что следующий человек подходит к лифту в момент ТХМЕ + ХМТЕКТХМЕ.
ХХ2. [Получение сигнала и ожидание.) (Назначение этого шага заключается в вызове лифта; особые ситуации могут возникнуть, если лифт уже находится на нужном этаже.) Если РЕООК = 1М н если следующее действие заключается в выполнении описанного ниже шага Е6 (т. е. если двери лифта закрываются), нужно указать лифту яа переход к шагу ЕЗ и отменить выполнение шага Еб.
(Это значит, что двери откроются снова, прежде чем лифт начнет движение.) Если РЕООК = 1М и 03 ф О, установить ОЗ < — О, установить ненулевое значение для 01 и снова перейти к выполнению шага Е4. (Это значит, что двери лифта откроются на том же этаже, но кто-то вошел или вышел. На шаге Е4 людям предоставляется возможность входить в лифт в соответствии с обычными правилами хорошего тона. Следовательно, повторное возвращение к шагу Е4 позволяет человеку войти в лифт до закрытия дверей.) Во всех других случаях человек устанавливает САЬЕОР[1М) с — 1 или САХ.Х.ООУМ[ХМ) ~- 1, а также СОТ > ХМ илн СОТ ( 1И. Если же 02 = О или лифт находится в состоянии "спячки" Е1, то выполняется указанная ниже подпрограмма ОЕСХЯХОМ.
(Подпрограмма ОЕСХЯХОМ испальзуетгя для вывода лифта из нейтрального состояния (МЕОТКАЕ) в некоторые критические моменты.) ХХЗ. (Вход в очередь.] Поместить человека в конец линейного списка ЦОЕОЕ [ХМ), представляющего людей, которые ожидают лифта на том же этаже. Теперь человек должен терпеливо ожидать прихода лифта в течение времени 01ЧЕОРТ1МЕ, а точнее — до тех пор, пока на шаге Е4 программы будет совершен переход к шагу В5 и отменен запланированный шаг В4. Х14. [Отказ от длительного ожидания.] Если РЕООК ф 1М или 01 = О, удалить человека из списка ЦОЕОЕ[1М) и из всей системы моделирования. (Человек решил, что лифт работает очень медленно или что небольшое физическое упражнение в виде ходьбы по лестнице все же лучше, чем езда на лифте.) Если РЕООК = 1М и 01 ~ О, человек продолжает ждать (зная, что ожидание в этом случае не будет очень долгим во время выхода и входа других людей).
ХХ5. [Вход в лифт.] Пользователь покидает список ЦОЕОЕ[ХМ3 и входит в лифт, т. е. список Е1ЕЧАТОК со структурой стека, который представляет людей в кабине лифта. Установить САХА.САК[ООТ) +- 1. Теперь, если ЯТАТЕ = ИЕОТКАХ., установить значение БТАТЕ ~- 001МООР или СОХИОООУМ и перейти к шагу Е5 через 25 единиц времени. (Эта особенность предусмотрена для того, чтобы двери могли закрыться быстрее, чем обычно, если в момент выбора человеком этажа назначения лифт находится в нейтральном состоянии.
Такой временной интервал длиной 25 единиц предоставляет воз- можность на шаге Е4 убедиться в том, что значение переменной 01 правильно установлено к моменту выполнения шага Е5, т. е. когда закрываются двери.) Теперь человек ожидает момента перехода к выпачнению шага Еб по окончании шага Е4, когда лифт достигнет нужного этажа. 116. [Выход из лифта.) Удалить пользователя из списка ЕЬЕЧАТОЕ и из системы моделирования. А Сопрограмма Е (Лифт), Эта сопрограмма представляет действия лифта; на шаге Е4 также контролируется процесс входа людей в лифт и выхода из него.
Е1. [Ожидание вызова.] (В этом случае лифт находится на этаже 2 с закрытыми дверями в состоянии ожидания.) Если кто-нибудь нажмет кнопку, подпрограмма ОЕС131ОМ совершит переход к шагу ЕЗ или Еб. В противном случае лифт находится в состоянии ожидания. Е2. [Изменение состояния?] Если ЯТАТЕ = 601МООР и САЬЬОР[1] = САЬЬООММ[у] = САЬЬСАЕ[1] = 0 для всех 1 > РЬООК, то следует установить ЯТАТЕ < — МЕОТЕАЬ или ЯТАТЕ < — ОО1МОООММ в зависимости от того, выполняется ли условие САЬЬСАК[1] = О для всех 1 ( РЬООК, и установить все переменные САЬЬ для текущего этажа равными нулю. Если ЯТАТЕ = 601МОООММ, то необходимо выполнить те же действия, но в обратном порядке.
ЕЗ. [Открытие дверей.] Задать для 01 и 02 любые ненулевые значения. По прошествии 300 единиц времени независимо выполнить шаг Е9. (Эти действия могут быть отменены на шаге Е6 до того, как они произойдут. Если они уже запланированы и не отменены, онн отменяются и перепланируются.) Также независимо следует выполнить действия лифта на шаге Е5 по прошествии 76 единиц времени. Затем следует подождать 20 единиц времени (для моделирования открытия дверей) и перейти к шагу Е4.
Е4. [Выход нз лифта и вход в него людей.] Если для каких-то людей из списка ЕЬЕЧАТОЕ выполняется равенство СОТ = РЬООЕ, то последнему зашедшему в лифт следует перейти к шагу Пб, подождать на протяжении 25 единиц времени и повторить шаг Е4.
Если таких людей нет, но список ЦОЕОЕ [РЬООЕ] не пуст, самому первому в списке следует немедленно перейти к шагу П5 вместо шага Ь4, подождать в течение 25 единиц и повторить шаг Е4. А если список ЦОЕОЕ[РЬООЕ] пуст, установить 01 +- О, установить 03 не равным нулю и подождать, пока какие-нибудь другие действия не вызовут продолжение выполнения алгоритма. (Действия на шаге Е5 перенаправят нас к шагу Еб или действия на шаге П2 приведут к повторному переходу к шагу Е4.) Е5. [Закрытие дверей.) Если 01 ф О, подождать в течение 40 единиц и повторить данный шаг (двери при этом могут вздрогнуть, но вернуться в прежнее открытое положение, так как кто-то все еще входит или выходит). В противном случае установить 03 ч- 0 и перейти к шагу Е6 через 20 единиц времени. (Так моделируется закрытие дверей после того, как все войдут в лифт или выйдут из него. Но если в ходе этого процесса на площадке перед лифтом на том же этаже появится новый человек, двери вновь откроются, как указано на шаге П2.) Е6.
[Подготовкак движению.] Установить переменную САЬЬСАМ[РЬООЕ] равной нулю; установить равной нулю переменную САЬЬОР[РЬООЕ], если ЯТАТЕ 601МСООММ, а также установить равной нулю переменную САЬЬООЫМ [РЬООЕ], если ЯТАТЕ ф 601861/Р.' (Замечание.
Если ЯТАТЕ = 601МСОР, лифт не сбрасывает значение САЬЬООММ, так как предполагается, что люди, которым нужно ехать вниз, еще не вошли в него; см, упр, 6.) Теперь следует выполнить подпрограмму ОЕС1810М. Если ЯТАТЕ = МЕОТЕАЬ даже после выполнения подпрограммы ОЕС181ОМ, то следует перейти к шагу Е1. В противном случае, если 02 ф О, необходимо отменить действия лифта на шаге Е9.
Наконец, если ЯТАТЕ = 601МСОР, подождать в течение 15 единиц времени (чтобы лифт ускорился) и перейти к шагу Е7; если ЯТАТЕ = 601МСООММ, подождать в течение 15 единиц времени и перейти к шагу Е8. ЕТ. [Подъем на этаж.] Установить РЬООЕ -.— Р1.008+ 1 н подождать в течение 51 еДиницы времени. Если теперь САЬЬСАЕ[РЬООЕ] = 1 или САЬЬОР[РЬООМ] = 1 нли если [(РЬООМ = 2 или САЬЬРОММ[РЬООЕ] = 1) н САЬЬОР[у] = САЬЬООММ[]] = САЬЬСАЕ[]] = 0 для всех ] > РЬООЕ), подождать в течение 14 единиц времени (чтобы лифт притормозил) н перейти к шагу Е2. В противном случае повторить данный шаг.
Е8. [Спуск на этаж.) Этот швг подобен шагу Е?, если поменять направление движения, а временные интервалы длительностью 51 и 14 единиц заменить интервалами длительностью 61 и 23 единицы соответственно. (На спуск лифту требуется больше времени, чем на подъем.) Е9. [Установка индикатора бездействия.] Установить 02 < — О и выполнить подпрс грамму ОЕС1810М.
(Это независимое действие инициируется на шаге ЕЗ, но оно почти всегда отменяется на шаге Е6. См. упр. 4.) 1 Подпрограмма 1] (Подпрограмма ОЕС1Я10М). Как указано в приведенных выше сопрограммах, зта подпрограмма выполняется в критические моменты времени, когда должно быть принято решение о выборе направления движения. Ш. [Необходимо ли принять решение?) Если ЯТАТЕ ф МЕОТМАЬ, выйти из этой подпрограммы. 1]2.
[Следует ли открыть двери лифта?] Если лифт находится на стадии выполнения действий шага Е1 и если САЬЬОР [2], САЬЬСАМ [2] и САЬЬООММ [2] не равны нулю, то нужно после паузы длиной 20 единиц времени перейти к шагу ЕЗ, а затем выйти из этой подпрограммы, (Если в данный момент подпрограмма ОЕС1810М вызывается во время выполнения некоторых независимых действий на шаге Е9, то сопрограмма лифта может перейти к шагу Е1.) ]ЗЗ.