Я заинтересован в небольшом варианте мозаики: головоломка: каждый край (квадратной) плитки помечен символом из , и две плитки могут быть расположены рядом друг с другом, если символ на лицевой стороне одной плитки равен а символ на лицевой стороне другой плитки равен , для некоторых . Тогда, учитывая набор тайлов, можно ли их поместить в квадрат (вращая, но не переворачивая тайлы), чтобы все ребра совпали правильно? (Существует также вариант этой проблемы, в котором предусмотрены четыре ребра по ), и части должны правильно вписываться в эту рамку).k ˉ k k ∈ { 1 … n } m 2 m × m 1 × m
Я знаю, что эта проблема является NP-полной для достаточно большого , но границы, которые я видел для кажутся довольно большими; Меня интересует проблема для малых значений и, в частности, для , случай «ноль-один» (где каждое ребро помечено либо либо а ребра с должны совпадать с ребрами с ). Здесь есть (с вращательной симметрией) только шесть типов плиток (мозаика со всеми нулями, мозаика со всеми единицами, мозаика с тремя нулями и единицей, мозаика с тремя единицами и нулем и две отдельные плитки с двумя нулями и два, «0011» и «0101»), поэтому проблемный экземпляр - это просто спецификацияn n n = 1 0 1 0 1 ми набор из пяти чисел , , , , и (представляющих счет каждого типа плитки) с . Проблема, очевидно, в NP (с заданным в унарном виде), так как решение можно просто показать и затем проверить в полиноме (в Т 0001 Т 0011 Т 0101 Т 0111 Т 1111 Т 0000 + Т 0001 + Т 0011 + Т 0101 + Т 0111 + Т 1111 = м 2 м м) время, но известно ли, что оно является NP-полным или существует какой-то алгоритм динамического программирования, который можно применить здесь? Как насчет случая «в рамке», в котором спецификация задачи также включает четыре ребра квадрата, которые должны быть сопоставлены? (Очевидно, что если безкадровый случай является NP-завершенным, то почти наверняка, что и без него)
источник
Ответы:
Поскольку вы упомянули, что вы заинтересованы в решении этой проблемы для малых значений , я бы посоветовал вам попытаться реализовать это в решателе SAT или в виде целочисленной линейной программы (ILP). Любой из них сможет кодировать ограничения, но немного по-другому:N
Для SAT существует очень чистое кодирование выбора того, какой мозаичный элемент идет в каждый квадрат, и немного менее чистое кодирование ограничения относительно количества каждого вида мозаичного изображения (используя битовую арифметику).
Для ILP существует очень чистое кодирование ограничения, касающегося количества каждого типа доступных плиток, и немного менее чистое кодирование ограничений, по которым плитки могут быть смежными друг с другом (но это все еще можно выразить, так как вы можете выражать произвольные логические формулы в ILP).
Я ожидаю, что для малого или среднего размера этот подход может работать эффективно.N
источник