Ciclo de treliça aleatória de auto-evitação dentro de uma determinada caixa delimitadora

25

Em conexão com a Slither Fazer a ligação quebra-cabeça, eu estive pensando: Suponha que eu tenho um grade de células quadrados, e eu quero encontrar um ciclo simples de bordas de grade, uniformemente de forma aleatória entre todos os ciclos simples possíveis.n×n

Uma maneira de fazer isso seria usar uma cadeia de Markov cujos estados são conjuntos de quadrados cujos limites são ciclos simples e cujas transições consistem em escolher um quadrado aleatório para girar e mantê-lo quando o conjunto modificado de quadrados ainda possui um ciclo simples, como seu limite. Pode-se passar de qualquer ciclo simples para outro dessa maneira (usando resultados padrão sobre a existência de cascas), para que isso eventualmente converja para uma distribuição uniforme, mas com que rapidez?

Como alternativa, existe uma cadeia de Markov melhor ou um método direto para selecionar ciclos simples?

ETA: Veja esta postagem no blog para obter um código para calcular o número de ciclos que estou procurando e ponteiros para o OEIS para alguns desses números. Como sabemos, contar é quase o mesmo que geração aleatória, e deduzo da falta de qualquer padrão óbvio nas fatorações desses números e da falta de uma fórmula na entrada OEIS que é improvável que exista um método direto simples conhecido . Mas isso ainda deixa as questões sobre a rapidez com que essa cadeia converge e se há uma cadeia melhor aberta.

David Eppstein
fonte
1
O limite dos conjuntos contados pela sequência OEIS não são necessariamente ciclos simples, por exemplo, para 3x3, um dos 218 tem todos os quadrados, exceto o meio, e outros quatro são dados pela remoção adicional de um canto.
Colin McQuillan 14/03
1
Para grades 2xn, os números são os indicados em oeis.org/A059020 . Para 3xn, tenho certeza de que são 6,40,213,1049,5034,23984,114069,542295,2577870,12253948,58249011,276885683,1316170990,6256394122,29739651711,141366874247, ... (não no OEIS). Eu configurei a matriz de transferência para calculá-la manualmente, mas a comparei com uma matriz gerada por máquina e a única entrada que diferia era a mão correta e a máquina errada. (Isto deve aparecer no caso 3x3 - a matriz máquina teria permitido um octomino com um furo no centro.)
David Eppstein
1
Você deve enviar essa sequência para Neil Sloane para que ele possa colocá-lo no OEIS.
quer
1
@ David: Obrigado. Provavelmente, é hora de aprender o método da matriz de transferência mais detalhadamente.
Yoshio Okamoto
2
@ David: Você acabou de perder duas horas da minha vida com esse link para o quebra-cabeça .. Thx!
Domotorp 20/03

Respostas:

1

Parece que, como você está usando apenas as contagens do número de ciclos em um gráfico para escolher aleatoriamente um ciclo, que se você tivesse uma aproximação aleatória para esse número, ainda assim poderia escolher um ciclo aproximadamente uniformemente.

Observe que o número de ciclos em um gráfico , que contém a aresta ( u , v ) , é igual ao número de ciclos em G - ( u , v ) mais o número de caminhos simples de u a v em G - ( u , v ) . Assim, com uma aproximação de tempo polinomial para o número de caminhos u - v , a aproximação de um tempo polinomial pode ser alcançada construindo-se incrementalmente até G uma aresta por vez, aproximando-se à medida que avança. G(u,v)G(u,v)uvG(u,v)uvG

Na verdade, acho que existe um método mais direto para escolher um ciclo. Deixe ser o gráfico inteiro de bordas ao redor do n × n grade de quadrados. Para cada aresta ( u , v ), encontre o número de ciclos que contêm essa aresta (que é o número de caminhos u - v em G - ( u , v ) ). Em seguida, escolha aleatoriamente uma aresta ponderada pelo número de ciclos que a contêm. Essa será a primeira margem do seu ciclo escolhido aleatoriamente. Todas as outras arestas serão escolhidas estendendo uma aresta por vez.Gn×n(u,v)uvG(u,v)

CvsveNveCuNuvsG[V(C{vs,ve})]uve(ve,u)

Dessa maneira, um número polinomial de arestas é escolhido, cada um exigindo um pequeno número de cálculos de um algoritmo de aproximação de tempo polinomial. Assim, um ciclo pode ser escolhido uniformemente.

Atualmente, tenho uma pergunta stackexchange solicitando referências para algoritmos de aproximação de contagem de atalho. Li em alguns lugares que esses algoritmos existem, mas ainda não os encontraram.

bbejot
fonte