Python A*效率vs贪婪第一

Python A*效率vs贪婪第一,python,artificial-intelligence,path-finding,heuristics,Python,Artificial Intelligence,Path Finding,Heuristics,鉴于以下情况: ||||||||||||||||||||||||||||||||||||| | | | | | | | | | ||||||| | ||| | ||| ||| ||||||| | | | | | | | | | | ||||| ||||| ||| | | | ||| ||||| | ||| | | | | | | | | | | | | | | | ||| | | | ||

鉴于以下情况:

|||||||||||||||||||||||||||||||||||||
|       | | |           |   |     | |
| ||||||| | ||| | ||| ||| ||||||| | |
|       |       | |     |     | |   |
||||| ||||| ||| | | | ||| ||||| | |||
|   | | | |   | | | |   | |   | |   |
| ||| | | | ||| ||||| ||| | ||| ||| |
|       |     |   |   |     | | |   |
||| ||||||||| ||||||| ||| ||| | | | |
|             |       | |   |     | |
| | ||||| | ||| | | ||| | ||| ||| | |
| | |     | | | | |     |   | | | | |
| | | ||||||| | ||||||||| ||| | ||| |
| | | |     |   |     |     |   |   |
||| ||| | ||||| ||||| ||| ||| ||||| |
|     | | |     | |     | |   | | | |
| | | | | ||| ||| ||| ||| | | | | | |
| | | | |                 | | |     |
||| ||||||| | | ||||| ||| | ||| |||||
|       | | | |     |   |     | |   |
||||| | | ||||||||| ||||||||||| | |||
|   | |           | |     |   | |   |
| ||| ||||| ||||||||| ||||| | | ||| |
| |   |      |        |     |       |
| | | ||||| ||| | | | | |||||||||||||
| | |   |     | | | |       |   | | |
| | ||| ||| | | | ||||||||| ||| | | |
| |   | |   | | |   | |   | | |     |
| ||| ||| ||||| ||| | | ||||| | |||||
|       |   |     | |     |   | |   |
||| | ||||| ||||| ||| ||| | ||| | |||
| | | | | | | |     | |   | |   | | |
| | ||| | | | | ||||||||| | | | | | |
|   |   |   |                 |     |
| | | | ||| ||| ||||||| ||| ||| ||| |
|+| | |       |   |       |   | |  P|
|||||||||||||||||||||||||||||||||||||
我从两种不同的算法中得到了两个结果(我希望其中有A*和贪婪优先的正确实现):

这是正常的行为吗?在给定单一路径的情况下,A*是否总是最优的,并且比其他算法更有效?我知道这取决于问题设置,但这也是通过更大的测试复制的:

mega maze - a* -                    expanded: 8964 (837)
mega maze - greedy (mh heur) -      expanded: 5455 (837)
我认为A*在这里应该比贪婪先表现好,这是错的吗? 下面是我的启发法。。。也许我的启发值设置错了

#greedy
self.heuristic = abs(goalNodeXY[0] - self.xy[0]) + abs(goalNodeXY[1] - self.xy[1])

#A* --- costFromStart == path length from starting point
self.heuristic = math.hypot(self.xy[1]-goalNodeXY[1],self.xy[0]-goalNodeXY[0]) + costFromStart

对于A*来说,一个好的启发式方法是最接近剩余距离的方法(如果您需要A*始终找到最佳路径,也永远不会超过它)。由于迷宫中的距离定义为穿过的单元数,因此贪婪的启发式近似于欧几里德距离(hypot),因为它完美地预测了道路剩余部分没有障碍物的情况,并且如果有障碍物,它总是更接近真实距离


因此,我们绝对希望您的第一种方法优于第二种方法

对于A*来说,一个好的启发式方法是最接近剩余距离的方法(如果您需要A*始终找到最佳路径,也永远不会超过它)。由于迷宫中的距离定义为穿过的单元数,因此贪婪的启发式近似于欧几里德距离(hypot),因为它完美地预测了道路剩余部分没有障碍物的情况,并且如果有障碍物,它总是更接近真实距离

因此,我们绝对希望您的第一种方法优于第二种方法

在给定单一路径的情况下,A*是否总是最优的,并且比其他算法更有效

不,A*总是找到一条最优路径,但它并不总是比其他算法更快。贪婪的搜索有时做得更好是完全正常的

此外,你的A*启发式算法不如你在贪婪算法中使用的好。在贪婪算法中使用曼哈顿距离,在A*搜索中使用欧几里德距离;曼哈顿距离始终是对剩余路径长度的更好估计,并且永远不会过高估计,因此在a*搜索中使用曼哈顿距离也会更好

在给定单一路径的情况下,A*是否总是最优的,并且比其他算法更有效

不,A*总是找到一条最优路径,但它并不总是比其他算法更快。贪婪的搜索有时做得更好是完全正常的


此外,你的A*启发式算法不如你在贪婪算法中使用的好。在贪婪算法中使用曼哈顿距离,在A*搜索中使用欧几里德距离;曼哈顿距离始终是对剩余路径长度的更好估计,并且永远不会过高估计,因此在a*搜索中也最好使用曼哈顿距离。

这些数字是什么单位?秒?MB内存?对不起。。它只是节点/路径长度。1跳=1。我将在问题中澄清这些数字是什么单位?秒?MB内存?对不起。。它只是节点/路径长度。1跳=1。我将在问题中澄清,你能详细说明这一点吗
Manhattan距离始终是剩余路径长度的更好估计值[vs Euclidean]
——我刚刚将a*的启发式更改为
MHD+currentCost
,但与
Euclidean+currentCost
相比,它在搜索过程中增加了近200个节点?你的观点是一般的吗?@MrDuk:剩余的路径长度至少是从当前位置到目标的曼哈顿距离,曼哈顿距离总是至少是欧几里德距离。我没想到你会得到这样的结果,但这肯定是可能的;使用更精确的启发式通常会减少扩展的节点数,但并不总是这样。你能详细说明这一点吗
Manhattan距离始终是剩余路径长度的更好估计值[vs Euclidean]
——我刚刚将a*的启发式更改为
MHD+currentCost
,但与
Euclidean+currentCost
相比,它在搜索过程中增加了近200个节点?你的观点是一般的吗?@MrDuk:剩余的路径长度至少是从当前位置到目标的曼哈顿距离,曼哈顿距离总是至少是欧几里德距离。我没想到你会得到这样的结果,但这肯定是可能的;使用更精确的启发式通常会减少扩展的节点数,但并不总是这样。
#greedy
self.heuristic = abs(goalNodeXY[0] - self.xy[0]) + abs(goalNodeXY[1] - self.xy[1])

#A* --- costFromStart == path length from starting point
self.heuristic = math.hypot(self.xy[1]-goalNodeXY[1],self.xy[0]-goalNodeXY[0]) + costFromStart