Algorithm A*vs最长路径中的树

Algorithm A*vs最长路径中的树,algorithm,tree,a-star,Algorithm,Tree,A Star,设T是一棵树,其中每个节点表示一个状态。根表示初始状态。从父级到子级的边指定可以在父级上执行的操作,以更改状态(新状态将是子级)。每条边都与一个增益相关联,即,我通过从父状态转换到子状态来获得一些东西 此外,假设从根节点到叶节点的每条路径都有长度Q 我的目标是找到长度为Q的最有希望的路径,即保证最大增益的路径(其中路径增益定义为连接到路径边缘的增益总和) 显然,我不想探索整棵树,因为T可能非常大 因此,我考虑使用*。我知道A*可以用于在图形中查找最短路径,但是: 我没有成本,我有收益 我想找到

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

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

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

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

因此,我考虑使用*。我知道A*可以用于在图形中查找最短路径,但是:

  • 我没有成本,我有收益
  • 我想找到最长的路径(实际上不是距离起始节点最长的路径,而是其权重(如果求和)的值最高的路径)
  • 我有一棵树而不是一个图(没有循环!)
最后,我提出了一系列问题,我想向大家提出:

  • A*是否适用于此类问题?我会通过应用它来找到最佳解决方案吗
  • 由于A*需要在最短路径的情况下使用从当前节点到目标的成本(低估),我是否需要寻找从当前节点到目标的收益(高估)估计,并将其用作启发
  • 给定T中的一个节点n,我的想法是计算启发式h(n)作为n的子节点获得的增益的总和,这可能不是很紧。你认为有更好的解决办法吗
  • 编辑:给定树中的节点n,附加到从n传出的边上的增益不能大于数量U(n)。此外,U(n)随着n深度的增加而变得越来越小。

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

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

    结论 如果没有提供关于边增益的附加信息,如果不探索整个树,就无法找到最佳路径

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


    下面的评论中给出了您在撰写此答案后对问题所做更改的回复。一定要检查它们。

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

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

    结论 如果没有提供关于边增益的附加信息,如果不探索整个树,就无法找到最佳路径

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



    下面的评论中给出了您在撰写此答案后对问题所做更改的回复。一定要复习它们。

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

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

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