В связи с загадкой Slither Link мне было интересно: предположим, что у меня сетка квадратных ячеек, и я хочу найти простой цикл ребер сетки, равномерно случайным образом среди всех возможных простых циклов.
Один из способов сделать это - использовать цепь Маркова, состояния которой представляют собой наборы квадратов, границы которых являются простыми циклами, а переходы состоят из выбора случайного квадрата для переворачивания и удержания переворота, когда измененный набор квадратов все еще имеет простой цикл как его граница. Таким способом можно перейти от любого простого цикла к любому другому (используя стандартные результаты о существовании оболочек), так что в конечном итоге это сходится к равномерному распределению, но как быстро?
В качестве альтернативы, есть ли лучшая цепь Маркова или прямой метод выбора простых циклов?
ETA: см. В этом сообщении в блоге код для расчета количества циклов, которые я ищу, и указатели на OEIS для некоторых из этих чисел. Как мы знаем, подсчет - это почти то же самое, что и случайная генерация, и я заключаю из отсутствия какой-либо очевидной закономерности в факторизации этих чисел и отсутствия формулы в записи OEIS, что вряд ли существует известный простой прямой метод , Но это все еще оставляет вопрос о том, как быстро эта цепь сходится и есть ли лучшая цепь широко открыта.
источник
Ответы:
Кажется, что, поскольку вы используете счетчики только для числа циклов на графике, чтобы случайным образом выбрать цикл, то, если бы вы имели случайное приближение для этого числа, вы все равно могли бы выбрать цикл приблизительно равномерно.
Обратите внимание, что число циклов в графе , содержащем ребро ( u , v ) , равно числу циклов в G - ( u , v ) плюс количество простых путей от u до v в G - ( u , v). ) . Таким образом, с помощью аппроксимации полиномиального времени для числа u - v- путей аппроксимация полиномиального времени может быть достигнута путем постепенного наращивания до G одного ребра за раз, аппроксимируя по мере движения.G (u,v) G−(u,v) u v G−(u,v) u v G
Таким образом, выбирается полиномиальное число ребер, каждое из которых требует небольшого количества вычислений алгоритма аппроксимации полиномиального времени. Таким образом, цикл может быть выбран равномерно.
В настоящее время у меня есть вопрос об обмене стека, запрашивающий ссылки для алгоритмов аппроксимации быстрого подсчета. Я читал в нескольких местах, что эти алгоритмы существуют, но еще не нашли их.
источник