1.3 Стратегии поиска в пространстве состояний
Чтобы применять алгоритмы поиска, разработчик должен уметь анализировать, прогнозировать их поведение и знать, гарантировано ли нахождения решения в результате поиска, является ли поиск конечным, или возможны зацикливания, зависит ли процесс поиска от времени выполнения и используемой памяти, каким образом интерпретатор может упростить поиск, и как вообше разработать интерпретатор.
Рассмотрим процесс нахождения решения в пространстве состояний с помощью алгоритма generate-and-test (порождение и проверка), который состоит из следующих шагов:
Шаг 1. Сгенерировать новое состояние, модифицируя существующее; например, изменить последовательность букв, добавив новую в существующую последовательность.
Шаг 2. Проверить, не является ли образовавшееся состояние конечным (решением); в случае игры Scrabble, например, проверить, не является ли образовавшаяся последовательность осмысленным словом. Если это так, то завершить, иначе перейти к шагу 1.
Множество решений, которые удовлетворяют условию на шаге 2, иногда называют пространством решений.
Т.е. в алгоритме generate-and-test необходимо представить пространство состояний задачи в виде графа. Решение находится в результате полного перебора состояний – вершин графа.
1.3.1 Полный «грубый» перебор
Полный перебор («грубый» перебор, метод «грубой силы», brute force) − метод исчерпывания все возможных вариантов.
Рассмотрим данный метод с позиций комбинаторики. В комбинаторике выделяют два основных типа k-элементных выборок из n-элементных множеств (k≤n):
размещение (упорядоченная выборка или кортеж), когда задан порядок элементов в выборке;
сочетание (неупорядоченная выборка или подмножество).
Также разделяют случаи размещений и сочетаний с повторениями и без.
Рассмотрим пример: пусть оператор отделения связи имеет в распоряжении марки номиналами: 5 коп., 30 коп. и 50 коп. Т.е. исходное множество номиналов марок имеет вид Х={0.05, 0.30, 0.50}, n=3.
Перечислим для k=2 :
- все размещения без повторений
{(0.05,0.30), (0.05,0.50), (0.30,0.05), (0.30,0.50), (0.50,0.05), (0.50,0.30)};
- все сочетания без повторений
{(0.05,0.30), (0.05,0.50), (0.30,0.50)};
- все размещения с повторениями
{(0.05,0.05), (0.05,0.30), (0.05,0.50), (0.30,0.05), (0.30,0.30), (0.30,0.50), (0.50,0.05), (0.50,0.30), (0.50,0.50)};
- все сочетания с повторениями
{(0.05,0.05), (0.05,0.30), (0.05,0.50), (0.30,0.30), (0.30,0.50), (0.50,0.05)}.
Вычислительная сложность полного «грубого» перебора определяется размером пространства состояний. В данном случае для построения пространства состояний происходит генерация всех размещений с повторениями. Известно, что количество размещений с повторениями из n по k:
.
Рассмотрим пример, когда стоимость почтового отправления составляет 1 грн. 10 коп. В распоряжении оператора отделения связи находятся марки с номиналами: 5, 30 и 50 коп, а также 2 грн. Определим вычислительную сложность исчерпывания все возможных вариантов.
Расчёт
1.4 Однонаправленный и двунаправленный поиск
В большинстве случаев решение встречается значительно раньше последней комбинации, т.е. расположено до правого нижнего листа на дереве решений. Очевидно, что в таком случае полный «грубый» перебор всех состояний не оправдан. Поэтому важен порядок, в котором происходит развертывание графа (перебор состояний). Такой порядок определяется стратегией поиска.
Можно использовать теорию графов для анализа процедуры поиска. Поиск в пространстве состояний можно вести в двух направлениях: от исходных данных задачи (фактов) к цели и в обратном направлении от цели к исходным данным (фактам). Прямой поиск идет от исходного состояния, когда целевое состояние задано неявно, обратный — от целевого состояния, когда исходное состояние задано неявно, а целевое явно.
При прямом поиске (поиске на основе данных, data-driven search) исследователь начинает процесс решения задачи, анализируя ее условие, а затем применяет правила к известным фактам для получения новых фактов, которые, в свою очередь, используются для генерации других новых фактов, и т. д. Этот процесс продолжается до тех пор, пока не повезет, и не будет достигнуто целевое состояние.
При обратном поиске (поиске от цели, goal-directed strategy) вначале выдвигают цель, а затем возвращаются назад к фактам, пытаясь найти те, которые подтверждают эту цель. Если цель оказалась правильной, то выбирается следующая цель, которая детализирует первую и является по отношению к ней подцелью. Далее отыскиваются факты, подтверждающие истинность подчиненной цели. Поиск продолжается от подцелей, пока не будут достигнуты исходные данные задачи. Такую стратегию поиска называют управляемой целями.
Выбор стратегии зависит от структуры решаемой задачи. Процесс поиска от цели рекомендуется применять в тех случаях, когда цель поиска присутствует в постановке задачи. Поиск на основе данных применим к решению задач, в которых данные определены в постановке задачи и когда сформулировать цель очень трудно. В системах диагностики чаше применяется прямой поиск, в то время как в планирующих системах более эффективным оказывается обратный поиск.
Двунаправленный поиск осуществляется одновременно из исходного состояния и множества целевых состояний. Двунаправленный поиск заканчивается тогда, когда (и если) два фронта поиска встречаются. Такой поиск имеет преимущество перед однонаправленным поиском и требует решения двух проблем: смены направления поиска и оптимизации «точки встречи», так как прямой и обратный пути могут разойтись.
Определив направление поиска, алгоритм поиска должен определить порядок исследования состояний дерева или графа.
Алгоритм generate-and-test имеет два основных варианта: поиск в глубину (depth-first search) и поиск в ширину (breadth-first search). Отличаются варианты порядком формирования состояний на шаге 1. Сначала рассмотрим описания данных алгоритмов.
