Dijkstra算法和A*算法的问题

woaiprogram 2010-05-17 05:40:16
如果A*的启发式函数采用欧拉距离,那么得到的最短路径和Dijkstra算法得到的路径一模一样,只是运行时间要快一点点;

如果采用曼哈顿距离,那么路径有可能不同,请问这是什么问题呢?

是不是我的算法部分写错了?我写的A*算法里面的启发式距离置为0就变为Dijkstra算法了

请您赐教!谢谢!
...全文
813 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fairywell 2010-05-22
  • 打赏
  • 举报
回复
mark
woaiprogram 2010-05-21
  • 打赏
  • 举报
回复
看到各位的回复,很感激啊!

我现在基本是做了Dijkstra算法和A*算法实现了,在A*里面的启发值得到肯定比实际的路径要小很多,所以,符合那个启发函数要满足的条件。然而,选取不同的启发函数(3楼),得到的路径是不同的,这表明不同的启发函数有不同的结果!

我用Dijkstra算法得到的路径一定是最短的。而A*只能是 可能是最优的,要看启发函数与实际情况的符合情况。

不过A*算法只能比Dijkstra快那么3-5ms左右,为什么不能有更大的效率提升?我还是没有找到答案!
sosidami 2010-05-21
  • 打赏
  • 举报
回复
A * 函数的表现取决于你的启发函数的设置,你可以把他变成宽搜也可以把它变成Dijkstra
jakiejiajia 2010-05-19
  • 打赏
  • 举报
回复
看到大家讨论A* 很激动,友情up一下
guijieming2000 2010-05-19
  • 打赏
  • 举报
回复
都是求最优解,Dijkstra可以得到理论上的最优,A*只是使用了启发函数来缩短计算面积而已,付出的代价就是可能得出非最优解。所以楼主的问题:路径可能不同,是什么问题?
问题就是付出的代价不一样了。
  • 打赏
  • 举报
回复
A*不一定最优,本来就是取决于你的评估函数的,所以对于两种距离得到的结果不一样也不觉得奇怪!
NaWait 2010-05-19
  • 打赏
  • 举报
回复
樓樓上 Dijkstra和A* 的到的結果是會一樣的
NaWait 2010-05-19
  • 打赏
  • 举报
回复
可以走斜的話 启发式函数就不能用曼哈顿距离
因為启发式函数只能低估 不能高估
qq120848369 2010-05-18
  • 打赏
  • 举报
回复
帝国时代....生动活泼的例子.
超级大笨狼 2010-05-18
  • 打赏
  • 举报
回复
帝国时代的AI人物不会找到最短路径
他是先按照目标方向前进
如果遇到障碍,在视野范围内,他可以找到最接近目标的点,如果有敌人或者房子,他会试图去砍,否则他会开始砍栅栏/墙。

如果是人指挥的对象,他会在障碍前停下来,象栅栏,墙之类的东西不会主动去砍。
除非你指挥他。
超级大笨狼 2010-05-18
  • 打赏
  • 举报
回复
迪杰斯特拉适合所有点
A*算法不能同时求所有点,要有目标。

A*算法中每次找f()+h()值最小的点进行扩展,可以证明这样的算法找到目标扩展的节点总数少于迪杰斯特拉
极限情况下,如果h()函数设计的很差,每次都为0,你的算法就每次都找f()值最小的点进行扩展,就退化为Dijkstra

你这个例子可能不能说明什么,如果你在一个巨大的围棋棋盘上,随便设置些障碍,再对比两种会看出差异来。
woaiprogram 2010-05-18
  • 打赏
  • 举报
回复
我的图里面没有障碍物,边的权重只有边的长度一项,没有其他

我的图是一个长沙市的电子地图,点就是道路的交叉点,线就是道路,所以,线的权重有时是弧线的长度

这是不是对A*的那个启发函数有些影响呢?

不像游戏地图中的那种网格地图
woaiprogram 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 superdullwolf 的回复:]
二者都是找到了就退出,而且时刻保持路径最短。

A*是按照启发函数,向着目标搜
Dijkstra是广搜

一般情况A*要快一些,取决于障碍物。
[/Quote]

是啊,如果点比较多,比如9000个,那么A*总是被dijkstra要快3ms左右,也快不了多少?不知是什么原因
much0726 2010-05-18
  • 打赏
  • 举报
回复
用C实现的DIJKSTRA最短路径算法
http://blog.csdn.net/much0726/archive/2009/05/26/4215846.aspx
超级大笨狼 2010-05-18
  • 打赏
  • 举报
回复
二者都是找到了就退出,而且时刻保持路径最短。

A*是按照启发函数,向着目标搜
Dijkstra是广搜

一般情况A*要快一些,取决于障碍物。
qiuzhenguang 2010-05-18
  • 打赏
  • 举报
回复
关注一下,不明白A*与Dijkstra有啥区别。
qq120848369 2010-05-17
  • 打赏
  • 举报
回复
好像叉乘,是在计算点在弧内么.
woaiprogram 2010-05-17
  • 打赏
  • 举报
回复
欧拉距离就是2点之间的直线距离
边的权值,就是边的长度,边不都是直线,有的是弧线

以下是我选择的启发函数

private static double pow2_estimate(CityPoint p1, CityPoint p2)
{
return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
}
private static double sqrt_estimate(CityPoint p1,CityPoint p2)
{
return Math.Sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
private static double manhattan_estimate(CityPoint p1, CityPoint p2)
{
return Math.Abs(p1.x - p2.x) + Math.Abs(p1.y - p2.y);
}
private static double max_estimate(CityPoint p1, CityPoint p2)
{
return Math.Max(Math.Abs(p1.x - p2.x), Math.Abs(p1.y - p2.y));
}

leonardWang 2010-05-17
  • 打赏
  • 举报
回复
欧拉距离是什么...
选什么距离应该和边的权值如何定义的有关吧 比如都是欧拉距离 都是曼哈顿距离
diablox0147 2010-05-17
  • 打赏
  • 举报
回复
Dijkstra是已固定的方法来寻找最短路径

A*算法是根据你的估值函数来选择路径的,对不同的图可能会走不同的道路。
当然有可能会出现和Dijkstra算法不同的地方了

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧