Алгоритмы для нахождения количества гамильтоновых путей на графике

Я пытаюсь решить слегка измененную версию проблемы Hamiltonian Path . Он изменен тем, что нам предоставляются начальная и конечная точки, и вместо определения того, существует ли решение, мы хотим найти число решений (которое может быть равно 0).

График имеет вид дается нам как 2D-массив, узлы которого являются элементами массива. Кроме того, мы можем двигаться только по горизонтали или вертикали, но не по диагонали. Излишне говорить, что мы не можем переехать из одного города в два, потому что для этого нам нужно будет посетить город дважды.

Я написал решение методом грубой силы, которое пробует все 4 (3 или 2 для узлов на краях) возможных ходов в каждом узле, а затем подсчитывает количество решений (когда оно достигает цели и просматривает также все остальные узлы) ), но он работал смешно долго на входах скромного размера (например, массив 7x7).

Я также подумал об использовании двунаправленного поиска , так как мы знаем цель, но это не очень помогло, поскольку мы не просто хотим, чтобы границы совпадали, мы также хотим убедиться, что все узлы были посещены. Более того, может случиться так, что когда все узлы между двумя границами исчерпаны, они заканчиваются таким образом, что их нельзя соединить.

Я чувствую, что есть что-то, чего я не знаю, что оставляет мне только решение грубой силы. Я знаю, что проблема сама по себе NP-полная, но мне интересно, есть ли какие-либо улучшения по сравнению с грубой силой. Может ли кто-нибудь предложить что-нибудь еще?

- Изменить -

Я упоминал, что использование двунаправленного поиска действительно не помогает, и я хотел бы пояснить, почему я так подумал. Рассмотрим граф 2x3, в котором верхний левый и нижний правый узлы являются началом и целью соответственно. Позвольте полосам для двунаправленного поиска перемещаться вправо от начала и влево от цели. После 2 ходов все узлы были бы посещены, но нет возможности присоединиться к границам, так как мы можем идти только в одном направлении от одного узла. Однако можно было бы заставить алгоритм работать с некоторыми изменениями, как указал Дэвид в своем ответе ниже. print (a.pop (['cc', ...])), но это вызывает ошибку. Каков самый простой способ извлечь много элементов из словаря Python?

Это мой код:

a = dict(aa='aaaa', bb='bbbbb', cc='ccccc', ...)
print(a.pop(['cc', ...]))

, но это вызывает ошибку. Каков самый простой способ извлечь много элементов из словаря Python?

17
задан Ioannis Filippidis 30 September 2017 в 20:06
поделиться