C#RushHour迭代深化、优化

C#RushHour迭代深化、优化,c#,algorithm,artificial-intelligence,C#,Algorithm,Artificial Intelligence,我必须使用迭代深化搜索来解决rushhour问题,我正在为每个移动生成新节点,所有操作都很好,只是计算所有操作需要花费太多时间,原因是我正在生成重复的节点。你知道如何检查副本吗 首先,我从根开始,然后有一个方法检查每辆车是否可以移动它。如果可以,则从当前节点创建新节点,但将具有有效移动的一辆车替换为具有新坐标的新车 问题是,算法越深,重复的动作就越多 我试图不替换汽车,但使用了与根节点相同的集合,但汽车只朝一个方向移动 我想我需要以某种方式联系汽车收藏,但不知道如何联系 有没有办法停止复制 离

我必须使用迭代深化搜索来解决rushhour问题,我正在为每个移动生成新节点,所有操作都很好,只是计算所有操作需要花费太多时间,原因是我正在生成重复的节点。你知道如何检查副本吗

首先,我从根开始,然后有一个方法检查每辆车是否可以移动它。如果可以,则从当前节点创建新节点,但将具有有效移动的一辆车替换为具有新坐标的新车

问题是,算法越深,重复的动作就越多

我试图不替换汽车,但使用了与根节点相同的集合,但汽车只朝一个方向移动

我想我需要以某种方式联系汽车收藏,但不知道如何联系

有没有办法停止复制


离题:我是C#新手(阅读了几篇教程,然后已经使用了2天),那么你能告诉我我做错了什么或者我不应该做什么吗?

如果你想坚持迭代深化,那么最简单的解决方案可能是构建一个哈希表。然后,您只需对每个新节点执行以下操作

NewNode = GenerateNextNode
if not InHashTable(NewNode) then
  AddToHashTable(NewNode)
  Process(NewNode) 

或者,RushHour中可能的位置(节点)数量相当少(假设您使用的是标准板尺寸),并且可以相当容易地生成所有可能(和不可能!)的板。然后,您可以从“解决方案”状态开始,然后向后工作(勾选所有可能的“父”状态),直到达到开始状态。通过处理可能的状态表,您永远不会生成重复的状态,并且通过在访问每个状态后对其进行标记,您永远不会重新访问状态

你能告诉我们你尝试了什么,为什么没有成功吗?(请注意,我建议的替代解决方案确实适用于我)。您还可以从开始状态向前搜索,从结束状态向后搜索,并行搜索(考虑广度优先搜索,但实际并发性也可以)。一旦两个搜索在中间相遇,就会得到一个解决方案,从而将必要的搜索树深度减半。