Методы поиска с возвратами
Возможно сформулировать задачи УО в виде задач поиска, что позволяет решать задачи УО с помощью алгоритмов поиска. Поиск с возвратами, описанный в главах 4 и 6, может использоваться для задач удовлетворения ограничений[8].
Нвпомним, что поиск в глубину, в котором каждый раз выбираются значения для одной переменной и выполняется возврат, если больше не остается допустимых значений, которые можно было бы присвоить переменной, называется поиском с возвратами (backtracking).
Дерево присвоений значений переменным ‑ это дерево, в котором каждая вершина соответствует множеству присвоений, причем корень дерева отвечает пустому множеству присвоений. В каждой вершине выбирается переменная, которой в не было присвоено значение. Алгоритмы поиска с возвратами выполняют поиск в глубину в этих деревьях присвоений значений.
Алгоритмы поиска с возвратами ‑ это алгоритмы систематического поиска для задач УО, которые используют частичные присвоения, и строят частичное решение путем поочередного присваивания значений переменным. Если алгоритм обнаруживает тупик, в котором частичное решение не имеет совместимого расширения, то выбор последнего присвоения отменяется и делается попытка присвоения другого значения. Этот процесс повторяется до тех пор, пока не будут исчерпаны все возможности и/или не будет найдено решение.
Алгоритмы поиска с возвратами являются полными в том смысле, что они находят решение, если оно существует.
Алгоритм поиска с возвратами характеризуется экспоненциальной временной сложностью, но является линейным по используемой памяти.
Простейшим методом решения задач УО является метод ''Generate and Test'', который порождает каждое возможное решение (путем присвоения всех возможных значений для каждой переменной) и проверяется, удовлетворяет ли оно всем ограничениям. В наихудшем случае число всех возможных проверенных решений равно размеру декартова произведения доменов всех переменных (см. 6.1.1), в связи с чем метод полного перебора может требовать больших затрат времени при решении задач.
Хронологический поиск с возвратами (chronological backtracking) усовершенствует схему ''Generate and Test'', рассматривая процесса поиска как постепенное расширение частичных решений. Порядок задания значений ‑ это порядок, в котором присваиваются значения переменным во время поиска. На уровне порядка присваивания прошлые (т.е. ранее рассмотренные) переменные имеют индексы, меньшие чем , причем им уже присвоены значения. Будущие переменные имеют индексы, большие, чем , и им еще не присвоены значения.
На рис. 10.5 на псевдокоде описан алгоритм поиска с возвратами для случая бинарных ограничений. Для простоты, псевдокод не различает случаев, когда не найдено решений или когда не найдено больше решений, возвращается значение ложь в обоих случаях.
|
Рис. 10.5. Поиск с возвратами.
Функция возвращает значение истина, если бинарное ограничение удовлетворяется текущими присвоениями значений переменным и . Если не существует, Test( ) возвращает истина (это не считается проверкой ограничения). Каждый элемент домена поочередно присваивается переменной , расширяя тем самым текущее присвоение переменным . Если проверка ограничения для предыдущей переменной не проходит, это частичное присвоение больше не расширяется. Если домен исчерпан (тупик или полное исчерпание домена), алгоритм делает возврат до уровня с целью нахождения другого совместимого присвоения для . Если такого нет, он делает возврат к , и т.д. пока не будет найдена переменная с другим совместимым присвоением или будет показано, что ЗУО не имеет решения.
Для данного совместимого присвоения (все проверки ограничений были успешны), делается рекурсивный вызов BT или, если не остается свободных переменных, получено решение.
Поиск с возвратами может рассматриваться как обход вершин дерева.
Рис. 10.6. Поиск с возвратами как обход дерева.
На рис. 10.6 показано, как поиск с возвратами решает задачу на рис. 10.4.
Каждая ветвь соответствует частичному присвоению (которое становится полным, когда ветвь доходит до переменной ) и уровень дерева представляет выборы значений, сделанные для -й переменной (согласно упорядочению). Глубиной называется расстояние от корня дерева. Черные и белые вершины представляют соответственно успешные и неудачные присвоения в данной точке поиска. Вершины снабжены описанием значений доменов, приписанных данной переменной в рассматриваемой точке поиска. Путь поиска показан пунктирной направленной линией.
Поиск с возвратами неэффективен в том смысле, что требует выполнения большего числа операций, чем это нужно для нахождения решения.
Для усовершенствования поиска с возвратами используются множества неперспективных наборов значений (МННЗ). В контексте задач выполнимости МННЗ соответствует клаузе (дизъюнкту), причем использование обучения и использования большого числа клауз во время поиска оказалось весьма эффективным для решения задач выполнимости.
Дата добавления: 2016-06-05; просмотров: 3269;