Формулировка задачи о восьми ферзях как SAT-проблемы

🛠️ Проблема выполнимости булевых формул заключается в определении, существует ли набор значений переменных в системе булевых уравнений, при котором все уравнения выполняются. Если решение есть, следующая задача — перечислить все возможные решения.

♟️ Пример: задача о восьми ферзях (или её обобщение для n ферзей) можно сформулировать как булеву задачу и решить с помощью SAT-решателя.

Как это работает?
1. Шахматная доска (8×8) представляется как набор переменных `bij`, где `i` и `j` от 1 до 8. Переменная `bij = true` означает, что на клетке (i, j) стоит ферзь.
2. Условия задачи:
Каждая строка содержит ровно одного ферзя:
Минимум один ферзь: Для каждой строки `i` добавляем условие:
`bi1 ∨ bi2 ∨ … ∨ b_i8`.
Максимум один ферзь: Для каждой пары клеток в строке (например, `bi1` и `bi2`) добавляем условие:
`¬bi1 ∨ ¬bi2`, `¬bi1 ∨ ¬bi3`, …, `¬bi7 ∨ ¬bi8`.
– Аналогичные условия добавляются для столбцов и диагоналей.

🔍 Два подхода к кодированию условий:
1. Импликация: Если в клетке (i,1) есть ферзь, то в остальных клетках строки его нет:
`bi1 → (¬bi2 ∧ ¬bi3 ∧ … ∧ ¬bi8)`.
Преобразуется в: `¬bi1 ∨ (¬bi2 ∧ ¬bi3 ∧ … ∧ ¬bi8)`.
2. Прямое запрещение пар: Для всех пар клеток в строке запрещаем одновременное наличие ферзей:
`(¬bi1 ∨ ¬bi2) ∧ (¬bi1 ∨ ¬bi3) ∧ … ∧ (¬bi7 ∨ ¬bi8)`.

🎯 Преимущество второго подхода: Прямое представление в конъюнктивной нормальной форме (КНФ), что упрощает работу SAT-решателей.

💡 Зачем это нужно?

  • Позволяет автоматически находить все решения задачи.

  • Демонстрирует мощь логического программирования и SAT-решателей.

📚 Связанные темы:

  • [Специальные решения для задачи о восьми ферзях](https://example.com)

  • [Сложность задач с ограничениями](https://example.com)

Автор: Джон Д. Кук 🌐

Источник

Оставьте комментарий