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