поддерева
(1)
(2) обнаружится, что найдено решающее дерево.
В связи с этим, начиная просмотр поддерева-кандидата
Рис. 13.10. Трассировка процесса поиска с предпочтением в И/ИЛИ-графе (
13.4.2. Программа поиска
Программа, в которой реализованы идеи предыдущего раздела, показана на рис. 13.12. Прежде, чем мы перейдем к объяснению отдельных деталей этой программы, давайте рассмотрим тот способ представления дерева поиска, который в ней используется.
Существует несколько случаев, как показано на рис. 13.11. Различные формы представления поискового дерева возникают как комбинации следующих возможных вариантов, относящихся к размеру дерева и к его 'решающему статусу'.
• Размер:
(1) дерево состоит из одной вершины (листа) или
(2) оно имеет корень и (непустые) поддеревья.
• Решающий статус:
(1) обнаружено, что дерево соответствует решению задачи (т.е. является решающим деревом) или
(2) оно все еще решающее дерево-
Рис. 13.11. Представление дерева поиска.
Основной функтор, используемый для представления дерева, указывает, какая из комбинаций этих воз-можностей имеется в виду. Это может быть одна из следующих комбинаций:
лист решлист дер решдер
Далее, в представление дерева входят все или некоторые из следующих объектов:
• корневая вершина дерева,
•
• стоимость С дуги И/ИЛИ-графа, ведущей в корень дерева,
• список поддеревьев,
• отношение (И или ИЛИ) между поддеревьями.
Список поддеревьев всегда упорядочен по возрастанию
Обратимся теперь к программе рис. 13.12. Отношение самого высокого уровня — это
и_или( Верш, РешДер)
где Верш
— стартовая вершина. Программа строит решающее дерево (если таковое существует), рассчитывая на то, что оно окажется оптимальным решением. Будет ли это решение в действительности самым дешевым, зависит от той функции и_или
найдет оптимальное решение. Если же
Основную роль в программе рис. 13.12 играет отношение
расширить( Дер, Предел, Дер1, ЕстьРеш)
Дер
и Предел
— его 'входные' аргументы, а Дер1
и ЕстьРеш
— 'выходные'. Аргументы имеют следующий смысл:
Дер
— дерево поиска, подлежащее расширению.
Предел
— предельное значение Дер
.
ЕстьРеш
— индикатор, значения которого указывают на то, какой из следующих трех случаев имеет место:
(1) ЕстьРеш = да
: Дер
можно 'нарастить' (с учетом ограничения Предел
) таким образом, чтобы образовалось решающее дерево Дер1
.
(2) ЕстьРеш = нет
: дерево Дер
можно расширить до состояния Дер1
, для которого Предел
, но прежде чем Предел
, решающее дерево не было обнаружено.
(3) ЕстьРеш = никогда
: Дер
не содержит решения.
В зависимости от случая Дер1
— это либо решающее дерево, либо Дер
, расширенное до момента перехода через Предел
; если ЕстьРеш = никогда
, то переменная Дер1
неинициализирована.
Процедура
расширспис( Деревья, Предел, Деревья1, ЕстьРеш)
аналогична процедуре расширить
. Так же, как и в процедуре расширить
, Предел
задает ограничение на рост дерева, а ЕстьРеш
— это индикатор, указывающий, каков результат расширения ('да', 'нет' или