Что такое SAT и для чего он хорош?
недавно я видел статью Reddit об использовании SAT для решения головоломки [1]. Это принесло мне очень любопытные вещи об этом" SAT". Я читал статью в Википедии, но я хотел бы попросить кого-нибудь из вас объяснить это для меня в более непрофессиональных терминах.
Что такое SAT и для чего он хорош? Может ли он использоваться для пересечения древовидной структуры? Для разбора текстов? Для разрыва линии [2]? Для упаковки ящика [3]? Это своего рода метод оптимизации?
на соответствующей заметке я прочитал, что NP vs P речь идет о выборе того, какие числа заданной суммы равны нулю против проверки, являются ли некоторые числа суммой к нулю-SAT как-то связан с этим?
[1] http://www.reddit.com/r/programming/comments/pxpzd/solving_hexiom_really_fast_with_a_sat_solver/
2 ответов
SAT очень важен, потому что он NP-завершен. Чтобы понять, что это значит, вам нужно четкое представление о классах сложности. Вот краткое изложение:
P-класс всех задач, которые могут быть решены за полиномиальное время (т. е. быстро).
NP-класс всех задач, для которых решение может быть проверено в полиномиальное время. Это означает, что верификация данного решения происходит быстро, но поиск его обычно медленный (чаще всего экспоненциальное время). Если проблема не находится в P части NP, конечно (как указано ниже, P является частью NP, как вы можете легко проверить).
тогда существует множество NP-полных проблем. Этот набор содержит все проблемы, которые настолько универсальны, что вы можете решить эти проблемы вместо другой из NP (это называется уменьшением проблемы на другую). Это означает, что вы можете преобразовать проблему из одного домена в другую NP-полную проблему, получить ответ и преобразовать ответ.
часто, однако, можно доказать, что проблема NP-полная, но преобразования неясны для другой данной проблемы.
SAT настолько хорош, потому что он NP-полный, т. е. вы можете решить его вместо любой другой проблемы в NP, а также сокращения не так сложно сделать. TSP-еще одна NP-полная проблема, но преобразования чаще всего намного сложнее.
Так, да, SAT можно использовать для всех этих проблем вы не упомянуть. Однако зачастую это неосуществимо. Где это возможно, когда нет другого быстрого алгоритма, такого как головоломка, которую вы упомянули. В этом случае вам не нужно разрабатывать алгоритм для головоломки, но вы можете использовать любой из высоко оптимизированных SAT-решателей, и вы получите разумный быстрый алгоритм для своей головоломки.
пересечение древовидной структуры настолько просто, например, что любое преобразование из и в SAT, скорее всего, будет намного сложнее чем просто писать обход напрямую.
короче говоря, решатель SAT-это то, что вы даете булеву формулу, и она говорит вам, может ли она найти значение для разных переменных, чтобы формула была истинной.
пример
предположим, что a
, b
и c
являются булевыми переменными, и вы хотите знать, могут ли этим переменным быть присвоены значения, которые каким-то образом делают формулу (¬a ∨ b) ∧ (¬b ∨ c)
. Вы отправляете эту формулу в SAT solver, и она вернет вас true
. SAT solvers также часто дают вам действительное задание. В этом случае это назначение может быть a: false, b:false, c:false
.
для чего его можно использовать ?
Я бы не использовал его для пересечения деревьев, разбора текста или разбиения строк. Однако вы можете использовать его при обходе дерева, чтобы проверить, удовлетворены ли некоторые ограничения на дереве. Вы можете определенно использовать его для упаковки ящика, даже если некоторые специализированные решатели CSP вероятно выполнят лучше на этом виде проблемы.
SAT решатели становятся все более распространенными в эти дни, особенно в программном обеспечении, как менеджеры пакетов. Eclipse внедряет SAT4j для управления зависимостями среди своих плагинов. Другие приложения SAT обычно включают проверку моделей, планирование приложений, конфигураторы, планирование и многие другие.