Ciclo reticolare auto-evitante casuale all'interno di un determinato riquadro di delimitazione


25

In connessione con il puzzle Slither Link , mi sono chiesto: supponiamo di avere una griglia di celle quadrate e che voglio trovare un semplice ciclo di bordi della griglia, uniformemente casuale tra tutti i possibili cicli semplici.n×n

Un modo per farlo sarebbe usare una catena di Markov i cui stati sono insiemi di quadrati i cui confini sono cicli semplici e le cui transizioni consistono nella scelta di un quadrato casuale da capovolgere e mantenere il capovolgimento quando l'insieme modificato di quadrati ha ancora un ciclo semplice come il suo confine. Si può passare da qualsiasi ciclo semplice a un altro in questo modo (utilizzando risultati standard sull'esistenza di bombardamenti), quindi alla fine converge in una distribuzione uniforme, ma quanto velocemente?

In alternativa, esiste una catena Markov migliore o un metodo diretto per selezionare cicli semplici?

ETA: vedi questo post sul blog per il codice per calcolare il numero di cicli che sto cercando e indicazioni per OEIS per alcuni di questi numeri. Come sappiamo, il conteggio è quasi la stessa cosa della generazione casuale, e deduco dalla mancanza di qualsiasi modello evidente nelle fattorizzazioni di questi numeri e dalla mancanza di una formula nella voce OEIS che è improbabile che ci sia un noto metodo diretto semplice . Ma ciò lascia ancora la questione di quanto velocemente converga questa catena e se ci sia una catena migliore spalancata.


1
I confini degli insiemi contati dalla sequenza OEIS non sono necessariamente cicli semplici, ad esempio per 3x3, uno dei 218 ha tutti i quadrati tranne il centro, e altri quattro sono dati rimuovendo ulteriormente un angolo.
Colin McQuillan,

1
Per le griglie 2xn i numeri sono indicati in oeis.org/A059020 . Per 3xn sono abbastanza sicuro che siano 6,40,213,1049,5034,23984,114069,542295,2577870,12253948,58249011,276885683,1316170990,6256394122,29739651711,141366874247, ... (non in OEIS). Ho impostato la matrice di trasferimento per calcolarla manualmente ma l'ho confrontata con una matrice generata dalla macchina e l'unica voce che differiva da quella a mano era corretta e quella a macchina sbagliata. (Questo dovrebbe apparire nel caso 3x3 - la matrice della macchina avrebbe permesso un ottomino con un buco al centro.)
David Eppstein

1
Dovresti inviare quella sequenza a Neil Sloane in modo che possa inserirla nell'OEIS.
Peter Shor,

1
@ David: grazie. Probabilmente, è tempo per me di imparare il metodo della matrice di trasferimento in modo più approfondito.
Yoshio Okamoto,

2
@ David: hai appena perso due ore della mia vita con quel link al puzzle .. Grazie!
domotorp

Risposte:


1

Sembra che, poiché stai usando i conteggi per il numero di cicli in un grafico per scegliere casualmente un ciclo, che se avessi un'approssimazione casuale per questo numero, potresti comunque scegliere un ciclo approssimativamente in modo uniforme.

Si noti che il numero di cicli in un grafico , che contiene il bordo ( u , v ) , è uguale al numero di cicli in G - ( u , v ) più il numero di percorsi semplici da u a v in G - ( u , v ) . Pertanto, con un'approssimazione del tempo polinomiale per il numero di percorsi u - v , un'approssimazione del tempo polinomiale può essere ottenuta costruendo in modo incrementale fino a G un bordo alla volta, approssimando man mano che si procede. G(u,v)G(u,v)uvG(u,v)uvG

Gn×n(u,v)uvG(u,v)

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

In questo modo, viene scelto un numero polinomiale di spigoli, ognuno dei quali richiede un piccolo numero di calcoli di un algoritmo di approssimazione temporale polinomiale. Pertanto, un ciclo può essere scelto in modo uniforme.

Al momento ho una domanda su stackexchange che richiede riferimenti per algoritmi di approssimazione conteggio dei percorsi veloci. Ho letto in alcuni punti che esistono questi algoritmi ma non li ho ancora trovati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.