我正在尝试解决哈密顿路径问题的略微修改版本。它的修改在于将起点和终点提供给我们,而不是确定解决方案是否存在,我们想要找到解决方案的数量(可能是 0)。
该图以二维数组的形式提供给我们,节点是数组的元素。此外,我们只能水平或垂直移动,不能沿对角线移动。不用说,我们不能从一个城市去两个城市,因为要这样做,我们需要访问一个城市两次。
我写了一个蛮力解决方案,在每个节点上尝试所有 4 个(边缘节点为 3 个或 2 个)可能的移动,然后计算解决方案的数量(当它达到目标并且也看到所有其他节点时),但是它在中等大小的输入(比如 7x7 数组)上运行了荒谬的时间。
我也想过使用双向搜索,因为我们知道目标,但这并没有真正帮助,因为我们不仅希望边缘相遇,我们还希望确保所有节点都已被访问。此外,当两个边缘之间的所有节点都用尽时,它们可能会以无法连接的方式结束。
我觉得有一些我不知道的东西让我只有一个蛮力解决方案。我知道问题本身是 NP 完全的,但我想知道是否对蛮力有任何改进。有人可以提出其他建议吗?
- 编辑 -
我提到使用双向搜索并没有真正的帮助,我想澄清我为什么这么认为。考虑一个 2x3 图形,左上角和右下角节点分别是起点和目标。让双向搜索的边缘从起点向右移动,从目标向左移动。在 2 次移动之后,所有节点都会被访问,但无法加入边缘,因为我们只能从一个节点向一个方向前进。但是,正如大卫在下面的回答中指出的那样,可以通过一些修改使算法工作。