No Math Stack Exchange, fiz uma pergunta sobre a menor região que pode conter todos os n-ominos gratuitos .
Gostaria de adicionar esta sequência à Enciclopédia On-line de Sequências Inteiras assim que tiver mais termos.
Exemplo
Uma região de nove células é o menor subconjunto do plano que pode conter todos os doze 5-ominoes livres , como ilustrado abaixo. (Um poliomino livre é aquele que pode ser girado e invertido.)
(Uma região de doze células é o menor subconjunto do plano que pode conter todos os 35 ominoes livres .)
O desafio
Calcule os limites superiores nas menores regiões do plano que podem conter todos os n-ominoes em função de n.
Essa tabela começa:
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.
Envio de exemplo
1-omino: 1
#
2-omino: 2
##
3-omino: 4
###
#
4-omino: 6
####
##
5-omino: 9
#
#####
###
6-omino: 12
####
######
##
7-omino: <= 37
#######
######
######
######
######
######
Pontuação
Execute seu programa pelo tempo que desejar e publique sua lista de limites superiores juntamente com as formas que atingem cada um.
O vencedor será o participante cuja tabela seja lexicograficamente a mais antiga (com "infinito" anexado às inscrições mais curtas.) Se dois participantes enviarem os mesmos resultados, a inscrição anterior vence.
Por exemplo, se os envios forem
Aliyah: [1,2,4,6,12,30,50]
Brian: [1,2,4,6,12,37,49,65]
Clare: [1,2,4,6,12,30]
então Aliyah vence. Ela vence Brian porque 30 <37, e ela vence Clare porque 50 <infinito.
fonte
Respostas:
C # e SAT: 1, 2, 4, 6, 9, 12, 17, 20, 26, 31, 37, 43
Se limitarmos a caixa delimitadora, há uma expressão bastante óbvia do problema em termos de SAT : cada tradução de cada orientação de cada polioino livre é uma grande conjunção; para cada poliomino formamos uma disjunção sobre suas conjunções; e então exigimos que cada disjunção seja verdadeira e o número total de células costumava ser limitado.
Para limitar o número de células, minha versão inicial criou um somador completo; então usei a classificação bitônica para contagem unária (semelhante a essa resposta anterior, mas generalizada); finalmente, decidi pela abordagem descrita por Bailleux e Boufkhad na codificação CNF eficiente de restrições de cardinalidade booleana .
Como eu queria que a publicação fosse independente, desenterrei uma implementação em C # de um solucionador SAT com uma licença BSD que era de última geração há cerca de 15 anos, substituindo a implementação da lista NIH por
System.Collections.Generic.List<T>
(ganhando um fator de 2 em velocidade), reduziu de 50kB para 31kB para caber no limite de post de 64kB e, em seguida, fez um trabalho agressivo na redução do uso de memória. Obviamente, esse código pode ser adaptado para gerar um arquivo DIMACS que pode ser passado para solucionadores mais modernos.Soluções encontradas
Encontrar 43 para n = 12 levou um pouco mais de 7,5 horas.
Código Polyomino
Código do SAT Solver
Optimalidade
Soluções distintas
A contagem de soluções para um problema SAT é direta, se às vezes lenta: você encontra uma solução, adiciona uma nova cláusula que a exclui diretamente e executa novamente. Aqui é fácil gerar a classe de equivalência de soluções sob as simetrias do retângulo; portanto, o código a seguir é suficiente para gerar todas as soluções distintas.
fonte
No interesse de iniciar o processo, aqui está uma resposta rápida (mas não muito ótima).
Padronizar:
Pegue um triângulo com o comprimento n - 1, cole um quadrado extra no canto e corte o quadrado inferior.
Prova de que todos os n-ominos se encaixam:
Observe que qualquer n-omino pode caber em um retângulo com comprimento + largura no máximo n + 1.
Se um n-omino se encaixa em um retângulo com comprimento + largura no máximo n, ele se encaixa perfeitamente no triângulo (que é a união de todos esses retângulos). Se, por acaso, usar o quadrado cortado, a transposição caberá no triângulo.
Caso contrário, temos uma cadeia com no máximo um ramo. Sempre podemos encaixar uma extremidade da corrente no quadrado extra (prove isso com o caso), e o restante se encaixa em um retângulo com comprimento + largura no máximo n, reduzindo o caso acima.
O único caso em que o acima não funciona é o caso em que usamos o quadrado extra e o quadrado de recorte. Existe apenas um desses n-omino (o L longo), e esse se encaixa dentro do triângulo transposto.
Código (Python 2):
Tabela:
fonte
C #, score: 1, 2, 4, 6, 9, 12, 17, 20, 26, 31, 38, 44
O formato de saída do programa é um pouco mais compacto.
Isso usa uma abordagem aleatória semeada, e eu otimizei as sementes. Eu imponho uma restrição de caixa delimitadora que seja plausível e consistente com os dados conhecidos para valores pequenos de n. Se essa restrição é realmente válida, então
1, 1, 2, 2, 2, 6, 63, 6
.Demonstração online
fonte
Posicionamento ganancioso em ordem aleatória
As regiões encontradas são fornecidas abaixo, bem como o programa de ferrugem que as gerou. Chame-o com um parâmetro de linha de comando igual ao n que você deseja pesquisar. Eu executei até n = 10 até agora. Observe que ainda não está otimizado para velocidade, farei isso mais tarde e provavelmente acelerarei bastante as coisas.
O algoritmo é simples: embaralhe os polioquinós em uma ordem aleatória (semeada) e os coloque um de cada vez na posição com a sobreposição máxima possível com a região até agora. Faço isso 100 vezes e produzo a melhor região resultante.
Regiões
Programa
Nota: requer noturno, mas basta alterar a semeadura para se livrar disso, se você se importa.
fonte