прыжки на спине
В обратного отслеживания алгоритмах обратный прыжок — это метод, который уменьшает пространство поиска , тем самым повышая эффективность. Хотя возврат всегда поднимается на один уровень вверх в дереве поиска , когда все значения переменной проверены, обратный переход может подниматься на несколько уровней выше. В этой статье фиксированный порядок оценки переменных используется, но те же соображения применимы и к динамическому порядку оценки.
- Дерево поиска, посещаемое при обычном возврате
- Обратный прыжок: серый узел не посещается
Определение
[ редактировать ]Всякий раз, когда при возврате перепробованы все значения переменной и не найдено никакого решения, он пересматривает последнюю из ранее присвоенных переменных, изменяя ее значение или совершая дальнейший возврат, если другие значения не должны быть проверены. Если — текущее частичное присвоение и все значения для были опробованы, но не нашли решения, возврат к выводу, что ни одно решение не расширяет существует. Затем алгоритм «поднимается» к , изменение значение, если возможно, в противном случае снова возвращаемся.
Частичное присвоение не всегда необходимо в полном объеме, чтобы доказать отсутствие значения приводит к решению. В частности, таким же свойством может обладать префикс частичного присваивания, то есть существовать индекс такой, что не может быть расширено для формирования решения с каким бы то ни было значением . Если алгоритм сможет доказать этот факт, он сможет напрямую рассмотреть другое значение для вместо того, чтобы пересмотреть как это обычно бывает.
Эффективность алгоритма обратного прыжка зависит от того, насколько высоко он способен совершить обратный прыжок. В идеале алгоритм мог бы перейти от к любой переменной такова, что текущее присвоение не может быть продолжено для получения решения с любым значением . Если это так, называется безопасным прыжком .
Установить, безопасен ли переход, не всегда возможно, поскольку безопасные переходы определяются с точки зрения набора решений, который и пытается найти алгоритм. На практике алгоритмы обратного прыжка используют наименьший индекс, который они могут эффективно доказать как безопасный прыжок. Разные алгоритмы используют разные методы определения безопасности прыжка. Эти методы имеют разную стоимость, но более высокая стоимость поиска более высокого безопасного прыжка может быть компенсирована сокращением объема поиска из-за пропуска частей дерева поиска.
Обратный прыжок на листовых узлах
[ редактировать ]Простейшее условие, при котором возможен обратный прыжок, — это когда все значения переменной оказались несовместимыми без дальнейшего ветвления. При удовлетворении ограничений частичная оценка непротиворечива тогда и только тогда, когда она удовлетворяет всем ограничениям, включающим назначенные переменные, и несовместима в противном случае. Может случиться так, что непротиворечивое частичное решение не может быть расширено до непротиворечивого полного решения, поскольку некоторые из неназначенных переменных не могут быть присвоены без нарушения других ограничений.
Состояние, при котором все значения данной переменной несовместимы с текущим частичным решением называется листовым тупиком . Это происходит именно тогда, когда переменная является листом дерева поиска (который соответствует узлам, имеющим только дочерние листья на рисунках этой статьи).
Алгоритм обратного прыжка Джона Гашнига выполняет обратный прыжок только в тупиках листьев. Другими словами, он работает иначе, чем возврат назад, только когда каждое возможное значение было протестировано и оказалось противоречивым без необходимости ветвления по другой переменной.
Безопасный прыжок можно найти, просто вычислив для каждого значения , самый короткий префикс несовместимый с . Другими словами, если это возможное значение для , алгоритм проверяет согласованность следующих оценок:
... | ||||
... | ||||
... | ||||
Наименьший индекс (самый нижний в списке), для которого оценки противоречивы, будет безопасным скачком, если были единственной возможной ценностью для . Поскольку каждая переменная обычно может принимать более одного значения, максимальный индекс, который получается в результате проверки для каждого значения, представляет собой безопасный переход и является точкой перехода алгоритма Джона Гашнига.
На практике алгоритм может проверять приведенные выше оценки одновременно с проверкой согласованности .
Прыжки назад во внутренних узлах
[ редактировать ]Предыдущий алгоритм выполняет обратный переход только тогда, когда значения переменной могут оказаться несовместимыми с текущим частичным решением без дальнейшего ветвления. Другими словами, он допускает обратный переход только на конечных узлах дерева поиска.
Внутренний узел дерева поиска представляет собой присвоение переменной, согласованной с предыдущими. Если ни одно решение не расширяет это назначение, предыдущий алгоритм всегда возвращается назад: в этом случае обратный прыжок не выполняется.
Обратный переход на внутренних узлах не может быть выполнен, как на листовых узлах. Действительно, если некоторые оценки требуется ветвление, потому что они соответствуют текущему назначению. В результате поиск префикса, не соответствующего этим значениям последней переменной, не увенчается успехом.
В таких случаях, что доказала оценка не быть частью решения с текущей частичной оценкой это рекурсивный поиск. В частности, алгоритм «знает», что с этого момента решения не существует, поскольку он возвращается к этому узлу вместо того, чтобы остановиться после нахождения решения.
Этот возврат обусловлен рядом тупиков , точек, в которых алгоритм доказал несовместимость частичного решения. Для дальнейшего обратного прыжка алгоритм должен учитывать, что невозможность нахождения решения связана с этими тупиками. В частности, безопасные переходы — это индексы префиксов, которые по-прежнему делают эти тупики несовместимыми частичными решениями.
Другими словами, когда все значения были опробованы, алгоритм может вернуться к предыдущей переменной при условии, что текущая оценка истинности несовместимо со всеми истинными оценками в листовых узлах, которые являются потомками узла .
Упрощения
[ редактировать ]Из-за потенциально большого количества узлов, находящихся в поддереве , информация, необходимая для безопасного прыжка назад с собирается во время посещения его поддерева. Поиск безопасного прыжка можно упростить с помощью двух соображений. Во-первых, алгоритму нужен безопасный прыжок, но он по-прежнему работает с прыжком, который не является максимально безопасным.
Второе упрощение заключается в том, что узлы поддерева которые были пропущены прыжком назад, можно игнорировать при поиске прыжка назад для . Точнее, все узлы, пропущенные обратным переходом от узла до узла не имеют отношения к поддереву с корнем в , а также не имеют значения другие их поддеревья.
Действительно, если алгоритм вышел из узла к по тропе, но совершает обратный прыжок на обратном пути, тогда он мог бы пойти прямо от к вместо. Действительно, обратный прыжок указывает на то, что узлы между и не имеют отношения к поддереву с корнем в . Другими словами, обратный переход указывает на то, что посещение области дерева поиска было ошибкой. Поэтому эту часть дерева поиска можно игнорировать при рассмотрении возможного обратного прыжка с или от одного из его предков.
Этот факт можно использовать, собирая в каждом узле набор ранее назначенных переменных, оценки которых достаточно, чтобы доказать, что в поддереве с корнем в узле не существует решения. Этот набор создается в ходе выполнения алгоритма. При отводе от узла этот набор удаляется из переменной узла и собирается в набор пункта назначения обратного отслеживания или обратного перехода. Поскольку узлы, пропущенные при обратном прыжке, никогда не извлекаются, их наборы автоматически игнорируются.
Прыжки назад на основе графа
[ редактировать ]Смысл обратного прыжка на основе графа заключается в том, что безопасный прыжок можно найти, проверив, какая из переменных находятся в ограничении с переменными которые создаются в конечных узлах. Для каждого листового узла и каждой переменной индекса который создается там, индексы меньше или равны чья переменная находится в ограничении с можно использовать для поиска безопасных прыжков. В частности, когда все значения для были опробованы, этот набор содержит индексы переменных, оценки которых позволяют доказать, что решение не может быть найдено путем посещения поддерева с корнем в . В результате алгоритм может вернуться к самому высокому индексу в этом наборе.
Тот факт, что узлы, пропущенные при обратном переходе, можно игнорировать при рассмотрении дальнейшего обратного перехода, можно использовать с помощью следующего алгоритма. При выходе из листового узла создается набор переменных, которые ограничены им, и «отправляется обратно» своему родителю или предку в случае обратного перехода. На каждом внутреннем узле поддерживается набор переменных. Каждый раз, когда набор переменных получен от одного из его дочерних элементов или потомков, их переменные добавляются к поддерживаемому набору. При дальнейшем возврате или обратном переходе из узла переменная узла удаляется из этого набора, и набор отправляется в узел, который является местом назначения обратного отслеживания или обратного перехода. Этот алгоритм работает, потому что набор, поддерживаемый в узле, собирает все переменные, необходимые для доказательства невыполнимости листьев, являющихся потомками этого узла. Поскольку наборы переменных передаются только при обратной трассировке от узлов, наборы, собранные в узлах, пропущенных при обратном переходе, автоматически игнорируются.
Прыжки на спине, основанные на конфликте (также известные как прыжки на спине, направленные на конфликт (cbj))
[ редактировать ]Еще более усовершенствованный алгоритм обратного перехода, иногда способный достигать больших обратных переходов, основан не только на проверке общего присутствия двух переменных в одном и том же ограничении, но также на проверке того, действительно ли ограничение вызвало несогласованность. В частности, этот алгоритм собирает одно из нарушенных ограничений на каждом листе. В каждом узле безопасным переходом является наивысший индекс переменной, находящейся в одном из ограничений, собранных на листьях.
Хотя выбранное в каждом листе нарушенное ограничение не влияет на безопасность результирующего прыжка, выбор ограничений с максимально возможными индексами увеличивает высоту прыжка. По этой причине ограничения на порядок обратного перехода на основе конфликтов, таким образом, ограничения на переменные с более низкими индексами являются более предпочтительными, чем ограничения на переменные с более высокими индексами.
Формально ограничение предпочтительнее другого если наивысший индекс переменной в но не в ниже, чем наивысший индекс переменной в но не в . Другими словами, за исключением общих переменных, предпочтение отдается ограничению, имеющему все нижние индексы.
В листовом узле алгоритм выбирает наименьший индекс такой, что несовместимо с последней переменной, вычисленной в листе. Среди ограничений, нарушаемых при этой оценке, он выбирает наиболее предпочтительное и собирает все его показатели менее . Таким образом, когда алгоритм возвращается к переменной , наименьший полученный индекс идентифицирует безопасный прыжок.
На практике этот алгоритм упрощается за счет сбора всех индексов в один набор вместо создания набора для каждого значения . В частности, алгоритм собирает в каждом узле все наборы, поступающие от его потомков, которые не были пропущены при обратном прыжке. При отводе из этого узла этот набор удаляется из переменной узла и собирается в пункт назначения обратного отслеживания или обратного перехода.
Прыжки назад, направленные на конфликт, были предложены для решения задач удовлетворения ограничений Патриком Проссером в его основополагающей статье 1993 года.
См. также
[ редактировать ]Ссылки
[ редактировать ]- Дектер, Рина (2003). Обработка ограничений . Морган Кауфманн. ISBN 1-55860-890-7 .
- Проссер, Патрик (1993). «Гибридные алгоритмы для задачи удовлетворения ограничений» (PDF) . Вычислительный интеллект 9(3).