Поиск с возвратом
Поиск с возвратом (англ. backtracking) — это общий метод решения задач, относящийся к классу алгоритмов полного перебора. Он заключается в последовательном построении решения путём частичных шагов (кандидатов) и откате (возврате) назад, когда текущий частичный кандидат не может быть расширен до полного решения, удовлетворяющего всем условиям. Поиск с возвратом применяется в комбинаторике, теории графов, криптографии, а также в задачах искусственного интеллекта, таких как планирование и решение головоломок.
История
Идея поиска с возвратом восходит к работам математиков XVIII—XIX веков, в частности, к задаче о ходе коня (задача об обходе шахматной доски конём), которую исследовал Леонард Эйлер в 1759 году. Однако термин «backtracking» был введён американским математиком Дерриком Генри Лемером в 1950-х годах в контексте задач комбинаторного анализа. В 1960-х годах метод получил широкое распространение в программировании благодаря работам Роберта Флойда и Джона Маккарти. В СССР алгоритмы поиска с возвратом изучались в рамках курсов дискретной математики и программирования, в частности, в трудах А. А. Маркова и Ю. И. Журавлёва.
Принцип работы
Поиск с возвратом основан на рекурсивном или итеративном обходе дерева возможных решений. Алгоритм начинает с пустого частичного решения и на каждом шаге пытается добавить новый элемент (кандидат). Если добавление приводит к нарушению ограничений задачи, алгоритм отменяет последний шаг (возвращается) и пробует следующий вариант. Если все варианты на данном уровне исчерпаны, алгоритм возвращается на уровень выше.
Формально алгоритм можно описать следующим образом:
- Определить пространство поиска — множество всех возможных частичных решений.
- Выбрать начальное частичное решение (обычно пустое).
- Проверить, является ли текущее частичное решение полным и допустимым. Если да — сохранить его как решение.
- Если частичное решение не может быть расширено до полного (например, из-за нарушения ограничений), выполнить возврат (backtrack) — отменить последний добавленный элемент.
- Если есть нерассмотренные варианты на текущем уровне, выбрать следующий кандидат и перейти к шагу 3.
- Повторять до тех пор, пока все варианты не будут исчерпаны.
Отсечение (pruning)
Для повышения эффективности поиска с возвратом часто используется отсечение — отказ от рассмотрения ветвей, которые заведомо не могут привести к решению. Например, в задаче о ферзях (расстановка 8 ферзей на шахматной доске так, чтобы они не атаковали друг друга) отсечение происходит, если очередной ферзь оказывается под боем уже поставленных. Отсечение может быть реализовано с помощью эвристик, таких как эвристика наименьшего оставшегося домена (MRV) в задачах удовлетворения ограничений.
Классификация
Поиск с возвратом можно классифицировать по нескольким признакам:
По способу обхода
- Рекурсивный поиск с возвратом — использует рекурсивные вызовы функций для каждого уровня дерева. Наиболее распространённый вариант.
- Итеративный поиск с возвратом — использует явный стек для хранения текущего состояния. Применяется в языках без поддержки рекурсии или для избежания переполнения стека.
По типу задачи
- Задачи комбинаторной оптимизации — поиск наилучшего решения среди всех допустимых (например, задача коммивояжёра).
- Задачи удовлетворения ограничений — поиск любого допустимого решения (например, судоку, раскраска графа).
- Задачи перечисления — нахождение всех возможных решений (например, все перестановки или подмножества).
По наличию эвристик
- Чистый поиск с возвратом — без дополнительных эвристик, полный перебор.
- Поиск с отсечением — с использованием эвристик для сокращения пространства поиска.
Применение
Поиск с возвратом широко используется в различных областях:
Комбинаторика
- Генерация всех перестановок, сочетаний и подмножеств.
- Решение задачи о рюкзаке (0-1 knapsack problem) — поиск подмножества предметов с максимальной ценностью при ограничении на вес.
Головоломки и игры
- Решение судоку — заполнение сетки 9×9 цифрами от 1 до 9 с учётом ограничений по строкам, столбцам и блокам.
- Задача о ходе коня — обход шахматной доски конём, посещающим каждую клетку ровно один раз.
- Задача о восьми ферзях — расстановка 8 ферзей на доске 8×8.
- Кроссворды и лабиринты — поиск пути от начальной до конечной точки.
Теория графов
- Поиск всех гамильтоновых циклов — циклов, проходящих через каждую вершину графа ровно один раз.
- Раскраска графа — назначение цветов вершинам так, чтобы смежные вершины имели разные цвета.
- Поиск клик — полных подграфов заданного размера.
Искусственный интеллект
- Планирование действий в системах искусственного интеллекта (например, в классическом планировщике STRIPS).
- Решение задач логического вывода, таких как задача о волке, козе и капусте.
Криптография
- Взлом простых шифров, например, подбор ключа методом перебора с отсечением.
Примеры
Задача о восьми ферзях
Классический пример поиска с возвратом. На шахматную доску размером 8×8 необходимо расставить 8 ферзей так, чтобы ни один ферзь не атаковал другого. Алгоритм начинает с первой строки и поочерёдно ставит ферзя в каждую колонку. Если после установки ферзя в текущую позицию он оказывается под боем уже поставленных, алгоритм отменяет установку и пробует следующую колонку. Если все колонки в строке перебраны, алгоритм возвращается на предыдущую строку. Решение достигается, когда все 8 ферзей успешно расставлены. Существует 92 различных решения, не считая симметричных.
Решение судоку
Для судоку размером 9×9 поиск с возвратом работает следующим образом: начиная с первой пустой клетки, алгоритм пробует вставить цифру от 1 до 9. Если цифра не нарушает правила судоку (не повторяется в строке, столбце и блоке 3×3), алгоритм переходит к следующей пустой клетке. Если ни одна цифра не подходит, алгоритм возвращается к предыдущей клетке и пробует следующую цифру. В среднем, для стандартного судоку требуется около 1000—5000 шагов, что делает метод эффективным для задач небольшой размерности.
Сложность
Временная сложность поиска с возвратом в худшем случае экспоненциальна, так как алгоритм перебирает все возможные комбинации. Для задачи о восьми ферзях сложность составляет O(n!), где n — размер доски. Для судоку сложность может достигать O(9^m), где m — количество пустых клеток. Однако на практике отсечение значительно сокращает количество рассматриваемых вариантов, и для многих задач поиск с возвратом работает за приемлемое время.
Пространственная сложность обычно линейна и зависит от глубины рекурсии: O(d), где d — максимальная глубина дерева поиска (например, количество строк в задаче о ферзях или количество пустых клеток в судоку).
Критика
Основным недостатком поиска с возвратом является его экспоненциальная сложность для задач большой размерности. Для задач с большим пространством поиска (например, задача коммивояжёра для 50 городов) метод становится непрактичным без дополнительных эвристик. Кроме того, рекурсивная реализация может привести к переполнению стека при большой глубине рекурсии. В таких случаях предпочтительнее итеративный вариант или использование методов динамического программирования.
Альтернативами поиску с возвратом являются:
- Метод ветвей и границ — использует нижние и верхние оценки для отсечения ветвей.
- Динамическое программирование — для задач с оптимальной подструктурой.
- Жадные алгоритмы — для задач, где локально оптимальное решение ведёт к глобальному оптимуму.
- Методы Монте-Карло — для задач, где точное решение не требуется.
Интересные факты
- В 1970-х годах советский математик В. М. Глушков использовал поиск с возвратом для решения задач оптимизации в системах управления.
- Алгоритм поиска с возвратом лежит в основе многих современных решателей задач удовлетворения ограничений (CSP-решателей), таких как Minion и Choco.
- В русскоязычной литературе метод также называют «алгоритмом перебора с отступлением» или «алгоритмом возврата».
Источники
- Лемер, Д. Г. (1950). «A machine method for solving combinatorial problems». Proceedings of the ACM.
- Кнут, Д. Э. (1997). Искусство программирования. Том 4. Комбинаторные алгоритмы. Addison-Wesley.
- Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. (2005). Алгоритмы: построение и анализ. М.: Вильямс.
- Марков, А. А. (1954). «Теория алгоритмов». Труды Математического института АН СССР.
- Журавлёв, Ю. И. (1968). «Алгоритмы перебора с возвратом в задачах дискретной математики». Журнал вычислительной математики и математической физики.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →