Н. Джехани - Язык Ада (1988) (1160771), страница 35
Текст из файла (страница 35)
КЕМ)ЕЯТ РВ ог Принять запрос о наличии вызовов лифта, ожидающих обслуживания е)яе Принять запросы пассажиров на пользование лифтом епй яе!ес! епй!оор Задача КЕО()ЕБТ 'РВ будет использовать логические массивы Р, () и Р для хранения запросов на выход из лифта и движение вверх и вниз соответственно. Р (1) Значение ТКЫЕ показывает, что пассажир хочет выйти на !-м этаже 1.1 (1) Значение ТКЫЕ показывает, что пассажир хочет подняться с 1-го этажа Р (1) Значение ТК()Е показывает, что пассажир хочет опуститься с 1-го этажа Задача КЕО()ЕБТ РВ предоставляет более высокий приоритет вызовам входа, которые осуществляет задача ЕЬЕЧАТОК СОХТКОЬ, чем запросам пассажиров на пользование лифтом.
Важно, чтобы задача ЕЬЕЧАТОК СОХТКОЬ обрабатывалась за минимальное время„так как она управляет движением лифта в пределах ограничений, накладываемых временными характеристиками этого лифта. Бесконечный цикл, выполняемый задачей КЕО()ЕБТ-ОВ, можно абстрактно описать так: !оор яе)ес! Принять запрос на вычисление новой точки назначения ог Принять информацию о том, что пассажиры вошли на 1-ом этаже ог Принять информацию о том, что пассажиры вышли на 1-ом этаже зуб П ь ность Оператор Принять запрос на вычисление новой точки назначения детализируется как ассерг ОЕБТ(СЬ)К БТАТЕ: !п БТАТЕ; С()К РЬООК: !и БТОК1ЕБ; )чЕ% БТАТЕ: ов! БТАТЕ; )ч!Е% РЬООК: овг БТОК1ЕБ) оо ОЕБТ1ХАТ1ОХ(С()К БТАТЕ, СОК РЬООК, ХЕ% БТАТЕ, 1ЧЕ% ГЬООК); й 1)ЕБТ„ Оператор Принять инЯормацию о том, что пассалСиры вошли на 1-м этаже детализируется как ассер! СЬЕАК ООФ1К: !п БТАТЕ; 1: !в БТОК1ЕБ) ао саяе 01К !а згЬеп ()Р > Ь) (1): РАЬБЕ; згЬев 0О%Х > О(1): РА1,БЕ; эгЬев о)Е()ТКАЬ > га(ае РКООКАМ ЕККОК; — возбудить предопределенное исключение РКООКАМ ЕККОК.
— Возбуждение этого исключения приведет к выполнению — программы, из которой был сделан вызов. — Исключения рассмотрены в 5-ой главе евй.саяе; епо СЬЕАК ОО; Оператор Принять информацию о том, что пассажиры вышли на 1-м этаже детализируется как ассар! СЬЕАК ОРР(1: !п БТОК1ЕБ) во Р(1): РА1.БЕ; евв СЬЕАК ОРР; Оператор Принять запрос о наличии вызовов лиФта, ожидающих обслуживания детализируется как ассерг КЕ(1()ЕБТБ(В: ов! ВООЬЕАХ) оо В: АХУ(Р) ог АХУШ) ог АХг'Ф); еп$ КЕЯ()ЕБТБ; где АМУ вЂ” это определяемая пользователем функция, возвращающая значение ТАЗЕ, если хотя бы один из элементов массива, являющегося ее фактическим параметром, имеет значение ТК()Е.
И наконец, оператор Принять вызов лиЯта детализируется как ае!ес! ассерг (ЗР(1: !в БТОК1ЕБ) оо ()(1): ТАКЖЕ; епв ()Р; ог ассер! 00%с((1: !в БТОК1ЕБ) оо 0(1): ТК()Е; евй ОО%Х; 176 Глава 4 ог ассер! ГЕООК(1: !и БТОК1ЕБ) 6о Г(1): ТК(.)Е; епд Г1.ООК; е!ае пв!1; епд зе!ес! Приведем тело задачи КЕО(ЗЕБТ РВ: гааЬ Ьоду КЕО()ЕБТ ПВ !а гуре БТАТПБ В аггау(1ХТЕОЕК гапае ( >) оу ВОО).ЕАХ; Г, ~/, Вл БТАТ()Б(1..Х): (БТОК1ЕБ > ГА).БЕ); — Г, !1, Р содержат запросы на выход из лифта, — движение вверх и вниз соответственно Рвпсгюп АХ У(А: !и БТАТОБ) ге!вгп ВОО! ЕАХ га — возвращает ТК()Е, если какой-либо элемент массива -- А имеет значение ТК()Е; ГА1.БŠ— в противном случае Ьея)п.
уог 1 )п А'КАХСЕ !оор !1АП) ййеп гещгп ТК(ЗЕ; еп4 !Е епд !оор; ге!вгп ГА1.БЕ; епд АХЪ', (пас!!оп 1.Очч'ЕБТ(А, В: !и БТАТ()Б) ге!ига БТОК!ЕБ  — вызывается только в случае, если хотя бы один элемент А нли — В имеет значение ТК()Е; функция возвращает значение минимального — индекса из двух массивов, такого, что соответствующий элемент -- имеет значение ТК()Е Ьея!п Уог 1 !и А КАХОЕ !оор !г А(1) ог В(1) гйеп ге!вгв 1; епй !Г; епв !оор; епй ЬОЪУЕБТ; гипс!!оп Н10НЕБТ(А, В: !и БТАТ(ЗБ) ге!вгп БТОК1ЕБ и — вызывается только в том случае, если хотя бы один элемент массивов --А или В имеет значение ТК()Е; функция возвращает значение максимального — индекса из двух массивов, такого, что соответствующий элемент имеет — значение ТК()Е Ьев!п гог! !в гечегее А'КАХОЕ !оор 11 А(1) ог В(1) !Ьеп ге!пгп 1; 177 Па ъносгь евй !1; епп' Ьюр; И Н1ОНЕБТ; — тело процедуры РЕБТ1ХАТ10)ч, которую — рассмотрим позже --бесконечный цикл епй КЕО()ЕБТ РВ; Задача КЕ()()ЕБТ РВ выполняется непрерывно и никогда не задерживает себя.
Если эта задача модифицируется с целью полного устранения бесполезного ожидания, то в этом случае необходимо гарантировать, что задача ЕЬЕЧАТОК СОХТКОЬ всегда обрабатывается вовремя, так как она должна надлежащим образом управлять движением лифта. Процедура РЕБТ11ЧАТ1ОХ вычисляет новую точку назначения в зависимости от текущего направления движения лифта. Процедура выполняет вычисления таким образом, чтобы свести к минимуму изменения направления движения лифта.
Направление движения не изменяется в том случае, если существует вызов лифта, выполнение которого не потребует изменения направления. Это означает, что когда лифт поднимается вверх, он не остановится на этажах, с которых был сделан вызов на движение вниз: он остановится на этих этажах только при движении вниз. Аналогичная ситуация имеет место при движении лифта вниз.
Процедура РЕБТ1ХАТ!Ог( должна вызываться только в том случае, когда имеется хотя бы один запрос к лифту. Она определяется как ргоеепвге РЕБТ1ХАТ(ОМ(СЫК БТАТЕ: !и БТАТЕ; СРК ЕЬООК:!и БТОК1ЕБ; г)Е% БТАТЕ: оп! БТАТЕ; ХЕ% ЕЬООК: ов! БТОК!ЕБ); и реализует следующий абстрактный алгоритм: !! Если лифт не реагирует на запросы или движется вверх !йеп Обработать вызовы с текущего или более высокого этажей для вычисления новой точки назначения, чтобы при этом не потребовалось изменение направления движения лифта; если таких вызовов нет, то изменить направление (вниз) и вычислить новую точку назначения е1яе Обработать запросы с текущего илн более низкого этажа для вычисления новой точки назначения, не требующей изменения направления движения. Если таких запросов нет, изменить направление движения (вверх) и вычислить новую точку назначения.
епй !! Этот алгоритм затем детализируется так: !1 текущее направление ХЕ()ТВАЬ или ()Р Г!|еа ;1 имеются запросы с текущего или более высокого этажей на движение вверх либо запросы пассажиров на выход на более высоком этаже гйеп ХЕ% ГЬООВ:= ближайший верхний этаж (текущий или выше), с которого был сделан вызов; ХЕ% БТАТЕ = ЫР е!в!1 имеются запросы на движение вниз с более высокого этажа (веп ХЕ чу ГЬОО!(:= самый верхний этаж, с которого был сделан вызов.
ХЕ% БТАТЕ ' ()Р е1яе --изменить направление и вычислить рекурсивно 0ЕБТ!ХАТЮХ(0ОФХ, СЫВ ГЬООВ, ХЕ% БТАТЕ, ХЕРУ ГЬООВ) евй |Т е!ае !Г имеются запросы с текущего или более низкого этажей на движение вниз (йеп ХЕ% ГЬООВ.= самый верхний этаж(текущий или ниже), с которого был сделан вызов ХЕ% БТАТЕ =0ОФХ е!а!1 имеются запросы на движение снизу вверх г!|еп ХЕ% ГЬООВ:= самый низкий этаж, с которого был сделан вызов.
ХЕ% БТАТЕ:= 0О'|(гХ е!ве — изменигь направление и вычислять рекурсивно 0ЕБТ1ХАТЮХ(ЫР, СЫ!( ГЬООВ, ХЕ% БТАТЕ, ХЕ% ГЬООВ) ев|! !1 епа !1 Как упоминалось выше, процедура 0ЕБТ1ХАТ1ОХ должна вызываться только в том едуча если имеется хотя бы один запрос на пользование лифтом. В этом случае легко можно сформулировать условие окончания рекурсии. Если имеется один запрос, будет только один рекурсивный вызов процедуры.
В реализации этой процедуры отдается предпочтение запросам на движение вверх, так как, когда направление имеет значение ХЕЫТВАЬ, процедура ищет запросы на движение к этажам, находящимся выше текущего. Процедура 0ЕБТ1ХАТ1ОХ, написанная на языке Ада, выглядит следующим образом: Ргоее|!иге 0ЕБТ1ХАТ1ОХ(С(Л~ БТАТЕ: !и БТАТЕ; СО!1 РЬООВ: в БТОВ1ЕБ; ХЕ% БТАТЕ: ои! БТАТЕ; ХЕ% РЬООВ: ои! БТОВ1ЕБ) !а — использует глобальные переменные (), Р, О, но не изменяет их Па аялельносп 17Э Ьей!и Ы С()К БТАТЕ ХЕЫТКАЬ ог СЫК БТАТЕ ()Р !Ьеп Ы АХУ(()(С()К РЬООК..Ы 1.АБТ)) ог АХУ(Р(С\Ж Р.ООК..Р'1.АБТ)) гЬеп ХЕ% РЬООК: Ь0%ЕБТШ(С(Ж Н ООК..1)'ЬАБТ), НС1)К Н.ООК..Р'ЬАБТ)); ХЕ% БТАТЕ: 1)Р; е)вЫ АХАЮ(С()К РЬООК..Р 1.АБТ)) гЬеп ХЕ% РЬООК: Н10НЕБТФ(СОК Н.ООК..О'1.АБТ), (С()К РЬООК..Р ЬАБТ ) РАЬБЕ)); ХЕ% БТАТЕ: 1)Р; еЬе ОЕБТ1ХАТ1ОХ ФО%Х, С()К Н.ООК, ХЕ% БТАТЕ, ХЕ% Р.ООК); епй Ы; е)ае Ы АХУФФ НКБТ..С1Ж Н.ООК)) ог АХУ(Р(Р'НКБТ..С1Ж РЬООК)) гЬеп ХЕ% Р.ООК: Н10НЕБТФ(Р'НКБТ..С1Ж Н.ООК), Р(Р Р1КБТ..С()К Н.ООК)); ХЕ% БТАТЕ: О0%Х; е1аЫ АХУ(Ы(1)'НКБТ..С\Ж Н.ООК)) гЬеп ХЕ% Р.ООК: Ь0%ЕБТ®(1)'НКБТ..С1)К Н.ООК), (Ы'НКБТ..С(Ж Н.ООК ) РА1.БЕ)); ХЕ% БТАТЕ: )э0%Х; е)ае ВЕБТ1ХАТ10ХФР, С1Ж РЬООК, ХЕ% БТАТЕ, ХЕ% Р.ООК); епй Ы; епй Ы; епд 1)ЕБТ1ХАТ10Х; 4.14.9.6.
Расширение задачи управления лифтом При движении к исходному этажу лифт останавливается на каждом этаже, хотя и не открывает двери. Эти необязательные остановки вызывают износ и поломки оборудовании. Читатель может самостоятельно изменить задачу ЕЬЕЧАТОК СОХТКОЬ таким образом, чтобы характеристики работы лифта улучшились.