Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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 什么样的启发式成本是正确的?为什么我的答案是错误的?在图上寻找最优路径_Algorithm_Mathematical Optimization_A Star - Fatal编程技术网

Algorithm 什么样的启发式成本是正确的?为什么我的答案是错误的?在图上寻找最优路径

Algorithm 什么样的启发式成本是正确的?为什么我的答案是错误的?在图上寻找最优路径,algorithm,mathematical-optimization,a-star,Algorithm,Mathematical Optimization,A Star,我有一个简单的图,我需要找到这个图的启发式代价 图为(矩阵表示法): 图片: 括号中的值表示当前目标顶点的顶点启发式成本 绿色顶点是起点,红色顶点是目标 我创建了这个heristic成本矩阵: 0 2 6 3 1 9 5 9 0 2 4 6 4 1 1 3 0 5 2 9 4 3 1 5 0 1 7 8 0 6 2 1 0 10 14 2 1 6 3 7 0 5 1 4 3 2 1 3 0 我必须解释一下。该矩阵表示:例如,目标顶点为7;我们在矩阵中找到第7行;第1列中的值表示从1个顶点到7

我有一个简单的图,我需要找到这个图的启发式代价

图为(矩阵表示法):

图片:

括号中的值表示当前目标顶点的顶点启发式成本

绿色顶点是起点,红色顶点是目标

我创建了这个heristic成本矩阵:

0 2 6 3 1 9 5
9 0 2 4 6 4 1
1 3 0 5 2 9 4
3 1 5 0 1 7 8
0 6 2 1 0 10 14
2 1 6 3 7 0 5
1 4 3 2 1 3 0
我必须解释一下。该矩阵表示:例如,目标顶点为7;我们在矩阵中找到第7行;第1列中的值表示从1个顶点到7个顶点的启发式成本(7是目标);第5列中的值表示从5个顶点到7个顶点的启发式成本(7是目标);如果目标是5,我们将使用5行,等等

这种启发式的成本是建立在零基础上的。我不知道如何找到好的启发式成本。这就是问题所在

总结如下:

首先,我的算法发现了错误的路径(可能是因为错误的启发式)。它发现了1-3-4-5(长度5),但最好的是1-2-5(长度4)

另外,老师说,我的启发式代价阻止了算法找到好的路径,但对他没有帮助。我很难把他说的翻译成英语,但他说了一些类似这样的话:“你的启发式方法不能高估最佳路径”。这是什么意思


所以问题是:如何在我的案例中找到好的启发式成本?

我将总结我的评论作为答案

首先,请注意,“高估最佳路径”意味着从某个节点v到目标的最短路径长度为
k
,但
h(v)=k'
,因此
k'>k
。在这种情况下,启发式算法高估了路径的长度。对1个或多个节点执行此操作的启发式称为“不允许”,并且A*不能保证使用此启发式找到最短路径

(永不高估)保证为*提供最佳路径。 对于所有
v
,最简单的容许启发式是h(v)=0。注意,在本例中,A*的行为实际上类似于(基本上是穿制服的A*)

您可以找到更多信息丰富的启发式方法,其中一个示例是首先对图形进行预处理,然后找到从每个节点到目标的最短未加权路径。这可以通过以下方法有效地完成。将从一些
v
到目标的未加权距离表示为
uwd(v)


现在,您可以创建一个启发式,即
uwd(v)*MIN_-WEIGHT
,其中
MIN_-WEIGHT
是图中最小的边权重。

a*要求启发式低估最短路径的成本,否则可能会产生次优结果。这就是说,对于这样一个简单的图,你根本不需要*号,你可以运行一个全对最短路径算法。@larsmans,但我的任务是使用*号。这只是实验室:)。我不能说,在这里用*是愚蠢的。大家都明白这一点。他们只是想让我了解A*是如何工作的。什么
A*要求启发式低估最短路径的成本,或者可能产生次优结果?你能提供一个例子吗?~这是维基上写的。也许是语言障碍。。。但我不明白这是什么意思。你能提供一个例子吗?你已经有了这个例子,你的代码返回了一个次优路径。查看任何好的AI教科书了解为什么会发生这种情况,例如:@SharikovVladislav“高估最佳路径”意味着从某个节点到目标的最短路径长度为
k
,但
h(v)=k'
,因此
k
。在这种情况下,启发式算法高估了路径的长度。对1个或多个节点执行此操作的启发式称为“不允许”,并且A*不能保证使用此启发式找到最短路径。如果你为所有的v选择
h(v)=0
,你就可以保证你的A*永远不会高估,如果你对图没有任何知识-这是你可以使用的唯一可行的启发式方法。它只适用于最短路径?我是说。。。我有5个顶点。我想找到从1到5的路径。对于1到5,最佳长度为
l
h(1)=l'
l'>l
——启发式成本高估了1到5的路径。例如,通过2的最短路径。现在大约有2到5条路径。从2到5的最佳路径是
d
<代码>h(2)=d'
d'
路径从2到5被启发式成本高估
h(2)
,对吗?或者对于
2
顶点规则是
d>l
h(2)
启发式成本大于
l
-从开始到目标的路径。希望你能理解我:)启发式成本
h(v)
会高估从
v
到目标的路径(长度
k
如果
h(v)=k'
k=k'
?@Sharikovladislav我不明白你的第一句评论。如果
h(v)=k'
且最短路径长度为
k
,且
k=k'
,则这不是过高估计。
0 2 6 3 1 9 5
9 0 2 4 6 4 1
1 3 0 5 2 9 4
3 1 5 0 1 7 8
0 6 2 1 0 10 14
2 1 6 3 7 0 5
1 4 3 2 1 3 0