Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лахов.doc
Скачиваний:
1
Добавлен:
15.04.2019
Размер:
380.42 Кб
Скачать

Поиск в глубину, в ширину и по наилучшему варианту

Мы уже попытались определить функцию ПОИСК в гибком и, используя функциональную абстракцию, в весьма общем виде. Наиболее важные способы поиска, т.е. поиск в глубину (depth-first), поиск в ширину (breadth-first) и поиск по наилучшему варианту (best-first) отличаются друг от друга лишь тем, в каком порядке изучаются состояния пространства поиска.

Это свойство абстрагировано в функциональный аргумент ПОРЯДОК. Значением этой функции в каждой ситуации будет список анализируемых продукций (ПЛАН) в порядке, соответствующим способу поиска.

Порядок состояний при поиске в глубину определяется следующим образом:

(defun in-glub (plan)

(append (primenim (second (car plan)))

(cdr plan))

)

В процессе поиска сначала изучают состояния непосредственно следующие за первым состоянием. Таким образом, поиск осуществляется в пространстве поиска сначала в глубину, возврат происходит после иссле

д

(marsh ’stokgolm ’viborg ’in-glub)

(stokgolm helsinki tallinn leningrad viborg )

ования наиболее далёких состояний.

При поиске в ширину сначала изучаются все состояния каждого уровня и лишь после этого происходит переход на большую глубину. В функции упорядочивания это означает , что в каждом состоянии достижимые из первого состояния возможности помещаются в конец плана:

(defun in-shir (plan)

(append (cdr plan)

(primenim (second (car plan))))

)

(marsh ’stokgolm ’viborg ’in-shir)

(stokgolm helsinki tallinn leningrad viborg )

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

(defun best1 (plan)

(sort (append (primenim (second (car plan)))

(cdr plan))

#'kriter)

)

SORT – это общая функция упорядочивания Коммон Лиспа и КРИТЕРИЙ – некоторый двуместный предикат, определяющий порядок двух состояний.

Предположим, например, что мы предпочитаем сначала более северные маршруты и что географическая широта городов храниться в виде их свойства ШИРОТА. В этом случае КРИТЕРИЙ можно определить следующим образом:

(defun kriter (x y)

(>= (get (second x) 'shirot)

(get (second y) 'shirot)))

(setf (get 'helsinki 'shirot) 4)

(setf (get 'stokgolm 'shirot) 1)

(setf (get 'tallinn 'shirot) 2)

(setf (get 'leningrad 'shirot) 3)

(setf (get 'viborg 'shirot) 5)

(marsh ’stokgolm ’viborg ’best1)

(stokgolm helsinki leningrad viborg )

Использование этого способа поиска дает результат, отличный от результата, полученного при использовании поиска в глубину и поиска в ширину. При попытке сначала выбрать более северные варианты, будет найден второй возможный вариант решения, который совсем не исследует Таллинн.

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

Лекция №7 макросы

Часто бывает полезно не выписывать вычисляемые выражения вручную, а сформировать его с помощью программы. Эта идея автоматического динамического программирования особенно хорошо реализуется в ЛИСПе, поскольку программа в этом языке также представляется в виде списка. При этом вычисление такого выражения или его части при необходимости можно предотвратить блокировкой (QUOTE), например с целью преобразования выражения. Для вычисления уже сформированного выражения программист всегда может вызвать интерпретатор (EVAL). Предусмотренные в ЛИСПе специальные способы обработки аргументов открывают возможность для комбинирования различных методов.

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