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