En relation avec le puzzle Slither Link , je me suis demandé: supposons que j'ai une grille de cellules carrées et que je souhaite trouver un cycle simple de bords de grille, uniformément au hasard parmi tous les cycles simples possibles.
Une façon de le faire serait d'utiliser une chaîne de Markov dont les états sont des ensembles de carrés dont les frontières sont des cycles simples et dont les transitions consistent à choisir un carré aléatoire à retourner et à conserver le retournement lorsque l'ensemble de carrés modifié a toujours un cycle simple comme sa frontière. On peut passer de n'importe quel cycle simple à n'importe quel autre de cette manière (en utilisant des résultats standard sur l'existence de shellings) donc cela finit par converger vers une distribution uniforme, mais à quelle vitesse?
Sinon, existe-t-il une meilleure chaîne de Markov ou une méthode directe pour sélectionner des cycles simples?
ETA: Voir ce billet de blog pour le code pour calculer le nombre de cycles que je recherche, et des pointeurs vers OEIS pour certains de ces nombres. Comme nous le savons, le comptage est presque la même chose que la génération aléatoire, et je déduis de l'absence de tout schéma évident dans les factorisations de ces nombres et de l'absence d'une formule dans l'entrée OEIS qu'il est peu probable qu'il existe une méthode directe simple connue . Mais cela laisse toujours la question de la rapidité avec laquelle cette chaîne converge et s'il existe une meilleure chaîne grande ouverte.
la source
Réponses:
Il semble que parce que vous utilisez uniquement les nombres pour le nombre de cycles dans un graphique pour choisir un cycle au hasard, que si vous aviez une approximation aléatoire pour ce nombre, alors vous pouvez toujours choisir un cycle à peu près uniformément.
Notez que le nombre de cycles dans un graphique , qui contient le bord ( u , v ) , est égal au nombre de cycles dans G - ( u , v ) plus le nombre de chemins simples de u à v dans G - ( u , v ) . Ainsi, avec une approximation polynomiale du temps pour le nombre de trajets u - v , l'approximation polynomiale du temps peut être obtenue en construisant progressivement jusqu'à G un bord à la fois, en se rapprochant au fur et à mesure.G (u,v) G−(u,v) u v G−(u,v) u v G
De cette façon, un nombre polynomial d'arêtes est choisi, chacune nécessitant un petit nombre de calculs d'un algorithme d'approximation polynomiale temporelle. Ainsi, un cycle peut être uniformément choisi.
J'ai actuellement une question stackexchange demandant des références pour des algorithmes d'approximation de comptage de chemin rapide. J'ai lu à quelques endroits que ces algorithmes existent mais je ne les ai pas encore trouvés.
la source