Вход/Регистрация
Prolog
вернуться

Неизвестно

Шрифт:

е с

a d b

================

Назад | Содержание | Вперёд

Назад | Содержание | Вперёд

11. 3. Поиск в ширину

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

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

Рис. 11. 9. Простое пространство состояний: а– стартовая вершина,

f и j - целевые вершины. Применение стратегии поиска в ширину

дает следующий порядок прохода по вершинам: а, b, c, d, e, f. Более

короткое решение [a, c, f] найдено раньше, чем более длинное

[а, b, e, j]

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

вширину( Пути, Решения)

истинна только тогда, когда существует путь из множества кандидатов Пути, который может быть продолжен вплоть до целевой вершины. Этот продолженный путь и есть Решение.

11. 3. 1. Списковое представление множества кандидатов

В нашей первой реализации этой идеи мы будем использовать следующее представление для множества

решить( Старт, Решение) :-

вширину( [ [Старт] ], Решение).

вширину( [ [Верш | Путь] | _ ], [Верш | Путь] ) :-

цель( Верш).

вширину( [ [В | Путь] | Пути], Решение ) :-

bagof( [B1, В | Путь ],

( после( В, В1), not принадлежит( В1, [В | Путь])),

НовПути),

% НовПути - ациклические продолжения пути [В | Путь]

конк( Пути, НовПути, Пути1), !,

вширину( Путь1, Решение);

вширину( Пути, Решение).

% Случай, когда у В нет преемника

Рис. 11. 10. Реализации поиска в ширину.

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

[ [СтартВерш] ]

Общие принципы поиска в ширину таковы:

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

если голова первого пути - это целевая вершина, то взять этот путь в качестве решения, иначе

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

В случае примера рис.11.9 этот процесс будет развиваться следующим образом:

решить( Старт, Решение) :-

вширь( [ [Старт] | Z ]-Z, Решение).

вширь( [ [Верш | Путь] | _ ]-_, [Верш | Путь] ) :-

цель( Верш).

вширь( [ [В | Путь] | Пути]-Z, Решение ) :-

bagof( [B1, В | Путь ],

  • Читать дальше
  • 1
  • ...
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: