Отсечение ветвей перебора
Отсечение ветвей перебора — это исключение вариантов, которые уже не могут привести к допустимому решению. Благодаря этому алгоритм не тратит время на продолжение заведомо неудачных вариантов.
Как работает отсечение
Перебор строит решение по шагам. После добавления очередного элемента алгоритм проверяет частичный вариант. Если он уже нарушает ограничение или гарантированно не позволит получить нужный результат, дальнейшие шаги по этой ветви не выполняются. Алгоритм возвращается к предыдущему шагу и выбирает другой вариант. Такой возврат является частью перебора с возвратом.
Здесь \(s\) — уже построенная часть решения, а \(P(s)\) — проверка того, что она остаётся допустимой. Правило отсечения должно быть безопасным: нельзя отбрасывать ветвь, в которой ещё может находиться правильное решение.
Нужно расставить числа от 1 до 4 так, чтобы сумма соседних чисел не превышала 5. Если начало последовательности уже содержит соседнюю пару \(3\) и \(4\), её сумма равна \(7\). Условие нарушено, поэтому всю ветвь, начинающуюся с этой пары, можно отсечь: переставлять оставшиеся числа бессмысленно.
Отсечение ветвей — это не просто перебор в другом порядке и не остановка всей программы при первой ошибке. Отбрасывается только текущая бесперспективная ветвь, после чего алгоритм продолжает проверять другие варианты. Сложность перебора с возвратом уменьшается, но в худшем случае перебор всё ещё может быть большим.
Когда можно отсечь ветвь перебора?
Что важно для задач
- Сначала определить ограничение, которое можно проверить на частичном решении.
- Отсекать ветвь сразу после обнаружения нарушения.
- Проверять, что правило не удаляет допустимые решения.
- Отличать количество проверенных вариантов от количества всех возможных вариантов.
Главное
- Отсечение ветвей прекращает бесполезное продолжение частичного варианта.
- Основанием служит доказанная невозможность получить допустимое решение.
- Хорошее правило отсечения ускоряет перебор, но должно сохранять все потенциально правильные решения.