【问题标题】:What is the point of IDA* vs A* algorithmIDA* vs A* 算法有什么意义
【发布时间】:2016-01-06 17:04:24
【问题描述】:

我不明白IDA* 是如何节省内存空间的。 根据我的理解,IDA*A* 迭代深化。

A* 使用的内存量与 IDA* 使用的内存量有什么区别。

IDA* 的最后一次迭代不会表现得与A* 完全相同并且使用相同数量的内存。当我跟踪IDA* 时,我意识到它还必须记住低于f(n) 阈值的节点的优先级队列。

我了解 ID 深度优先搜索通过允许它像搜索一样进行广度优先搜索,而不必记住每个节点,从而有助于深度优先搜索。但我认为A* 已经表现得像深度优先,因为它忽略了沿途的一些子树。迭代加深是如何减少内存占用的?

另一个问题是具有迭代深化的深度优先搜索允许您通过使其表现得像广度优先来找到最短路径。但是A* 已经返回最优最短路径(假设启发式是可以接受的)。迭代深化如何帮助它。我觉得 IDA* 的最后一次迭代与 A* 相同。

【问题讨论】:

    标签: algorithm path-finding a-star


    【解决方案1】:

    IDA* 中,与A* 不同,您不需要保留一组打算访问的暂定节点,因此,您的内存消耗仅专用于递归函数的局部变量。

    虽然这种算法在内存消耗上较低,但它也有自己的缺陷:

    与 A* 不同,IDA* 不使用动态规划,因此通常最终会多次探索相同的节点。 (IDA* In Wiki)

    仍然需要为您的情况指定启发式函数,以便不扫描整个图,但每时每刻所需的扫描内存只是您当前正在扫描的路径,没有其周围节点。

    以下是每个算法所需内存的演示:

    A* 算法中,所有节点及其周围节点都需要包含在“需要访问”列表中,而在IDA* 中,当您到达其预览节点时,您会“懒惰”地获得下一个节点,所以您无需将其包含在额外的集合中。

    如 cmets 中所述,IDA* is basically just IDDFS with heuristics:

    【讨论】:

    • 但是IDA*是否仍然需要存储它打算访问的节点,因为它仍然会回溯,并且在回溯时,它希望找到下一个最佳路径。 A* 需要存储节点,IDA* 和 A* 不一样,但是你在某个 f(n) 之后停止并重新启动?你是说 IDA* 只是 IDDFS,除了启发式。就像在阈值以下的所有节点一样,只要所有子节点的 f(n) 都低于阈值,访问节点的子节点就没有特定的顺序?
    • IDA* 访问的每个节点都已经包含其对其相邻节点的引用,因此当您在调用堆栈中拥有该节点(上图中的黄色)时,您可以对其进行迭代。
    • 所以在 A* 中,当您沿着一条路径前进时,您可能会意识到另一个节点具有更好的 f(n) 值并开始沿着另一条路径前进。但 IDA* 不会这样做,因为它不会将节点存储在优先级队列中,它只会在选择下一个要向下的子节点时忽略 f(n) 值,除非 f(n) 值大于阈值?
    • 抱歉,我编辑了我的最后一条评论,您能验证它是否正确吗?
    猜你喜欢
    • 2021-11-29
    • 1970-01-01
    • 2013-07-21
    • 2016-05-24
    • 2010-12-27
    • 2011-11-30
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多