Лекция: Эвристический поиск.
В [Polya, 1945] эвристика определяется как «изучение методов и правил открытий и изобретений». Это слово имеет греческий корень, глагол euriscoозначает «исследовать». Когда Архимед выскочил из ванны, держа золотой венец, он закричал «Эврика!», что значит «Я нашел!». В пространстве состояний поиска эвристика определяется как набор правил для выбора тех ветвей из пространства состояний, которые с наибольшей вероятностью приведут к приемлемому решению проблемы.
Специалисты по искусственному интеллекту используют эвристику в двух ситуациях.
1. Проблема может не иметь точного решения из-за неопределенности в постановке задачи и/или в исходных данных. Медицинская диагностика – пример такой проблемы. Определенный набор признаков может иметь несколько причин; поэтому врачи используют эвристику, чтобы поставить наиболее точный диагноз и подобрать соответствующие методы лечения. Система технического зрения — другой пример задачи с неопределенностью. Визуальные сцены часто неоднозначны, вызывают различные (часто не связанные друг с другом) предположения относительно протяженности и ориентации объектов. Оптический обман — хорошая иллюстрация таких двусмысленностей. Системы технического зрения часто используют эвристику для выбора наиболее вероятной интерпретации из нескольких возможных.
2. Проблема может иметь точное решение, но стоимость его поиска может быть слишком высокой. Во многих задачах (например, игра в шахматы) рост пространства возможных состояний носит экспоненциальный характер, другими словами, число возможных состояний растет экспоненциально с увеличением глубины поиска. В этих случаях методы поиска решения «в лоб» типа поиска в глубину или в ширину могут занять слишком много времени. Эвристика позволяет избежать этой сложности и вести поиск по наиболее «перспективному» пути, исключая из рассмотрения неперспективные состояния и их потомки. Эвристические алгоритмы могут (как правило, на это надеются проектировщики) остановить этот комбинаторный рост и найти приемлемое решение.
К сожалению, подобно всем правилам открытия и изобретения, эвристика может ошибаться. Эвристика — это только предложение следующего шага, который будет сделан на пути решения проблемы. Такие предположения часто основываются на опыте или интуиции. Поскольку эвристика использует такую ограниченную информацию, как описание текущих состояний в списке open, то она редко способна предсказать дальнейшее поведение пространства состояний. Эвристика может привести алгоритм поиска к субоптимальному решению или не найти решение вообще. Это ограничение присуще эвристическому поиску и не может быть устранено «лучшей» эвристикой или более эффективным алгоритмом поиска [Garey и Johnson, 1979].
Эвристика и разработка алгоритмов для эвристического поиска в течение достаточно долгого времени остаются основным объектом исследования в проблемах искусственного интеллекта. Игра и доказательство теорем — два самых старых приложения в области искусственного интеллекта; оба они нуждаются в эвристике для сокращения числа состояний в пространстве поиска. Невозможно рассмотреть каждый вывод, который может быть сделан в той или иной области математики, или каждый возможный ход на шахматной доске. Эвристический поиск — часто единственный практический метод решения таких проблем.
Исследование в области экспертных систем подтвердило важность эвристики как основного компонента при решении задач. Эксперт-человек, решая проблему, анализирует доступную информацию и делает вывод. Интуитивные правила («rules of thumb»), которые использует эксперт, чтобы эффективно решить ту или иную проблему, в значительной степени эвристичны по природе. Такие эвристики были созданы и формализованы разработчиками экспертных систем.
Эвристические алгоритмы состоят из двух частей: эвристической меры и алгоритма, который использует ее для поиска в пространстве состояний
10.3.1. «Жадный» алгоритм поиска
Наиболее простой путь эвристического поиска — это применение процедуры поиска экстремума (hill climbing). Стратегии, основанные на поиске экстремума, оценивают не только текущее состояние поиска, но и его потомков. Для дальнейшего поиска выбирается наилучший потомок; при этом о его братьях и родителях просто забывают. Поиск прекращается, когда достигается состояние, которое лучше чем любой из его наследников. Поиск экстремума — название стратегии, которая может быть использована энергичным, но слепым альпинистом, поднимающимся вдоль наиболее крутого склона до тех пор, пока он не сможет идти дальше. Так как в этой стратегии данные о предыдущих состояниях не сохраняются, то алгоритм не может быть восстановлен из точки, которая привела к «неудаче».
Основная проблема стратегий поиска экстремума — это их тенденция останавливаться в локальном максимуме. Другими словами, как только они достигают состояния, имеющего лучшую оценку, чем его потомки, алгоритм завершается. Если это состояние является не решением задачи, а только локальным максимумом, то такой алгоритм неприемлем для данной задачи. Это значит, что решение может быть оптимальным на ограниченном множестве, но из-за формы всего пространства, возможно, никогда не будет выбрано наилучшее решение. Пример такого локального экстремума появляется в игре в«пятнашки». Часто для того, чтобы передвинуть фишку в нужную позицию, необходимо
сдвинуть фишку, находящуюся в наилучшей позиции. Без этого невозможно решить головоломку, но в то же время на данном этапе это ухудшает состояние системы. Дело в том, что «лучший» не означает «идеальный». Методы поиска без механизмов возврата или других приемов восстановления не могут отличить локальный максимум от глобального. Существуют методы приближенного решения этой проблемы, например, случайное возмущение оценки. Однако гарантированно решать задачи с использованием техники поиска экстремума нельзя.
Несмотря на эти ограничения, алгоритм поиска экстремума может быть достаточно эффективным, если оценивающая функция позволяет избежать локального максимума и зацикливания алгоритма. В общем, однако, эвристический поиск требует более гибкого метода, предусмотренного в «жадном» алгоритме поиска, где при использовании приоритетной очереди возможно восстановление алгоритма из точки локального максимума.
Подобно алгоритмам поиска в глубину и алгоритмам поиска в ширину, описанными ранее, «жадный» алгоритм поиска использует списки сохраненных состояний: список open
отслеживает текущее состояние поиска, а в closed записываются уже проверенные
состояния. На каждом шаге алгоритм записывает в список open состояние с учетом некоторой эвристической оценки его «близости к цели». Таким образом, на каждой итерации рассматриваются наиболее перспективные состояния из списка open.
На каждой итерации функция best_first_search, реализующая «жадный» алгоритм удаляет первый элемент из списка open. Достигнув цели, алгоритм возвращает путь, который ведет к решению. Заметим, что каждое состояние сохраняет информацию о предшествующем состоянии, чтобы впоследствии восстановить его и позволить алгоритму найти кратчайший путь к решению.
Если первый элемент в списке open не является решением, то алгоритм использует процедуры, чтобы сгенерировать все возможные потомки данного элемента. Если потомок уже находится в списке open или closed, то алгоритм выбирает кратчайший из двух возможных путей достижения этого состояния. Затем функция best_first_search вычисляет эвристическую оценку состояний в списке open и сортирует список в соответствии с этими эвристическим значениям. При этом «лучшие» состояния ставятся в начало списка. Заметим, что из-за эвристической природы оценивания следующее состояние должно проверяться на любом уровне пространства состояний. Отсортированный список open часто называют прuорuтетной очередью(priority queue).
Рис. 10.12. Эвристический поиск в гипотетическом пространстве состояний.
На рис. 10.12 показано гипотетическое пространство с эвристическими оценками некоторых из его состояний. Состояния, рядом с которыми стоит их эвристическая оценка, были сгенерированы функцией best_first_search. Состояния, по которым велся эвристический поиск, отмечены полужирном шрифтом; заметьте, что поиск не ведется по всему пространству. Другими словами, цель «жадного» алгоритма поиска состоит в том, чтобы прийти к целевому состоянию кратчайшим путем. Чем более обоснованной является эвристика, тем меньше состояний нужно проверить при поиске цели.
Путь, по которому функция best_first_search находит целевое состояние, показан на рисунке жирными стрелками. Предположим, что Р- целевос состояние (см. рис. 10.12). Поскольку Р — цель, состояния на пути к Римеют низкие эвристические значения. Эвристика подвержена ошибкам: состояние О имеет более низкое эвристическое значение, чем целевое, и поэтому было исследовано раньше. В отличие от поиска экстремума, который не сохраняет приоритетную очередь для отбора «следующих» состояний, данный алгоритм восстанавливается после ошибки и находит целевое состояние.
Ниже показан процесс реализации алгоритма best_first_search для графа из рис. 10.12., при этом Р — это желаемое целевое состояние.
После итерации | Список open | Списокclosed |
[А-5] | [ ] | |
[В-4, С-4,D-6 ] | [А-5] | |
[С-4, Е-5, F-5, D-6 ] | [В-4, А-5] | |
[Н-3, G-4, Е-5, F-5, D-6 ] | [С-4, В-4, А-5] | |
[O-2, P-3, G-4, Е-5, F-5, D-6 ] | [Н-3, С-4, В-4, А-5] | |
[P-3, G-4, Е-5, F-5, D-6] | [O-2, Н-3, С-4, В-4, А-5 ] | |
[G-4, Е-5, F-5, D-6] | [P-3, O-2, Н-3, С-4, В-4, А-5 ] |
Таблица 10.4. Состояние списков после каждой итерации «жадного» алгоритма поиска для графа на рис. 10.12.
0 итерация — Инициализируем списки. Список open =[A-5]; Списокclosed =[ ];
1 итерация – Выбираем первую вершину из списка openи определяем её как текущее состояние Х=А-5. Применяем процедуру определения потомков к Х=А-5, потомки есть, ими являются вершины В-4, С-4, D-6. Записываем слева направо эти вершины в список openв порядке возрастания эвристических оценок этих вершин,удаляя слева из этого списка вершину А-5 и записывая эту вершину в списокclosed слева направо. Далее алгоритм переходит к следующей итерации.
2 итерация – Выбираем первую вершину из списка openи определяем её как текущее состояние Х=В-4. Применяем процедуру определения потомков к Х= В-4, потомки есть, ими являются вершины Е-5, F-5. Записываем слева направо эти вершины в список openв порядке возрастания эвристических оценок этих вершин, удаляя слева из этого списка вершину В-4 и записывая эту вершину в списокclosed слева направо.
Далее алгоритм переходит к следующей итерации. Эти итерации продолжаются до тех пор пока текущее состояние Х не будет равно целевому состоянию P-3.
«Жадный» алгоритм поиска всегда выбирает наиболее перспективное и лучшее состояние в open для продолжения, кстати поэтому его назвали «жадным». Однако, поскольку при выборе состояния используется эвристика, которая может оказаться ошибочной, алгоритм не отказывается от остальных состояний, и сохраняет их в списке open. В данном случае эвристика обеспечивает поиск вниз; этот путь оказывается ошибочным, но алгоритм в итоге возвращается к некоторому ранее сгенерированному «лучшему» состоянию в open и затем продолжает поиск в другой части пространства. В примере на рис. 10.12 после нахождения потомков состояния В оказалось, что они имеют плохие эвристические оценки, и поэтому поиск сместился к состоянию С. При этом потомки состояния В были сохранены в open на случай, если алгоритму необходимо будет вернуться к ним позже. В функции best_first_search, как и в описаных ранее алгоритмах, список open позволяет возвращаться назад по ошибочному пути.