Чтение онлайн

на главную - закладки

Жанры

Неизвестно

Шрифт:

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

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

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

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

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

с полученным новым множеством.

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

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

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

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

цель( Верш).

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

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

( после( В, В1),

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

Нов ),

конк( Нов, ZZ, Z), !,

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

Пути \== Z, % Множество кандидатов не пусто

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

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

программа рис.11.10. Усовершенствование основано на разностном

представлении списка путей-кандидатов.

(1) Начинаем с начального множества кандидатов:

[ [а] ]

(2) Порождаем продолжения пути [а]:

[ [b, а], [с, а] ]

(Обратите внимание, что пути записаны в обратном порядке.)

(3) Удаляем первый путь из множества кандидатов и порождаем его продолжения:

[ [d, b, a], [e, b, а] ]

Добавляем список продолжений в конец списка кандидатов:

[ [с, а], [d, b, a], [e, b, а] ]

(4) Удаляем [с, а], а затем добавляем все его продолжения в конец множества кандидатов. Получаем:

[ [d, b, a], [e, b, а], [f, c, a], [g, c, a] ]

Далее, после того, как пути [d, b, a] и [e, b, а] будут продолжены, измененный список кандидатов примет вид

[[f, c, a], [g, c, a], [h, d, b, a], [i, e, b, a], [j, e, b, a]]

В

этот момент обнаруживается путь [f, c, a], содержащий целевую вершину f. Этот путь выдается в качестве решения.

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

Недостатком этой программы является неэффективность операции конк. Положение можно исправить, применив разностное представление списков (см. гл. 8). Тогда множество путей-кандидатов будет представлено парой списков Пути и Z, записанной в виде

Пути-Z

При введении этого представления в программу рис. 11.10 ее можно постепенно преобразовать в программу, показанную на рис. 11.11. Оставим это преобразование читателю в качестве упражнения.

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

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

Случай 1: Дерево состоит только из одной вершины В; В этом случае оно имеет вид терма л( В); Функтор л указывает на то, что В - это лист дерева.

Случай 2: Дерево состоит из корневой вершины В и множества поддеревьев Д1, Д2, ... . Такое дерево представляется термом

д( В, Пд)

где Пд– список поддеревьев:

Пд = [ Д1, Д2, ...]

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

Битва королей

Мартин Джордж Р.Р.
Фантастика:
фэнтези
5.00
рейтинг книги
Битва королей

Система Возвышения. (цикл 1-8) - Николай Раздоров

Раздоров Николай
Система Возвышения
Фантастика:
боевая фантастика
4.65
рейтинг книги
Система Возвышения. (цикл 1-8) - Николай Раздоров

Перстень Левеншельдов (сборник)

Лагерлёф Сельма
Проза:
классическая проза
5.00
рейтинг книги
Перстень Левеншельдов (сборник)

Я великий друид которому 400 лет! Том 15

Дорничев Дмитрий
15. Возвращение Великого
Фантастика:
рпг
фэнтези
попаданцы
5.00
рейтинг книги
Я великий друид которому 400 лет! Том 15

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Ничего святого (Сборник)

Зорич Александр
Сборник «Ничего святого»
Фантастика:
научная фантастика
7.00
рейтинг книги
Ничего святого (Сборник)

Дважды одаренный. Том V

Тарс Элиан
5. Дважды одаренный
Фантастика:
аниме
альтернативная история
городское фэнтези
5.25
рейтинг книги
Дважды одаренный. Том V

Божественная комедия (илл. Доре)

Алигьери Данте
Старинная литература:
европейская старинная литература
7.62
рейтинг книги
Божественная комедия (илл. Доре)

В. И. Ленин и ВЧК. Сборник документов (1917–1922)

Ленин Владимир Ильич
Документальная литература:
прочая документальная литература
6.25
рейтинг книги
В. И. Ленин и ВЧК. Сборник документов (1917–1922)

Я еще князь. Книга XX

Дрейк Сириус
20. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще князь. Книга XX

Биография отца Бешеного

Доценко Виктор Николаевич
Бешеный
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Биография отца Бешеного

Шайтан Иван 4

Тен Эдуард
4. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
8.00
рейтинг книги
Шайтан Иван 4

Фамильяр

Романов Андрей Вениаминович
Фантастика:
фэнтези
7.38
рейтинг книги
Фамильяр

Философия. Книга вторая. Просветление экзистенции

Ясперс Карл Теодор
Научно-образовательная:
философия
5.00
рейтинг книги
Философия. Книга вторая. Просветление экзистенции