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