На Math Stack Exchange я задал вопрос о самом маленьком регионе, который может содержать все свободные n-ominos .
Я хотел бы добавить эту последовательность к онлайн-энциклопедию целочисленных последовательностей, как только у меня появится больше терминов.
пример
Область из девяти ячеек - это наименьшее подмножество плоскости, которое может содержать все двенадцать свободных 5-омино , как показано ниже. (Свободное полиомино - это то, которое можно вращать и переворачивать.)
(Область из двенадцати ячеек - это наименьшее подмножество плоскости, которое может содержать все 35 свободных 6-омино .)
Соревнование
Вычислить верхние границы наименьших областей плоскости, которые могут содержать все n-омино в зависимости от n.
Такая таблица начинается:
n | size
--+-------
1 | 1*
2 | 2*
3 | 4*
4 | 6*
5 | 9*
6 | 12*
7 | 37
8 | 50
9 | 65
*These values are the smallest possible.
Пример представления
1-omino: 1
#
2-omino: 2
##
3-omino: 4
###
#
4-omino: 6
####
##
5-omino: 9
#
#####
###
6-omino: 12
####
######
##
7-omino: <= 37
#######
######
######
######
######
######
счет
Запустите вашу программу столько времени, сколько захотите, и опубликуйте свой список верхних границ вместе с фигурами, которые достигают каждой из них.
Победителем станет участник, чья таблица является лексикографически самой ранней (с добавлением «бесконечности» к более коротким представлениям). Если два участника представят одинаковые результаты, выигрывает более раннее представление.
Например, если представления
Aliyah: [1,2,4,6,12,30,50]
Brian: [1,2,4,6,12,37,49,65]
Clare: [1,2,4,6,12,30]
тогда алия побеждает. Она бьет Брайана, потому что 30 <37, и она бьет Клэр, потому что 50 <бесконечность.
источник
Ответы:
C # и SAT: 1, 2, 4, 6, 9, 12, 17, 20, 26, 31, 37, 43
Если мы ограничим ограничивающий прямоугольник, мы получим довольно очевидное выражение проблемы в терминах SAT : каждый перевод каждой ориентации каждого свободного полиомино является большим соединением; для каждого polyomino мы формируем дизъюнкцию по его соединениям; и затем мы требуем, чтобы каждая дизъюнкция была истинной, а общее количество ячеек раньше было ограничено.
Для ограничения количества ячеек в моей первоначальной версии встроен полный сумматор; затем я использовал битоническую сортировку для унарного подсчета (аналогично предыдущему ответу, но обобщенно) наконец, я остановился на подходе, описанном Байо и Боуфхадом в кодировке «Эффективное CNF» с ограничениями булевой мощности .
Я хотел сделать пост самодостаточным, поэтому я выкопал реализацию C # решателя SAT с лицензией BSD, которая была обновлена около 15 лет назад, заменил ее реализацию списка NIH на
System.Collections.Generic.List<T>
(получив фактор 2 в скорости), увеличил его с 50 кБ до 31 кБ, чтобы уложиться в ограничение на 64 кБ, а затем проделал некоторую агрессивную работу по сокращению использования памяти. Этот код, очевидно, может быть адаптирован для вывода файла DIMACS, который затем может быть передан более современным решателям.Найденные решения
Чтобы найти 43 для n = 12, потребовалось чуть более 7,5 часов.
Код Поломино
SAT решатель код
Оптимальность
Отличительные решения
Подсчет решений для проблемы SAT прост, хотя иногда и медленен: вы находите решение, добавляете новое предложение, которое прямо исключает его, и запускаете снова. Здесь легко сгенерировать класс эквивалентности решений под симметриями прямоугольника, поэтому для генерации всех различных решений достаточно следующего кода.
источник
В интересах начала процесса, вот быстрый (но не очень оптимальный) ответ.
Шаблон:
Возьмите треугольник длиной n - 1, прикрепите дополнительный угол к углу и отрежьте нижний квадрат.
Доказательство того, что все n-ominos подходят:
Обратите внимание, что любое n-омино может поместиться в прямоугольник с длиной + шириной не более n + 1.
Если n-омино вписывается в прямоугольник с длиной + шириной не более n, он хорошо вписывается в треугольник (который является объединением всех таких прямоугольников). Если случится использовать квадрат обрезки, его транспонирование поместится в треугольнике.
В противном случае у нас есть цепочка с не более чем одной ветвью. Мы всегда можем вписать один конец цепочки в дополнительный квадрат (докажите это с помощью casework), а остальные вписываются в прямоугольник с длиной + шириной не более n, сводя к описанному выше случаю.
Единственный случай, когда вышеупомянутое не работает, это случай, когда мы используем как дополнительный квадрат, так и квадрат обрезки. Есть только одно такое n-omino (длинное L), и оно помещается внутри транспонированного треугольника.
Код (Python 2):
Стол:
источник
C #, оценка: 1, 2, 4, 6, 9, 12, 17, 20, 26, 31, 38, 44
Выходной формат программы немного более компактен.
Это использует случайный подход с семенами, и я оптимизировал семена. Я применяю ограничение ограничивающего прямоугольника, которое является правдоподобным и согласуется с известными данными для небольших значений n. Если это ограничение действительно действует, то
1, 1, 2, 2, 2, 6, 63, 6
.Онлайн демо
источник
Жадное размещение в случайном порядке
Найденные регионы приведены ниже, а также программа ржавчины, которая их породила. Вызовите его с параметром командной строки, равным n, который вы хотите найти до. Я дошел до n = 10 до сих пор. Обратите внимание, что он еще не оптимизирован для скорости, я сделаю это позже и, вероятно, значительно ускорим процесс.
Алгоритм прост, я перетасовываю полиомино в (случайном порядке) случайном порядке, затем размещаю их по одному в позиции с максимально возможным перекрытием с областью. Я делаю это 100 раз и вывожу лучший результат.
районы
программа
Примечание: требуется по ночам, но просто поменяйте посев, чтобы избавиться от этого, если вам не все равно.
источник