Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
часть II Искусственный интеллект.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
4.04 Mб
Скачать

10.3.1. "Жадный" алгоритм поиска

Наиболее простой путь эвристического поиска - это применение процедуры поиска экстремума (hill climbing). Стратегии, основанные на поиске экстремума, оценивают не только текущее состояние поиска, но и его потомков. Для дальнейшего поиска выбирается наилучший потомок; при этом о его братьях и родителях просто забывают. Поиск прекра­щается, когда достигается состояние, которое лучше чем любой из его наследников. Поиск экстремума - название стратегии, которая может быть использована энергичным, но сле­пым альпинистом, поднимающимся вдоль наиболее крутого склона до тех пор, пока он не сможет идти дальше. Так как в этой стратегии данные о предыдущих состояниях не сохра­няются, то алгоритм не может быть восстановлен из точки, которая привела к "неудаче".

Основная проблема стратегий поиска экстремума - это их тенденция останавливать­ся в локальном максимуме. Другими словами, как только они достигают состояния, имеющего лучшую оценку, чем его потомки, алгоритм завершается. Если это состояние является не решением задачи, а только локальным максимумом, то такой алгоритм не­приемлем для данной задачи. Это значит, что решение может быть оптимальным на ог­раниченном множестве, но из-за формы всего пространства, возможно, никогда не будет выбрано наилучшее решение. Пример такого локального экстремума появляется в игре в"пятнашки". Часто для того, чтобы передвинуть фишку в нужную позицию, необходимо

сдвинуть фишку, находящуюся в наилучшей позиции. Без этого невозможно решить головоломку, но в то же время на данном этапе это ухудшает состояние системы. Дело в том, что "лучший" не означает "идеальный". Методы поиска без механизмов возврата или других приемов восстановления не могут отличить локальный максимум от глобаль­ного. Существуют методы приближенного решения этой проблемы, например, случайное возмущение оценки. Однако гарантированно решать задачи с использованием техники поиска экстремума нельзя.

Несмотря на эти ограничения, алгоритм поиска экстремума может быть достаточно эф­фективным, если оценивающая функция позволяет избежать локального максимума и за­цикливания алгоритма. В общем, однако, эвристический поиск требует более гибкого метода, предусмотренного в "жадном" алгоритме поиска, где при использовании приоритет­ной очереди возможно восстановление алгоритма из точки локального максимума.

Подобно алгоритмам поиска в глубину и алгоритмам поиска в ширину, описанными ранее, "жадный" алгоритм поиска использует списки сохраненных состояний: список open

отслеживает текущее состояние поиска, а в closed записываются уже проверенные

153

состояния. На каждом шаге алгоритм записывает в список open состояние с учетом некоторой эвристической оценки его "близости к цели". Таким образом, на каждой итерации рассматриваются наиболее перспективные состояния из списка open.

На каждой итерации функция best_first_search, реализующая «жадный» алгоритм удаляет первый элемент из списка open. Достигнув цели, алгоритм возвращает путь, который ведет к решению. За­метим, что каждое состояние сохраняет информацию о предшествующем состоянии, чтобы впоследствии восстановить его и позволить алгоритму найти кратчайший путь к решению.

Если первый элемент в списке open не является решением, то алгоритм использует процедуры, чтобы сгенерировать все возможные потомки данного элемента. Если потомок уже находится в списке open или closed, то ал­горитм выбирает кратчайший из двух возможных путей достижения этого состояния. Затем функция best_first_search вычисляет эвристическую оценку состояний в списке open и сортирует список в соответствии с этими эвристическим значениям. При этом "лучшие" состояния ставятся в начало списка. Заметим, что из-за эвристической природы оценивания следующее состояние должно проверяться на любом уровне про­странства состояний. Отсортированный список open часто называют прuорuтетной очередью (priority queue).

А-5

C-4

B-4

D-6

E-5

F-5

G-4

1

H-3

J

K

L

M

N

O-2

P-3

Q

R

T

S

Рис. 10.12. Эвристический поиск в гипотетическом пространстве состояний.

На рис. 10.12 показано гипотетическое пространство с эвристическими оценками некото­рых из его состояний. Состояния, рядом с которыми стоит их эвристическая оценка, были сгенерированы функцией best_first_search. Состояния, по которым велся эвристи­ческий поиск, отмечены полужирном шрифтом; заметьте, что поиск не ведется по всему пространству. Другими словами, цель "жадного" алгоритма поиска состоит в том, чтобы прийти к целевому состоянию кратчайшим путем. Чем более обоснованной является эври­стика, тем меньше состояний нужно проверить при поиске цели.

Путь, по которому функция best_first_search находит целевое состояние, по­казан на рисунке жирными стрелками. Предположим, что Р- целевос состояние (см. рис. 10.12). Поскольку Р - цель, состояния на пути к Р имеют низкие эвристические зна­чения. Эвристика подвержена ошибкам: состояние О имеет более низкое эвристическое значение, чем целевое, и поэтому было исследовано раньше. В отличие от поиска экстре­мума, который не сохраняет приоритетную очередь для отбора "следующих" состояний, данный алгоритм восстанавливается после ошибки и находит целевое состояние.

Ниже показан процесс реализации алгоритма best_first_search для графа из рис. 10.12., при этом Р - это желаемое целевое состояние.

После итерации

Список open

Список closed

0

[А-5]

[ ]

1

[ В-4, С-4, D-6 ]

[А-5]

2

[С-4, Е-5, F-5, D-6 ]

[В-4, А-5]

3

[Н-3, G-4, Е-5, F-5, D-6 ]

[С-4, В-4, А-5]

4

[ O-2, P-3, G-4, Е-5, F-5, D-6 ]

[Н-3, С-4, В-4, А-5]

5

[P-3, G-4, Е-5, F-5, D-6]

[ O-2, Н-3, С-4, В-4, А-5 ]

6

[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 позволяет воз­вращаться назад по ошибочному пути.