====== Лабораторная работа №5: Исследование моделей планирования действий в системах искусственного интеллекта ====== ===== Цель работы ===== Изучение принципов описания и решения задачи планирования на основе продукционной модели с использованием механизма поиска в пространстве состояний. ===== Основные теоретические положения ===== Задача построения башни из блоков (кубиков) заключается в последовательном выборе из неупорядоченной кучи блоков и постановки их друг на друга. План решения задачи представляет собой чередование двух фаз: выбора блока из кучи и установки его в башню. При этом больший по размерам блок не может ставиться на меньший по размерам и, следовательно, на каждом шаге решения задачи необходимо выбирать из кучи самый большой блок. Каждый блок характеризуется //размером//, //цветом// и //положением//, поэтому для его описания можно использовать следующий шаблон: (deftemplate block (slot size (type INTEGER)) (slot place (type SYMBOL)) (slot color (type SYMBOL)) ) Каждый блок может находиться либо в куче (''heap''), либо в руке (''hand''), когда он выбран из кучи, либо в башне (''tower''). В результате решения задачи необходимо последовательно вывести информацию о действиях, составляющих план её решения и взаимное положение блоков в построенной по данному плану башне с указанием их цвета. С этой целью для блоков, находящихся в башне, необходимо определить отношение, указывающее, какой блок (''upper'') на каком (''lower'') стоит: (deftemplate on (slot upper (type SYMBOL)) (slot lower (type SYMBOL)) (slot place (type SYMBOL)(default heap)) ) Если блок ставится в основание башни, слоту ''place'' присваивается значение ''tower'', а слоты ''upper'' и ''lower'' остаются неопределенными. Если блок ставится на другой блок, слотам ''upper'' и ''lower'' должны присваиваться значения цветов соответствующих блоков. Поскольку план решения задачи представляет собой чередование фаз поиска в компоненте пространства состояний (<<куче>>) самого большого блока (''find'') и его установки в башню (''build''), необходимо иметь факт, определяющий текущую задачу. Его можно определить с помощью следующего шаблона: (deftemplate goal (slot current-task (type SYMBOL)) ) Для решения задачи необходимы правила для следующих действий: * установки начального значения текущей задачи; * выбора из кучи самого большого блока; * установки первого блока в основание башни; * установки в башню всех последующих блоков; * определения окончания процесса, когда в куче нет больше блоков. //Правило установки начального значения текущей задачи// должно активироваться исходным фактом (''initial-fact'') и устанавливать в качестве текущей задачи ''find''. **Правило выбора из кучи самого большого блока** должно активироваться следующими условиями: * текущая задача -- ''find''; * наличие в куче блока, для которого не существует большего по размерам. Действия правила: * взять найденный блок в руку (изменить его местоположение на ''hand''); * изменить текущую задачу на ''build''. **Правило установки блока в основание башни** (первого блока) имеет следующие условия активации: * текущая задача -- ''build''; * имеется блок в руке; * отсутствуют блоки в башне -- нет блока, у которого значение слота ''place'' равно ''tower''. Действия правила: * изменить местоположение блока в руке на ''tower''; * изменить текущую задачу на ''find''. **Правило установки в башню последующих блоков** имеет условия активации: * текущая задача -- ''build''; * имеется блок в руке (для него надо запомнить цвет); * имеется блок в башне, на котором не стоит другой блок (для него также надо запомнить цвет). Действия правила: * модифицировать местоположение блока в руке на ''tower''; * установить факт, что новый блок находится на блоке, который был до этого верхним; * изменить текущую задачу на ''find''. **Правило определения окончания процесса** должно активироваться, когда в куче больше нет блоков и удалять из рабочей памяти факт текущей задачи. ===== Постановка задачи ===== Разработать и отладить на языке CLIPS программу решения задачи планирования постройки башни из блоков с пошаговым отображением плана построения башни. ===== Порядок выполнения работы ===== - Разработать программу решения задачи планирования на языке CLIPS, реализующую описанные выше правила, в соответствии с вариантом задания, указанным в таблице. \\ Исходное состояние должно описываться конструкцией ''deffacts'', содержащей четыре факта, соответствующих блокам в куче. - Вывод результатов на экран должен обеспечивать пошаговое отображение плана построения башни. ===== Варианты заданий ===== Для каждого блока в таблице через слеш указаны параметры: цвет/размер. ^ № варианта ^ Блок-1 ^ Блок-2 ^ Блок-3 ^ Блок-4 ^ | 1 | синий/10 | зелёный/8 | красный/18 | жёлтый/15 | | 2 | красный/20 | коричневый/5 | жёлтый/12 | зелёный/8 | | 3 | жёлтый/15 | красный/10 | белый/25 | коричневый/5 | | 4 | зелёный/10 | жёлтый/14 | чёрный/18 | красный/11 | | 5 | коричневый/5 | белый/25 | синий/14 | жёлтый/12 | | 6 | красный/10 | чёрный/18 | жёлтый/15 | белый/25 | | 7 | жёлтый/12 | синий/10 | зелёный/8 | чёрный/18 | | 8 | белый/16 | красный/5 | коричневый/15 | синий/10 | | 9 | чёрный/18 | жёлтый/15 | красный/20 | белый/10 | ===== Содержание отчёта ===== * Цель работы. * Краткое изложение основных теоретических понятий. * Постановка задачи с кратким описанием порядка выполнения работы. * Пошаговый план решения задачи. * Результаты работы программы с краткими выводами. * Общий вывод по проделанной работе. * Код программы.