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