【问题标题】:A* vs trees in longest pathA* 与最长路径中的树
【发布时间】:2013-06-10 04:09:52
【问题描述】:

令 T 是一棵树,其中每个节点代表一个状态。根代表初始状态。从父节点到子节点的边指定了可以对父节点执行的操作以更改状态(新状态将是子节点)。每条边都与增益相关联,即,我通过从父状态转换到子状态获得了一些东西。

此外,假设从根到叶节点的每条路径的长度为 Q。

我的目标是找到最有希望的长度为 Q 的路径,即保证最大增益的路径(其中路径增益定义为附加到路径边缘的增益的总和)。

显然,我不想探索整个树,因为 T 可能非常大。

因此,我考虑申请 A*。我知道 A* 可以用来找到图中的最短路径,但是:

  • 我没有成本,我有收获
  • 我想找到最长的路径(实际上不是到起始节点的距离最长,而是权重,如果加起来,给出最高值)
  • 我有一个树而不是一个图(没有循环!)

最后,我想出了一组我想向你提出的问题:

  1. A* 适合这类问题吗?我会通过应用找到最佳解决方案吗?
  2. 由于 A* 需要在最短路径的情况下使用(低估)从当前节点到目标的成本,我是否需要寻找从当前节点到目标的增益的(高)估计目标并将其用作启发式方法?
  3. 给定 T 中的节点 n,我的想法是将启发式 h(n) 计算为 n 的子节点获得的增益的总和,这可能不是那么严格。您认为有更好的解决方案吗?

编辑:给定树中的节点 n,附加到从 n 传出的边的增益不能大于数量 U(n)。而且,随着n的深度增加,U(n)变得越来越小。

【问题讨论】:

标签: algorithm tree a-star


【解决方案1】:

分析

原因如下。假设您断言路径P 是最优的,并且没有检查边缘e。我可以在不失一般性的情况下将e 的增益设置为大于树中所有其他增益之和的值。那么你的路径 P不是最优的。

因此,在检查所有边的增益之前做出的任何最优性断言都是错误的。

结论

如果没有提供关于边缘增益的其他信息,如果不探索整棵树,您将无法找到最佳路径

例如,如果您有增益值的上限,则可以使用 A* 来更有效地找到最佳路径,而不是检查每条边。


在撰写此答案后,您对问题所做的更改的回复在下面的 cmets 中。请务必查看它们。

【讨论】:

  • 我确信从节点 n 传出的边的总和不能大于值 U(n)。此外,随着 n 的深度增加,U(n) 变得越来越小(因此,增益也会增加)。是否足以作为上限?
  • @Eleanore 绑定就足够了。因此,您应该能够完全按照您在问题中步骤 1、2、3 中概述的内容进行操作(我检查了您的推理,似乎是正确的)。 A* 是合适的并且会找到最佳解决方案(假设您的启发式是正确的)。您是正确的,在这种情况下,启发式应该是过度估计。
  • 关于能够使用 A* 和/或使用高估启发式的部分是完全错误的——那是行不通的。不过,Bellman-Ford 可能会处理图的否定,因为它是非循环的,但将花费与蛮力一样长或更长的时间。请参阅 OP 之前提出的this question(所以她已经知道答案...)
  • @BlueRaja-DannyPflughoeft 请详细说明为什么它“完全错误”和“不起作用”?否定所有收益,突然之间,您正试图找到从起始节点到叶(目标)节点的最低成本路径。每个节点都有一个后继函数(节点的子节点)。每个动作都有一个成本(否定增益)。否定上面提到的高估启发式,你就会得到一个低估的启发式——这是典型的 A* 所需要的。
  • @TimothyShields:Dijkstra 和 A* 不适用于具有负权重的图 (并且 A* 不适用于负启发式)
【解决方案2】:

要回答这个问题,A* 通常不是探索树木的正确方法。它适用于加权图,而不是树。如果您正在探索一棵树,则使用回溯。您可以通过使用启发式或修剪使回溯更加智能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多