СБ очень важно, потому что это NP-полные. Чтобы понять, что это означает, вам нужно четкое представление о классах сложности. Вот краткое изложение:
Р класс всех проблем, которые могут быть решены за полиномиальное время (то есть быстро).
NP - это класс всех проблем, решение которых может быть проверено в полиномиальное время. Это означает, что решение данного решения выполняется быстро, но поиск одного из них обычно медленный (чаще всего экспоненциальное время). Если, конечно, проблема не в части P NP (как указано ниже, P является частью NP, как вы можете легко проверить).
Тогда есть комплект NP-Complete проблем. Этот набор содержит всю проблему, которая является такой общей, вы можете решить эти Проблемы вместо другого из NP (это называется уменьшением проблемы на другую). Это означает, что вы можете превратить проблему из одного домена в другую проблему NP-Complete, получить ответ и преобразовать ответ.
Часто, однако, можно доказать, что проблема NP-Complete, но трансформации неясны для другой заданной проблемы.
SAT так приятно, потому что это NP-Complete, то есть вы можете решить его, а не любую другую проблему в NP, а также сокращения не так сложно сделать. TSP - еще одна проблема NP-Complete, но преобразования чаще всего сложнее.
Итак, да, SAT можно использовать для всех этих проблем, о которых вы говорите. Часто это не представляется возможным. Там, где это возможно, когда другой быстрый алгоритм не известен, например головоломка, которую вы упоминаете. В этом случае вам не нужно разрабатывать алгоритм для головоломки, но можете использовать любой из высоко оптимизированных SAT-Solvers, и вы получите разумный быстрый алгоритм для вашей головоломки.
Прохождение древовидной структуры настолько прост, что любое преобразование из и в SAT, скорее всего, будет намного сложнее, чем просто написать обход напрямую.
SAT (в контексте алгоритмов) - это [проблема булевской выполнимости] (http://en.wikipedia.org/wiki/Boolean_satisfability_problem), которая задает, можно ли задать переменные в заданной булевой формуле так, чтобы формула имеет значение TRUE. Например, в 'p (x) = not x' мы можем установить' x = FALSE', поэтому 'p' выполнимо. Но в 'q (x) = x && not x' мы не можем установить' x' для чего-либо, чтобы сделать 'q' TRUE, поэтому' q' не является выполнимым. –
Хорошо, но есть ли простые примеры «реального мира», где это может быть полезно? Я имею в виду пример, когда существует (наивное) решение, но использование SAT делает его, скажем, быстрее? –
Есть немало примеров, когда SAT может ускорить работу: Анализ зависимостей для менеджера пакетов Linux часто выполняется с помощью libsatsolver. Существуют также примеры криптографических атак с использованием SAT. Почти любая проблема, которая использует алгоритмы обратного отслеживания, может быть ускорена с помощью хорошей реализации SATsolver, такой как libsatsolver. – LiKao