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

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

Жанры

Неизвестно

Шрифт:

В качестве примера рассмотрим ситуацию, которая возникает после того, как порождены три уровня дерева рис. 11.9. Множество путей-кандидатов в случае спискового представления имеет вид:

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

В виде дерева это множество выглядит так:

д( а, [д( b, [л( d), л( е)] ), д( с, [л( f), л( g)] )] )

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

В случае спискового представления множества кандидатов

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

расширить( Путь, Дер, Дер1, ЕстьРеш, Решение)

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

Рис. 11. 12. Отношение paсширить( Путь, Дер, Дер1, ЕстьРеш, Решение):

s– стартовая вершина, g– целевая вершина. Решение– это Путь,

продолженный вплоть до g. Дер1– результат расширения дерева

Дер на один уровень вниз.

получить поддерево Дер1 как результат расширения Дер на один уровень. Но в случае, когда в процессе расширения поддерева Дер встретится целевая вершина, процедура расширить должна сформировать соответствующий решающий путь.

Итак, процедура расширить будет порождать два типа результатов. На конкретный вид результата будет указывать значение переменной ЕстьРеш:

(1) ЕстьРеш = да

Решение = решающий путь, т. е. Путь, продолженный до целевой вершины.

Дер1 = неконкретизировано.

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

(2) ЕстьРеш = нет

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

Решение = неконкретизировано.

Если в дереве Дер нет ни одной целевой вершины и, кроме

того, оно не может быть расширено, то процедура расширить терпит неудачу.

Процедура верхнего уровня для поиска в ширину

вширину( Дер, Решение)

отыскивает Решение либо среди множества кандидатов Дер, либо в его расширении. На рис. 11.3 показано, как выглядит программа целиком. В этой программе имеется вспомогательная процедура расширитьвсе. Она расширяет все деревья из некоторого списка, и затем, выбросив все "тупиковые" деревья", собирает все полученные расширенные деревья в один новый список. Используя механизм возвратов, она также порождает все решения, обнаруженные в деревьях из списка. Имеется одна дополнительная деталь: по крайней мере одно из деревьев должно "вырасти". Если это не так, то процедуре расширитьвсе не удается получить ни одного расширенного дерева - все деревья из списка оказываются "тупиковыми".

% ПОИСК В ШИРИНУ

% Множество кандидатов представлено деревом

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

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

вширину( Дер, Решение) :-

расширить( [ ], Дер, Дер1, ЕстьРеш, Решение),

( ЕстьРеш = да;

ЕстьРеш = нет, вширину( Дер1, Решение) ).

расширить( П, Л( В), _, да, [В | П] ) :-

цель( В).

расширить( П, Л( В), д( В, Пд), нет, _ ) :-

bagof( л( B1),

( после( В, B1), not принадлежит( В1, П)), Пд).

расширить( П, д( В, Пд), д( В, Пд1), ЕстьРеш, Реш) :-

расширитьвсе( [В | П], Пд, [ ], Пд1, ЕстьРеш, Реш).

расширитьвсе( _, [ ], [Д | ДД], [Д | ДД], нет, _ ).

% По крайней мере одно дерево должно вырасти

расширитьвсе( П, [Д | ДД], ДД1, Пд1, ЕстьРеш, Реш) :-

расширить ( П, Д, Д1, ЕстьРеш1, Реш),

( ЕстьРеш 1= да, ЕстьРеш = да;

ЕстьРеш1 = нет, !,

расширитьвсе( П, ДД, [Д1 | ДД1], Пд1, ЕстьРеш, Реш));

расширитьвсе( П, ДД, ДД1, Пд1, ЕстьРеш, Реш ).

Рис. 11. 13. Реализация поиска в ширину с использованием

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

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

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

Бернард Шоу

Пирсон Хескет
След в истории
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Бернард Шоу

Аракчеев

Гейнце Николай Эдуардович
Проза:
историческая проза
6.25
рейтинг книги
Аракчеев

Вечный зов. Знаменитый роман в одном томе

Иванов Анатолий Степанович
Проза:
современная проза
9.15
рейтинг книги
Вечный зов. Знаменитый роман в одном томе

Черный Баламут. Трилогия

Олди Генри Лайон
Черный Баламут
Фантастика:
героическая фантастика
5.00
рейтинг книги
Черный Баламут. Трилогия

Горы судьбы (сборник)

Карсак Франсис
Классика мировой фантастики
Фантастика:
научная фантастика
7.86
рейтинг книги
Горы судьбы (сборник)

Газлайтер. Том 10

Володин Григорий Григорьевич
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Твое… величество!

Гончарова Галина Дмитриевна
1. Твое… величество!
Фантастика:
фэнтези
историческое фэнтези
5.00
рейтинг книги
Твое… величество!

Все московские повести (сборник)

Трифонов Юрий Валентинович
Проза:
советская классическая проза
5.00
рейтинг книги
Все московские повести (сборник)

Князь Медведев. Дилогия

Вяч Павел
Медведев
Фантастика:
аниме
фэнтези
попаданцы
5.67
рейтинг книги
Князь Медведев. Дилогия

Стражи Хейвена

Грин Саймон
Фантастика:
героическая фантастика
7.00
рейтинг книги
Стражи Хейвена

Трилогия «Двуединый»

Сазанов Владимир Валерьевич
Фантастика:
фэнтези
6.12
рейтинг книги
Трилогия «Двуединый»

Хроники железных драконов

Суэнвик Майкл
Фантастика:
фэнтези
7.25
рейтинг книги
Хроники железных драконов

Туман. Авель Санчес; Тиран Бандерас; Салакаин отважный. Вечера в Буэн-Ретиро

де Унамуно Мигель
141. Библиотека всемирной литературы
Проза:
классическая проза
5.00
рейтинг книги
Туман. Авель Санчес; Тиран Бандерас; Салакаин отважный. Вечера в Буэн-Ретиро

Публичное одиночество

Михалков Никита Сергеевич
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Публичное одиночество