【问题标题】:C# RushHour iterative deepenig, optimizationC# RushHour 迭代深化、优化
【发布时间】:2013-03-24 22:11:32
【问题描述】:

我必须使用迭代深化搜索来解决高峰时间问题,我正在为每一步生成新节点,一切正常,除了计算所有内容需要太多时间,原因是我正在生成重复的节点。任何想法如何检查重复?

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

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

我试图不更换汽车,但使用了与根节点中相同的集合,但随后汽车仅朝一个方向移动。

我认为我需要以某种方式绑定汽车收藏,但不知道如何。

The code

任何想法如何停止重复?

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

【问题讨论】:

    标签: c# algorithm artificial-intelligence


    【解决方案1】:

    如果你想坚持迭代深化,那么最简单的解决方案可能是构建一个哈希表。那么你需要对每个新节点做的就是

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

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

    【讨论】:

    • 您能告诉我们您尝试了什么以及为什么没有成功吗? (请注意,我建议的替代解决方案确实对我有用)。
    • 您还可以从开始状态向前搜索,从结束状态向后搜索,并行(考虑广度优先搜索,但实际并发也可能工作)。一旦两个搜索在中间相遇,您就会得到一个解决方案,从而将必要的搜索树深度减半。
    猜你喜欢
    • 2011-11-15
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2020-07-14
    • 2010-10-22
    • 2021-07-25
    相关资源
    最近更新 更多