Випадковий цикл решітки, що ухиляється самостійно, у межах заданої рамки


25

У зв'язку з головоломкою Slither Link мені було цікаво: припустимо, у мене є сітка квадратних осередків , і я хочу знайти простий цикл країв сітки, рівномірно навмання серед усіх можливих простих циклів.n×n

Одним із способів зробити це було б використання ланцюга Маркова, стани якого є наборами квадратів, межі яких є простими циклами і переходи яких полягають у виборі випадкового квадрата, який слід перевернути, і збереження фліп, коли модифікований набір квадратів все ще має простий цикл, як її межа. Таким способом можна дістатись із будь-якого простого циклу до будь-якого іншого (використовуючи стандартні результати про існування оболонок), так що це врешті-решт переходить до рівномірного розподілу, але як швидко?

Як варіант, чи є кращий ланцюг Маркова або прямий метод вибору простих циклів?

ETA: Дивіться цю публікацію в блозі для коду, щоб обчислити кількість циклів, які я шукаю, і покажчики на OEIS на деякі з цих чисел. Як ми знаємо, підрахунок - це майже те саме, що і випадкове покоління, і я випливаю з відсутності будь-якої очевидної закономірності в факторизації цих чисел та відсутності формули у записі OEIS, що навряд чи знайдеться простий простий прямий метод . Але це все ще залишає питання про те, наскільки швидко ця ланцюг сходить і чи є краща ланцюг широко відкритою.


1
Межа наборів, підрахованих послідовністю OEIS, не обов'язково є простими циклами, наприклад, для 3x3, один з 218 має всі квадрати, крім середини, а ще чотири задані шляхом подальшого видалення одного кута.
Колін МакКійлан

1
Для 2xn сіток цифри вказані в oeis.org/A059020 . Для 3xn я впевнений, що це 6,40,213,1049,5034,23984,114069,542295,2577870,12253948,58249011,276885683,1316170990,6256394122,29739651711,141366874247, ... (не в OEIS). Я встановив матрицю передачі для обчислення її вручну, але я порівняв її з машинною матрицею, і єдиний запис, який вони відрізняли, ручний був правильним, а машинний - невірним. (Це має відображатися у випадку 3х3 - машинна матриця дозволила б октоміно з отвором у центрі.)
Девід Еппштейн

1
Ви повинні надіслати цю послідовність Нілу Слоану, щоб він міг помістити його в ОЕІС.
Пітер Шор

1
@David: Дякую Напевно, мені настав час більш детально вивчити метод матриці передачі.
Йосіо Окамото

2
@David: Ви тільки що витратили дві години мого життя з цим посиланням на головоломку .. Thx!
домоторп

Відповіді:


1

Здається, що оскільки ви використовуєте підрахунки для кількості циклів у графі, щоб випадковим чином обрати цикл, якщо ви мали випадкове наближення до цього числа, то ви все одно можете вибрати цикл приблизно рівномірно.

Зауважимо, що кількість циклів у графі , який містить ребро , дорівнює кількості циклів у плюс кількості простих шляхів від до в . Таким чином, з наближенням поліноміального часу для кількості - шляхів наближення поліноміального часу може бути досягнуто шляхом поступового побудови до одного краю за один раз, наближеного до того, як ви йдете. ( u , v ) G - ( u , v ) u v G - ( u , v ) u v GG(u,v)G(u,v)uvG(u,v)uvG

Я насправді думаю, що існує більш простий метод вибору циклу. Нехай - весь графік ребер навколо сітки сітки квадратів. Для кожного ребра знайдіть кількість циклів, що містять це ребро (яка - кількість контурів - у - ). Потім випадковим чином виберіть ребро, зважене на кількість циклів, які його містять. Це буде перший край у вашому випадково вибраному циклі. Усі інші краї вибиратимуть, подовжуючи по одному краю.n × n ( u , v ) u v G ( u , v )Gn×n(u,v)uvG(u,v)

Припустимо, що ви вибрали шлях, який є частиною вашого випадкового циклу. Нехай набір вершин на цьому шляху дорівнює а і - кінцеві вершини шляху. Нехай також - набір сусідів яких немає у (зауважте, що у цьому конкретному графіку є лише до 3). Для кожного підрахуйте кількість контурів - в індукованому графіку . Потім вибрати сусід, , з зваженого по доріжках тільки підраховуються. Додати крайv s v e N v e C u N u v s G [ V - ( C - { v s , v e } ) ] u v e ( v e , u )CvsvеNvеСуNуvсГ[V-(С-{vс,vе})]уvе(vе,у) до обраного Вами шляху, продовжуючи його на одну.

Таким чином вибирається поліноміальне число ребер, кожен з яких потребує невеликої кількості обчислень алгоритму наближення поліноміального часу. Таким чином, цикл може бути обраний рівномірно.

В даний час у мене є питання stackexchange, в якому просять посилання на алгоритми наближення кількості швидких шляхів. Я читав у кількох місцях, що ці алгоритми існують, але ще не знайшли їх.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.