
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра вычислительной техники
ОТЧЕТ
по лабораторной работе №4
по дисциплине «Введение в искусственный интеллект»
Тема: Методы информированного (эвристического) поиска в среде продукционного программирования CLIPS
Преподаватель |
|
Родионов С.В. |
Санкт-Петербург
2024
Цель работы
Практическое закрепление теоретических основ информированного (эвристического) поиска с использованием продукционного программирования в среде CLIPS.
Постановка задачи
Рассмотреть принципы эвристического поиска в среде продукционного программирования CLIPS на конкретном примере – головоломка 8-ка. Рассматриваем два вида эвристических функций h1 и h2 (Рассел С, Норвиг П. Искусственный интеллект: современный подход, 2-е изд., М. «Вильямс», 2006, стр. 167- 174):
– h1 – число фишек, стоящих не на своем месте;
– h2 – суммарное по всем фишкам число шагов до целевого положения (манхэттенское расстояние).
2. Реализовать в программе подсчет временной и емкостной сложности и сравнить с результатами реализации на императивном языке программирования.
Начальное состояние в соответствии с вариантом приведено на рис. 1. Целевое состояние отображено на рис. 2.
Рисунок 1 – начальное состояние
Рисунок 2 – конечное состояние
Распределение обязанностей
Описание выбранных структур данных:
Для реализации программы был реализован созданный шаблон «Node», который описывает узел дерева.
Шаблон |
Слот |
Описание |
Node |
id |
Идентификатор узла дерева |
cell1 |
Левая верхняя ячейка |
|
cell2 |
Центральная верхняя ячейка |
|
cell3 |
Правая верхняя ячейка |
|
cell4 |
Левая средняя ячейка |
|
cell5 |
Центральная средняя ячейка |
|
cell6 |
Правая средняя ячейка |
|
cell7 |
Левая нижняя ячейка |
|
cell8 |
Центральная нижняя ячейка |
|
cell9 |
Правая нижняя ячейка |
|
parent |
Идентификатор родительского узла |
|
depth |
Глубина дерева |
|
f |
Значение оценочной функции для узла дерева |
|
status |
состояние вершины: 0 - еще не раскрыта, 1 - раскрыта, 2 - является целевой |
Описание алгоритма поиска a*:
Поиск А* - наиболее широко известная разновидность поиска по первому наилучшему совпадению. В нем применяется оценка узлов, объединяющая в себе эвристическую функцию (стоимость прохождения от данного узла до цели) h(n) и стоимость достижения данного узла g(n):
Поскольку функция g(n) позволяет определить стоимость пути от начального узла до узла n, а функция h(n) определяет оценку стоимости наименее дорогостоящего пути от узла n до цели, то справедливо, что f(n) - это оценка стоимости наименее дорогостоящего пути решения, проходящего через узел n.
Таким образом, при при переходе к потомкам узла, проверяется узел с наименьшим значением g(n) + h(n).
Реализация поиска A* похожа на реализацию алгоритмов слепого поиска с тем отличием, что при переходе к новой раскрываемой вершине мы выбираем не узел из начала очереди или из конца дека, а берем тот узел, значение эвристической функции которого минимально.
Алгоритм A* на языке CLIPS реализован следующим образом:
В глобальных переменных инициализируются начальные значения:
?*ID* - уникальный идентификатор для узлов.
?*unique_nodes* - количество созданных узлов.
?*total_steps* - количество пройденных шагов.
Начальные и целевые состояния представляются девятью переменными для каждой ячейки (от ?*init_cell1* до ?*init_cell9* и от ?*result_cell1* до ?*result_cell9*).
Переменная ?*hType* определяет используемую эвристику: h1 (значение 1) или h2 (значение 2) .
Переменная ?*DEBUG* используется для включения режима отладки (значение 1) или его выключения (значение 0).
Далее определяется шаблон для узла, структура которого была описана ранее.
Функции для работы эвристики:
Функция manhattanGeom вычисляет Манхэттенское расстояние между двумя ячейками.
Функция h1 подсчитывает количество ячеек, которые не на своих местах по сравнению с целевым состоянием.
Функция h2 вычисляет сумму Манхэттенских расстояний от текущего состояния до целевого для каждой ячейки.
Функция getF вычисляет значение оценочной функции f, которая является суммой глубины узла и эвристического значения h (выбранного на основе глобальной переменной ?*hType*).
Правила:
Правило initial создаёт начальный узел с использованием начального состояния.
Правило result определяет достижение целевого состояния и выводит результат.
Правило stop_if_no_solution завершает работу, если нет узлов в статусах 0 или 2.
Правило stop_if_solution_found завершает работу при нахождении решения, выводя статистику.
Правила fix_min и find_min обновляют минимальное значение f среди необработанных узлов.
Правило remove_repeats удаляет дублирующиеся узлы, оставляя узел с меньшим значением f.
Правила create_cell1, create_cell2 и create_cell3 и так далее создают новые узлы на основе текущего узла, перемещая нулевую ячейку в возможные позиции. Каждое правило проверки соседних ячеек (например, create_cell1, create_cell2, и create_cell3) создаёт новые узлы, если перемещение ячейки возможно, обновляя состояние, глубину и оценочную функцию.