Рис. 12.4. Отношение расширить
: расширение дерева Дер
до тех пор, пока Предел
, приводит к дереву Дер1
.
Предложение, относящееся к случаю
Дер = л( В, F/G)
порождает всех преемников вершины В
вместе со стоимостями дуг, ведущих в них из В
. Процедура преемспис
формирует список поддеревьев, соответствующих вершинам-преемникам, а также вычисляет их Предел
. Если преемников нет, то переменной ЕстьРеш
придается значение 'никогда' и в результате лист В
покидается навсегда.
Другие отношения:
после( В, В1, С) | В1 — преемник вершины В ; С — стоимость дуги, ведущей из В в В1 . |
h( В, H) | H — эвристическая оценка стоимости оптимального пути из вершины В в целевую вершину. |
макс_f( Fмакс) | Fмакс — некоторое значение, задаваемое пользователем, про которое известно, что оно больше любой возможной |
Рис. 12.5. Связь между
В следующих разделах мы покажем на примерах, как можно применить нашу программу поиска с предпочтением к конкретным задачам. А сейчас сделаем несколько заключительных замечаний общего характера относительно этой программы. Мы реализовали один из вариантов эвристического алгоритма, известного в литературе как А*-алгоритм (ссылки на литературу см. в конце главы). А*-алгоритм привлек внимание многих исследователей. Здесь мы приведем один важный результат, полученный в результате математического анализа А*-алгоритма:
Алгоритм поиска пути называют
для всех вершин
Этот результат имеет огромное практическое значение. Даже если нам не известно точное значение
Существует тривиальная нижняя грань, а именно:
И при таком значении
12.1. Определите отношения после
, цель
и h
для задачи поиска маршрута рис. 12.2. Посмотрите, как наш алгоритм поиска с предпочтением будет вести себя при решении этой задачи.
12.2. Поиск c предпочтением применительно к головоломке 'игра в восемь'
Если мы хотим применить программу поиска с предпочтением, показанную на рис. 12.3, к какой- нибудь задаче, мы должны добавить к нашей программе отношения, отражающие специфику этой конкретной задачи. Эти отношения определяют саму задачу ('правила игры'), а также вносят в алгоритм эвристическую информацию о методе ее решения. Эвристическая информация задается в форме эвристической функции.
/* Процедуры, отражающие специфику головоломки
'игра в восемь'.
Текущая ситуация представлена списком положений фишек;
первый элемент списка соответствует пустой клетке.
Пример:
┌───┐
3│123│ Эта позиция представляется так:
2│8 4│ [2/2, 1/3, 2/3, 3/3, 3/2, 3/1, 2/1, 1/1, 1/2]
1│765│
└───┘
123
'Пусто' можно перемещать в любую соседнюю клетку,