![]() |
5.5. Открытые коллективы. ИерархияКоллективы алгоритмов, в которых применяется открытый буфер только для "пуска" коллектива, обычно относят к закрытым. Мы будем говорить об открытых коллективах, имеющих и другие открытые буфера, называемые существенными. Наличие открытого буфера может вызывать безрезультатную остановку коллектива алгоритмов. Внося искусственно изменения в состояние открытого буфера, можно добиться продолжения процесса и, поступая так нужное число раз, довести процесс до получения результата. Если, по-разному воздействуя на буфер, можно получать не равные между собой результаты, то открытый буфер называется существенным. Наличие существенного открытого буфера приводит к тому, что коллектив алгоритмов перестает обладать свойством однозначности результата по отношению к исходному данному. Если для закрытых коллективов справедлива теорема о том, что каждый из них эквивалентен некоторому одиночному алгоритму, то для открытого коллектива это не так (из-за его неоднозначности). Но посмотрим на открытый коллектив алгоритмов с другой стороны. Будем считать, что операнд X (исходное данное) является некоторым параметром, а последовательность элементов информации b = (b1, b2, ..., bn), которые мы вводим в буфер для того, чтобы совокупный процесс привел к искомому результату (обозначим его Y), примем за значение аргумента. Повторяю, значениями аргумента будем считать не отдельные данные, а их последовательности. Тогда окажется, что каждую последовательность b (при фиксированном X) коллектив алгоритмов отображает на некоторый результат Y. И при этом отображение будет однозначным. Каждую последовательность b будем называть серией*. * (Не смешивать с серией критических отрезков процесса.) Если коллектив алгоритмов имеет несколько открытых существенных буферов, то он индуцирует функцию от многих переменных (зависящую от параметра X). Значениями аргументов этой функции будут серии данных. Обычно в роботе под параметром X понимают ту информацию, которая хранится в его памяти (запоминающем устройстве), а результат Y расчленяют на части, одну из которых считают новым значением X, другую рассматривают как управляющую информацию и передают эффекторам, а третью вовсе стирают как ненужную (это "отходы производства"). После получения результата и выделения из него нового значения X, выполнение коллектива алгоритмов повторяют и т. д. Таким образом, сигналы рецепторов вместе с информацией, накопленной в памяти, перерабатываются в управляющие сигналы и новое состояние памяти. Так как при управлении роботом существенное значение имеет своевременность реакции, то в состав коллектива алгоритмов иногда включают алгоритм, играющий роль рецептора, называемый генератором времени. Задаваемое им "время" называют алгоритмическим временем. Генератор времени часто называют алгоритмическими часами. Но такой термин неудачен. Часы, по всеобщему мнению, являются измерительным прибором, который позволяет измерять время. Я не стану оспаривать эту общепринятую точку зрения, но замечу, что ничего общего с измерением времени генерация алгоритмического времени не имеет.
Пусть ![]()
Другие алгоритмы коллектива могут обращаться в подконструкции
Обычно в качестве ![]()
Здесь выражение ![]() Можно построить генератор времени так, чтобы "столкновение" алгоритмов при чтении было полностью исключено. Например, для каждого алгоритма Аi отвести свою ячейку связи с часами Ti. Это похоже на ситуацию, в которой каждому прохожему предоставлялся бы отдельный циферблат на уличных часах только для того, чтобы, определяя время, прохожие между собой не передрались... При этом генератор времени может иметь вид: ![]() Легко сообразить, что такие "часы" на разных "циферблатах" одно и то же будут показывать не одновременно. Возможность столкновений между алгоритмами и генератором и здесь не устранена.
Точное алгоритмическое время алгоритмы коллектива не могут считывать из-за того, что в коллективе возникает "борьба" за обращение к "часам" В тех случаях, когда коллектив алгоритмов реализован в виде некоторого физического устройства, можно установить экспериментальным способом зависимость, существующего между алгоритмическим и физическим временем. Соотношение это должно быть таково, чтобы робот действовал в так называемом реальном времени, т. е. чтобы реакции на внешние воздействия вырабатывались достаточно быстро. Иначе управляющее устройство робота неэффективно. Читателю понятно, что управляющее устройство при нашем подходе - это физическая модель открытого коллектива алгоритмов. Наряду с регулирующими предикатами, вернее с ожиданием регулирующего предиката, можно допустить и другие бесконфликтные способы обращения к буферу. Я имею в виду такой практически важный прием, как спаривание буфера с собственной подконструкцией алгоритма. Поясню этот прием.
Прежде всего замечу, что каждый алгоритм может иметь много собственных подконструкций. До сих пор я не подчеркивал этого факта. В предыдущих примерах встречалась подконструкция
Пусть теперь ![]()
Эта схема предусматривает проверку истинности регулирующего предиката Мы уже говорили, что буферы можно применять для запуска алгоритмов и даже их коллективов (см. с. 84). Эту возможность легко использовать для того, чтобы один алгоритм (или коллектив) разрешал или запрещал функционировать другому. Пусть буфер а доступен алгоритму А по записи, а алгоритму В - по чтению и В содержит приказ "Ожидать α = 1", причем вначале а = 0. Достигнув этого приказа, В остановится и будет "ожидать" до тех пор, пока алгоритм А не выполнит приказ k) α: = 1; → k+1;
Тот же А, своим приказом l) α:= 0, → l+1;
заставит алгоритм В остановиться при очередном обращении к α. При такой связи между алгоритмами (коллективами алгоритмов) В и А говорят, что В подчинен А. Если коллектив алгоритмов К можно разбить на подколлективы так, что каждый из них, кроме одного (главного), подчинен одному и только одному подколлективу, то K называют иерархическим. Иерархическая структура позволяет четко распределить функции между подколлективами. Передача подчиненным педколлективом своих результатов старшему допустима, но без задержки процесса выполнения старшего. Один из приемов такой передачи заключается в том, что старший наделяется возможностью "маскировать" буфер, доступный младшему по записи. Допустим, что младший обращается к старшему, заменяя в буфере γ код 0 кодом 1. Тогда для старшего предусматривают собственную ячейку δ, которая может содержать либо 0, либо 1, и в старшем ставят пару приказов k) Если δ = 1, то →k + 1, иначе k + m;
k+1) Ожидать γ = 1, →k + 2;
|
![]()
|
|||
![]() |
|||||
© ROBOTICSLIB.RU, 2001-2019
При копировании материалов проекта обязательно ставить ссылку на страницу источник: http://roboticslib.ru/ 'Робототехника' |