Анимация
JavaScript
|
Главная Библионтека IN, этаж, на котором следующий человек входит в систему; OUT, этаж, на который этот человек хочет попасть (OUT ф IN); GIVEUPTIME, максимальное время ожидания человеком лифта, после которого его терпение исчерпывается и он решает воспользоваться лестницей; INTERTIME, время до прихода другого человека. После вычисления этих величин программа моделирования работы лифта организует весь процесс так, что следующий человек подходит к лифту в момент TIME +INTERTIME. U2. [Получение сигнала и ожидание.] (Назначение этого шага заключается в вызове лифта; особые ситуации могут возникнуть, если лифт уже находится на нужном этаже.) Если FLOOR = IN и если следующее действие заключается в выполнении описанного ниже шага Е6 (т. е. если двери лифта закрываются), нужно указать лифту на переход к шагу ЕЗ и отменить выполнение шага Е6. (Это значит, что двери откроются снова, прежде чем лифт начнет движение.) Если FLOOR = IN и D3 О, установить D3 +- О, установить ненулевое значение для D1 и снова перейти к вьшолнению шага Е4. (Это значит, что двери лифта откроются на том же этаже, но кто-то вошел или вышел. На шаге Е4 людям предоставляется возможность входить в лифт в соответствии с обычными правилами хорошего тона. Следовательно, повторное возвращение к шагу Е4 позволяет человеку войти в лифт до закрытия дверей.) Во всех других случаях человек устанавливает GALLUP [IN] (- 1 или CALLDOWN[IN] •(- 1, а также OUT > IN или OUT < IN. Если же D2 = О или лифт находится в состоянии "спячки" Е1, то выполняется указанная ниже подпрограмма DECISION. (Подпрограмма DECISION используется для вывода лифта из нейтрального состояния (NEUTRAL) в некоторые критические моменты.) из. [Вход в Очередь.] Поместить человека в конец линейного списка QUEUE [IN], представляющего людей, которые ожидают лифта на том же этаже. Теперь человек должен терпеливо ожидать прихода лифта в течение времени GIVEUPTIME, а точнее - до тех пор, пока на шаге Е4 программы будет совершен переход к шагу U5 и отменен запланированный шаг U4. U4. [Отказ от длительного ожидания.] Если FLOOR Ф IN или D1 - О, удалить человека из списка QUEUE [IN] и из всей системы моделирования. (Человек решил, что лифт работает очень медленно или что небольшое физическое упражнение в виде ходьбы по лестнице все же лучше, чем езда на лифте.) Если FLOOR = IN и Dl О, человек продолжает ждать (зная, что ожидание в этом случае не будет очень долгим во время выхода и входа других людей). U5. [Вход в лифт.] Пользователь покидает список QUEUE [IN] и входит в лифт, т. е. список ELEVATOR со структурой стека, который представляет людей в кабине лифта. Установить CALLCAR[OUT] •(- 1. Теперь, если STATE = NEUTRAL, установить значение STATE (- GOINGUP или GOINGDOWN и перейти к шагу Е5 через 25 единиц времени. (Эта особенность предусмотрена для того, чтобы двери могли закрыться быстрее, чем обычно, если в момент выбора человеком этажа назначения лифт находится в нейтральном состоянии. Такой временной интервал длиной 25 единиц предоставляет воз- можность на шаге Е4 убедиться в том, что значение переменной D1 правильно установлено к моменту вьтолнения шага Е5, т. е. когда закрываются двери.) Теперь челдвек ожидает момента перехода к выполнению шага U6 по окончании шага Е4, когда лифт достигнет нужного этажа. U6. [Выход из лифта.] Удалить пользователя из списка ELEVATOR и из системы моделирования. Сопрограмма Е (Лифт). Эта сопрограмма представляет действия лифта; на шаге Е4 также контролируется процесс входа людей в лифт и выхода из него. Е1. [Ожидание вызова.] (В этом случае лифт находится на этаже 2 с закрытыми дверями в состоянии ожидания.) Если кто-нибудь нажмет кнопку, подпрограмма DECISION совершит переход к шагу ЕЗ или Е6. В противном случае лифт находится в состоянии ожидания. Е2. [Изменение состояния?] Если STATE = GOINGUP и GALLUP [j] = CALLDOWN[j] = CALLCAR[j] = 0 для всех j > FLOOR, то следует установить STATE NEUTRAL или STATE ч- GOINGDOWN в зависимости от того, вьшолняется ли условие CALLCAR[j3 = О для всех j < FLOOR, и установить все переменные CALL для текущего этажа равными нулю. Если STATE = GOINGDOWN, то необходимо выполнить те же действия, но в обратном порядке. ЕЗ. [Открытие дверей.] Задать для D1 и D2 любые ненулевые значения. По прошествии 300 единиц времени независимо выполнить шаг Е9. (Эти действия могут быть отменены на шаге Е6 до того, как они произойдут. Если они уже запланированы и не отменены, они отменяются и перепланируются.) Также независимо следует выполнить действия лифта на шаге Е5 по прошествии 76 единиц времени. Затем следует подождать 20 единиц времени (для моделирования открытия дверей) и перейти к шагу Е4. Е4. [Выход из лифта и вход в него людей.] Если для каких-то людей из списка ELEVATOR выполняется равенство OUT = FLOOR, то последнему зашедшему в лифт следует перейти к шагу U6, подождать на протяжении 25 единиц времени и повторить шаг Е4. Если таких людей нет, но список QUEUE [FLOOR] не пуст, самому первому в списке следует немедленно перейти к шагу U5 вместо шага U4, подождать в течение 25 единиц и повторить шаг Е4. А если список QUEUE [FLOOR] пуст, установить D1 ч- О, установить D3 не равным нулю и подождать, пока какие-нибудь другие действия не вызовут продолжение выполнения алгоритма. (Действия на шаге Е5 перенаправят нас к шагу Е6 или действия на шаге U2 приведут к повторному переходу к шагу Е4.) Е5. [Закрытие дверей.] Если D1 О, подождать в течение 40 единиц и повторить данный шаг (двери при этом могут вздрогнуть, но вернуться в прежнее открытое положение, так как кто-то все еще входит или выходит). В противном случае установить D3 •(- О и перейти к шагу Е6 через 20 единиц времени. (Так моделируется закрытие дверей после того, как все войдут в лифт или выйдут из него. Но если в ходе этого процесса на площадке перед лифтом на том же этаже появится новый человек, двери вновь откроются, как указано на шаге U2.) Е6. [Подготовка к движению.] Установить переменную CALLCAR [FLOOR] равной нулю; установить равной нулю переменную GALLUP[FLOOR], если STATE GOINGDOWN, a также установить равной нулю переменную CALLDOWN [FLOOR], если STATE ф GOINGUP. {Замечание. Если STATE = GOINGUP, лифт не сбрасывает значение CALLDOWN, так как предполагается, что люди, которым нужно ехать вниз, еще не вошли в него; см. упр. 6.) Теперь следует вьшолнить подпрограмму DECISION. Если STATE = NEUTRAL даже после выполнения подпрограммы DECISION, то следует перейти к шагу Е1. В противном случае, если D2 ф О, необходимо отменить действия лифта на шаге Е9. Наконец, если STATE = GOINGUP, подождать в течение 15 единиц времени (чтобы лифт ускорился) и перейти к шагу Е7; если STATE = GOINGDOWN, подождать в течение 15 единиц времени и перейти к шагу Е8. Е7. [Подъем на этаж.] Установить FLOOR <- FLOOR -I- 1 и подождать в течение 51 единицы времени. Если теперь CALLCAR [FLOOR] = 1 или GALLUP [FLOOR] = 1 или если ((FLOOR = 2 или CALLDOWN [FLOOR] = 1) и GALLUP [j] = CALLDOWN [j] = CALLCAR [j] = 0 для всех j > FLOOR), подождать в течение 14 единиц времени (чтобы лифт притормозил) и перейти к шагу Е2. В противном случае повторить данный шаг. Е8. [Спуск на этаж.] Этот шаг подобен шагу Е7, если поменять направление движения, а временные интервалы длительностью 51 и 14 единиц заменить интервалами длительностью 61 и 23 единицы соответственно. (На спуск лифту требуется больше времени, чем на подъем.) Е9. [Установка индикатора бездействия.] Установить D2 •(- О и вьшолнить подпрограмму DECISION. (Это независимое действие инициируется на шаге ЕЗ, но оно почти всегда отменяется на шаге Е6. См. упр. 4.) Подпрограмма D {Подпрограмма DECISION). Как указано в приведенных выше сопрограммах, эта подпрограмма выполняется в критические моменты времени, когда должно быть принято решение о выборе направления движения. D1. [Необходимо ли принять решение?] Если STATE ф NEUTRAL, выйти из этой подпрограммы. D2. [Следует ли открыть двери лифта?] Если лифт находится на стадии вьшолнения действий шага Е1 и если GALLUP [2], CALLCAR [2] и CALLDOWN [2] не равны нулю, то нужно после паузы длиной 20 единиц времени перейти к шагу ЕЗ, а затем выйти из этой подпрограммы. (Если в данный момент подпрограмма DECISION вызывается во время вьшолнения некоторых независимых действий на шаге Е9, то сопрограмма лифта может перейти к шагу Е1.) D3. [Есть ли вызовы?] Найти наименьшее значение j Ф FLOOR, для которого GALLUP [j], CALLCAR[j] или CALLDOWN [j] не равно нулю, и перейти к шагу D4. Но если такое значение j отсутствует, следует установить j <- 2, если в данный момент подпрограмма DECISION вызывается на шаге Е6; в противном случае следует выйти из подпрограммы. D4. [Изменение состояния.] Если FLOOR > j, установить STATE <- GOINGDOWN; если FLOOR < j, установить STATE •(- GOINGUP. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 [ 104 ] 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |