В алгоритмах обратного отслеживания , взгляд вперед — это общий термин для подпроцедуры , которая пытается предвидеть последствия выбора переменной ветвления для оценки одного из ее значений. Две основные цели взгляда вперед — выбрать переменную для следующей оценки и выбрать порядок значений для ее назначения.
В общей проблеме удовлетворения ограничений каждая переменная может принимать значение в домене. Поэтому алгоритм обратного отслеживания итеративно выбирает переменную и проверяет каждое из ее возможных значений; для каждого значения алгоритм рекурсивно запускается. Взгляд вперед используется для проверки эффектов выбора заданной переменной для оценки или для определения порядка значений, которые следует ей присвоить.
Более простая техника оценки эффекта конкретного назначения переменной называется прямой проверкой . [1] При наличии текущего частичного решения и кандидата на назначение для оценки он проверяет, может ли другая переменная принимать согласованное значение. Другими словами, он сначала расширяет текущее частичное решение с помощью предварительного значения для рассматриваемой переменной; затем он рассматривает каждую другую переменную, которая еще не назначена, и проверяет, существует ли оценка, которая согласуется с расширенным частичным решением. В более общем смысле прямая проверка определяет значения, которые согласуются с расширенным назначением.
Метод прогнозирования, который может быть более трудоемким, но может давать лучшие результаты, основан на согласованности дуг . А именно, учитывая частичное решение, расширенное значением для новой переменной, он обеспечивает согласованность дуг для всех неназначенных переменных. Другими словами, для любых неназначенных переменных значения, которые не могут быть согласованно расширены для другой переменной, удаляются. Разница между прямой проверкой и согласованностью дуг заключается в том, что первая проверяет только одну неназначенную переменную в данный момент на согласованность, тогда как вторая также проверяет пары неназначенных переменных на взаимную согласованность. Наиболее распространенным способом использования прогнозирования для решения проблем удовлетворения ограничений является алгоритм поддержания согласованности дуг (MAC) . [2]
Два других метода, включающих согласованность дуг, — это полный и частичный просмотр вперед. Они обеспечивают согласованность дуг, но не для каждой пары переменных. В частности, полный просмотр рассматривает каждую пару неназначенных переменных и обеспечивает согласованность дуг между ними. Это отличается от обеспечения глобальной согласованности дуг, которая может потребовать пересмотра пары переменных более одного раза. Вместо этого, как только полный просмотр вперед обеспечил согласованность дуг между парой переменных, пара больше не рассматривается. Частичный просмотр вперед похож, но учитывается заданный порядок переменных, и согласованность дуг обеспечивается только один раз для каждой пары с .
Прогнозирование на основе согласованности дуг также может быть расширено для работы с согласованностью путей и общей i-согласованностью или согласованностью реляционных дуг.
Результаты просмотра вперед используются для принятия решения о следующей переменной для оценки и порядке значений, которые следует присвоить этой переменной. В частности, для любой неназначенной переменной и значения просмотр вперед оценивает эффекты установки этой переменной в это значение.
Выбор следующей переменной и выбор следующего значения, которое ей придаст, являются взаимодополняющими, поскольку значение обычно выбирается таким образом, чтобы решение (если таковое имеется) было найдено как можно быстрее, в то время как следующая переменная обычно выбирается таким образом, чтобы невыполнимость (если текущее частичное решение невыполнимо) была доказана как можно быстрее.
Выбор следующей переменной для оценки особенно важен, так как он может привести к экспоненциальным различиям во времени выполнения. Чтобы доказать невыполнимость как можно быстрее, предпочтительными являются переменные, оставляющие мало альтернатив после назначения. Эту идею можно реализовать, проверив только выполнимость или невыполнимость пар переменная/значение. В частности, следующей выбираемой переменной является та, которая имеет минимальное количество значений, которые согласуются с текущим частичным решением. В свою очередь, согласованность можно оценить, просто проверив частичную согласованность или используя любой из рассмотренных выше методов просмотра вперед.
Ниже приведены три метода упорядочивания значений для предварительного присвоения переменной:
Эксперименты доказали, что эти методы полезны для больших проблем, особенно для проблем с минимальными конфликтами. [ необходима цитата ]
Рандомизация также иногда используется для выбора переменной или значения. Например, если две переменные одинаково предпочтительны по какой-либо мере, выбор может быть сделан случайным образом.