Генерация графов только с одним действительным гамильтоновым циклом
Я ищу несколько советов / указаний в правильном направлении.
Мое требование состоит в том, чтобы сгенерировать график, а не решать один для решения.
Я ищу реализовать алгоритм для генерации графа (сетка NxN) только с 1 гамильтоновым циклом. Обратите внимание, что только одно уникальное решение имеет ключевое значение. График будет NxN сеткой узлов, каждый из которых имеет только 4 соседних узла, то есть верхний, правый, нижний, левый. Узлы можно посетить только один раз. Помимо этого, могут быть некоторые специальные узлы.
- Мертвые узлы, т.е. они не имеют краевых соединений
- Фиксированный узел входа и выхода, т.е. узлы входа и выхода уже определены, и никакой другой узел не может соединиться с данным узлом. Это может быть. смежные узлы б. прямые узлы
Некоторые примеры:
@ - means that nodes can be connected with adjacent nodes (top,right,bottom,left)
$ - indicated dead end (no connections with adjacent nodes)
Graph 1 =>
@-@-@
@-$-@
@-@-@
Solution 1 =>
1-2-3
8-$-4
7-6-5
here the solution of the graph is 1->2->3->4->5->6->7->8->1. Notice how the $ node was not included in the final solution.
Мой подход:
Я беру сетку * n и начинаю с размещения случайных мертвых узлов на графике. После этого я размещаю случайные специальные узлы. Затем я запускаю поиск dfs, который просматривает всю сетку, чтобы увидеть, является ли действительный цикл представлением, который удовлетворяет специальным критериям узла и посещает каждый узел только один раз (за исключением начального узла) и заканчивается на начальном узле, что делает его полным циклом.
Мои вопросы:
Здесь я спрашиваю, как мне обеспечить, чтобы на графике был только 1 действительный цикл. Одна вещь, которую я могу сделать, это итерация на уровне рекурсивно, добавляя больше мертвых узлов и специальных узлов после каждого цикла, пока число действительных гамильтоновых циклов не уменьшится до одного. Это то, что я планирую реализовать.
Как бы вы идеально подошли к этой проблеме?
2 ответа
Почему бы просто не соединить внешние узлы в круг и пометить все внутренние узлы как "мертвые узлы"?
Например, заимствуя вашу запись сверху...
График 3х3
@@@
@$@
@@@
График 4х4
@@@@
@$$@
@$$@
@@@@
График 5х5
@@@@@
@$$$@
@$$$@
@$$$@
@@@@@
Всегда будет только одно решение, и легко генерировать графики произвольного размера.
Сначала я хотел бы отметить, что я еще не нашел полное решение.
То, что я хотел бы сделать, это сгенерировать цикл в сетке и сохранить это "решение", а затем добавить тупик на все пропущенные квадраты, что делает сгенерированный цикл гамильтонианом. тогда я следовал бы вашему подходу, итеративно добавляя "вынужденные ребра" и проверяя, существует ли второй (читай: "более одного") гамильтонов цикл.
эта проверка может быть сформулирована как следующий вопрос: "Как вы проверяете, содержит ли данный планарный граф более одного гамильтонова цикла, если вы его знаете?".
причина, по которой я использую "планар", легко объяснима. Ваша начальная сетка является плоской, и удаление узлов или вынужденных ребер не делает ее неплоской. Это связано с тем, что принудительный фронт AB может быть преобразован в AXB, где X является новым узлом и, следовательно, должен посещаться любым гамильтоновым циклом, который приводит к посещению принудительного края.
Один способ, которым я пытался преобразовать один гамильтонов цикл в другой, приведен ниже:
Если вы берете два плоских гамильтоновых цикла и берете все ребра там, где они не совпадают, они образуют цикл (который может посещать узлы более одного раза). Этот цикл имеет свойство чередования ребер между одним гамильтоновым циклом и другим. Я не мог найти способ полностью изменить этот процесс.