我需要使用迭代加深搜索来解决RushHour问题,我为每一步移动生成一个新节点,一切运作正常,只是计算所有步骤所需的时间太长了,原因是我生成了重复的节点。有什么方法可以检查重复节点吗?
首先我从根节点开始,然后有一个方法检查每辆车是否可以移动,如果可以,从当前节点创建一个新节点,但将那辆可以移动的车替换为具有新坐标的新车。
问题是算法越深入,重复移动就越多。
我尝试过不替换车,而是使用根节点中使用的相同集合,但这样车只能朝一个方向移动。
我想我需要以某种方式关联车的集合,但不知道怎么做。
有什么方法可以停止生成重复节点吗?
题外话:我是C#的新手(读了几篇教程,然后使用了两天),所以你能告诉我我做错了什么或者我不应该做什么吗?
回答:
如果你想坚持使用迭代加深,那么最简单的解决方案可能是构建一个哈希表。然后你只需要对每个新节点做类似以下的事情:
NewNode = GenerateNextNodeif not InHashTable(NewNode) then AddToHashTable(NewNode) Process(NewNode)
或者,RushHour中可能的位置(节点)数量相当少(假设你使用的是标准棋盘尺寸),并且可以相当容易地生成所有可能的(和不可能的!)棋盘。然后你可以从“解决方案”状态开始,而不是使用迭代加深,而是向后工作(标记所有可能的“父”状态),直到你到达起始状态。通过在可能状态的表上工作,你永远不会生成重复,并且通过标记每个状态一旦被访问,你就不会重新访问状态。