Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm A*算法中的启发式值_Algorithm - Fatal编程技术网

Algorithm A*算法中的启发式值

Algorithm A*算法中的启发式值,algorithm,Algorithm,我正在学习A*算法和dijkstra算法。发现唯一的区别是A*算法使用的启发式值。但是我怎样才能在我的图中得到这些启发值呢?。我找到了a*算法的示例图(从a到J)。你们能帮我计算这些启发值吗 红色数字表示启发式值 我现在的问题是创造迷宫逃生 启发式是对到达目的地所需的额外距离的估计 它是特定于问题的,针对不同的问题以不同的形式出现。对于图形,一个好的启发可能是:从节点到目的地的实际距离,用英寸胶带或厘米刻度测量。很有趣,但我的大学教授就是这么做的。他在黑板上拿了一英寸的胶带,想出了一个很好的启发

我正在学习A*算法和dijkstra算法。发现唯一的区别是A*算法使用的启发式值。但是我怎样才能在我的图中得到这些启发值呢?。我找到了a*算法的示例图(从a到J)。你们能帮我计算这些启发值吗

红色数字表示启发式值


我现在的问题是创造迷宫逃生

启发式是对到达目的地所需的额外距离的估计

它是特定于问题的,针对不同的问题以不同的形式出现。对于图形,一个好的启发可能是:从节点到目的地的实际距离,用英寸胶带或厘米刻度测量。很有趣,但我的大学教授就是这么做的。他在黑板上拿了一英寸的胶带,想出了一个很好的启发

所以h(A)可以是10个单位,意思是用测量尺从A到J测量的长度


当然,要使您的算法工作,启发式必须是,如果不是,它可能会给您错误的答案。

为了得到一个估计(下限)两个节点之间最小路径成本的启发式,有两种可能性(我知道):

关于图形所属基础空间的知识

例如,假设节点是平面上的点(具有x和y坐标),每条边的代价是相应节点之间的欧氏距离。在这种情况下,您可以通过计算
U.position
V.position
之间的欧几里德距离来估计(下限)从节点
U
到节点
V
的路径成本

另一个例子是一个你知道它位于地球表面的道路网。边缘的成本可能代表以分钟为单位的旅行时间。为了估算从节点
U
到节点
V
的路径成本,可以计算两者之间的大圆距离,并将其除以可能的最大行驶速度

图形嵌入

另一种可能性是将图形嵌入到一个空间中,在该空间中可以有效地估计两个节点之间的路径距离。该方法不对底层空间进行任何假设,但需要预先计算

例如,您可以在图形中定义一个地标
L
。然后,预先计算图形的每个节点到地标之间的距离,并在节点处保护该距离。为了在*搜索期间估计路径距离,您现在可以使用预先计算的距离,如下所示:节点
U
V
之间的路径距离的下限为
|dist(U,L)-dist(V,L)
。您可以通过使用多个地标来改进此启发式

对于图形,您可以使用节点A和节点H作为地标,这将为您提供图形嵌入,如下图所示。为了计算此嵌入,您必须预先计算节点A和H以及所有其他节点之间的最短路径。例如,当您想要估计两个节点B和J之间的距离时,您可以计算两个维度中的每个维度的距离,并使用两个距离中的最大值作为估计值。这对应于


哎呀,我从来没有这样想过。谢谢你的回答。如果是具体问题。我应该如何搜索迷宫问题的启发式值?@MinKhantLu在那次讲座中我和班上的任何人都没有。我给出了关于什么是好的启发式的答案?答案中说得很清楚。@13131请告诉我们您是否有更好的启发方法。顺便说一句,启发式均值估计。@Sumeethingh在抽象图上找到一个可接受的启发式是非常不平凡的,并且取决于图的许多方面,例如,边是否有向,是否有循环等。。但我只是想指出,如果图形本身不是按照描述边的方式“布局”,你不能简单地“用尺子测量”。只要看一下顶点I,就会得到4条边长与图片上的实际长度不一致的边,因此测量在这里没有意义。
A*
算法可以用来解决许多问题。启发式取决于问题。您没有指定要解决的问题。是的,sry我忘了提到我的问题,我正在创建2D迷宫逃生游戏,并考虑使用基于*的算法。在这个问题中,我应该如何计算启发值@axiacA*启发法是必须可接受且单调的函数。实现这一点的所有功能都是可能的。这是一张带着某种直觉的幻灯片。一种常见的简单启发式方法是像乌鸦一样飞翔。然而,这对道路网络来说是相当糟糕的,对公交网络来说更糟。选择取决于您的应用程序。还有一种通用的启发式解决方案称为landmarks,它在许多图上都表现良好。但是,它需要大量的预计算和空间。在这里,您选择一些节点,并为所有节点预计算到所有其他节点的所有最短路径距离。然后,在查询时,您可以使用这些信息来猜测两个任意节点之间的实际距离(通过在一个接近的地标上估计它们)@MinKhantLu查看典型的最短路径。它们几乎在所有情况下都像乌鸦一样(直线)飞行吗?如果是这样的话,就用它作为启发。它是最简单的启发式算法,可用于许多游戏应用。不要将其用于道路或交通网络,它在那里的性能会非常差。Landmark启发式总是一个很好的通用选择,但它需要预先计算和空间(谷歌地图没有问题,但可能对你的游戏来说)哦,对不起,刚才注意到你说的是迷宫,而不是一般的游戏。迷宫通常没有正确方向的常识。最短路径几乎总是超复杂的,并且涉及所有的路径