3.3. Автоматическое составление цепочки
3.3.1. Ассоциативная сборка программы. В предыдущем разделе разбирались способы построения цепочки, где входящие в формируемую программу модули указывались явно, т. е. использовался перечислительный механизм задания конфигурации. Наряду с перечислительным заслуживает внимания и ассоциативный механизм включения модулей в формируемую программу, где модуль выбирается не посредством явного указания, а за счет наличия у него некоторого свойства (атрибута). Иначе говоря, предполагается, что системные средства пакета имеют возможность извлекать из программного фонда модули, обладающие указанными свойствами, и составлять с их участием конкретные конфигурации программы.
Благодаря применению ассоциативного механизма пользователь пакета нередко избавляется от необходимости явного указания не только модулей, включаемых в формируемую программу, но и многих других деталей алгоритма. Уточнение этих деталей способны взять на себя системные средства пакета.
Ассоциативный механизм может использоваться для организации формирования программ при самых различных конфигурационных ориентирах. Если в качестве такого ориентира выбрать цепочку и потребовать, чтобы пользователь задавал только известные и искомые величины и вовсе не указывал входящие в цепочку модули, то это приведет к постановке задачи, известной под названием автоматическое планирование вычислений.
3.3.2. Автоматическое планирование вычислений. Замысел автоматического планирования достаточно прост и весьма привлекателен. Поясним его на небольшом примере.
Пусть два независимых исполнителя создали и поместили в пакет два расчетных модуля, реализующих решение элементарных задач из школьного курса физики. Модуль M1 вычисляет путь S, пройденный за время t от начала движения с ускорением a, по формуле
| (1) |
Модуль M2 вычисляет ускорение a, если известны сила F и масса m:
| (2) |
И пусть теперь сформулирована следующая задача:
| (3) |
Конечно, любой мало-мальски успевающий школьник, вооружившись формулами (1) и (2), в два счета справится с ее решением. Еще легче решит эту задачу программист, располагающий модулями M1, M2. Он построит расчетную программу, не обращая внимания на физические формулы; для него спецификации модулей приобретают совсем простой вид
| (4) |
где слева от символа « > » указаны исходные данные модуля, а справа его выходные результаты. Ясно, что программа, представляющая собой связанную надлежащим образом цепочку из двух модулей { M2, M1 }, вычислит искомую величину S. Модуль M2 вычислит величину a и подготовит тем самым недостающее значение входного параметра модуля M1, вычисляющего S.
При автоматическом планировании вычислений тот же результат удается получить без какого бы то ни было участия человека. На вход программы-планировщика подаются спецификации модулей (4) и постановка задачи (3). На выходе получается искомая цепочка из двух модулей { M2, M1 }.
Один из возможных алгоритмов планирования состоит из следующих двух шагов.
Ш а г 1. Выявляются модули, для которых известны все входные параметры. (Точнее, из программного фонда пакета ассоциативно извлекаются все модули, обладающие свойством «все входные параметры известны».) Такие модули дописываются в строящуюся цепочку (которая сначала пуста), а к множеству известных величин добавляются выходные результаты этих модулей.
Ш а г 2. Если на шаге 1 к числу известных величин ничего добавить не удалось, то алгоритм заканчивается неудачей: при заданной совокупности модулей и исходных данных искомые величины вычислены быть не могут. Если на шаге 1 в число известных попали все искомые величины, то алгоритм завершается успешно: необходимая цепочка модулей построена. Иначе вновь переход к выполнению шага 1.
Разумеется, и алгоритм планирования, и спецификации модулей, и постановка задачи приведены здесь в упрощенном виде. В частности, если принять во внимание, что в предметной области может быть несколько однотипных величин, обладающих общими свойствами, то окажется, что каждый модуль применим, вообще говоря, к нескольким наборам таких однотипных величин.
Алгоритм планирования требует дальнейшего развития и улучшения. В цепочке нередко оказываются модули, которые не влияют на конечный результат, их следует исключить. Можно попытаться проанализировать множество различных цепочек, ведущих к искомым величинам, и выбрать из них наилучшую с точки зрения некоторого критерия: времени выполнения, объема используемой памяти, точности вычислений и т. д. В результате подобных усовершенствований планировщик становится пригодным для решения практических задач из реальных предметных областей.
Деятельность планировщика нередко производит впечатление маленького чуда искусственного интеллекта. Ведь разработчики включаемых в цепочку модулей могли ничего не знать ни друг о друге, ни о задаче, в решении которой модули будут участвовать. Планировщик берет на себя весьма непростую миссию: выявить среди разрозненных кусков алгоритмов и знаний о предметной области необходимые компоненты и соединить их для успешного решения конкретной практической задачи!
3.3.3. Сфера применимости автоматического планирования. В актив автоматического планирования вычислений можно занести несколько весомых практических результатов. Широкую известность получили системы ПРИЗ [Кахро, 1981] и СПОРА [Бабаев, 1981], ориентированные на построение пакетов программ с планировщиком.
В некоторых предметных областях автоматическое планирование позволяет добиться высоких потребительских качеств пакета. Например, весьма убедительно выглядят цепочки модулей, выстраиваемые пакетом для выполнения электротехнических расчетов. Пользователь лишь описывает компоненты электрической схемы и связи между ними, а планировщик избавляет его от довольно трудоемкой работы по составлению расчетных программ, вычисляющих те или иные характеристики схемы.
Для многих предметных областей состав цепочек модулей, решающих конкретные задачи, достаточно очевиден. Тем не менее и здесь нередко прибегают к автоматическому планированию. Дело в том, что помимо «творческой» деятельности по составлению цепочек на планировщик возлагаются и все рутинные заботы по обеспечению разнообразных связей между входящими в цепочку модулями. Если передача и, возможно, преобразования данных, циркулирующих между модулями, реализуются вручную, то в строящуюся цепочку модулей могут вкрасться различные ошибки. Напротив, выполняемая программа, создаваемая планировщиком, корректна «по построению». Это важное качество планировщика зачастую играет решающую роль при выяснении вопроса о целесообразности применения автоматического планирования.
Несмотря на все перечисленные достоинства, массового распространения автоматическое планирование вычислений не получило. Основная причина та же, что и при перечислительном задании цепочки, бедность цепочки как конфигурационного ориентира.
Не раз предпринимались попытки приспособить автоматическое планирование для формирования более продуктивных программных конфигураций. Однако пока все они заканчиваются несоразмерным усложнением логического аппарата, встающим непреодолимой преградой на пути к реальным потребностям практического программирования.
|