A*算法是一种在图中寻找从初始节点到目标节点最短路径的启发式搜索算法,它结合了Dijkstra算法的确保性(保证找到一条最短路径)和贪心算法的高效性(快速找到目标),A* 算法通过评估函数 f ( n ) = g ( n ) + h ( n ) 来工作,g ( n ) 是从起始点到任何顶点 n 的实际成本,而 h ( n ) 是从顶点 n 到目标的估计最低成本,通常用启发式函数来计算,这个函数需要事先设计来反映实际的地形或环境特征,理想情况下, h ( n ) 应该不会高估实际的成本,这种情况下,A* 算法保证找到一条最低成本路径,算法的性能和准确性高度依赖于启发式函数的选择。
A*算法的特性
1、最优性:当启发式函数 h ( n ) 是可采纳的(即不会高估从任一节点到目标的成本时),A* 算法保证找到最短路径。
2、完备性:只要有解存在,A* 算法总能找到解,前提是节点扩展没有限制且启发式函数不返回无穷大值。
3、高效率:通过启发式函数有效指导搜索方向,A* 算法通常比其他简单的搜索算法如广度优先或深度优先搜索更快地找到最短路径。
4、灵活性:启发式函数的选择可以根据具体的应用场景灵活调整,影响算法的效率和行为。
5、普适性:适用于任何能够用图表示的路径搜索问题,从机器人路径规划到游戏设计中的AI挑战。
6、适应性:能够根据实时反馈调整启发式评估,适应于动态变化的环境中。
A*算法的基本原理及公式推导
A*算法使用三个主要函数: g ( n )、h ( n ) 和 f ( n ) 来评估路径的优劣。
1、g(n):从起始点到任何节点 n 的实际路径成本。
2、h(n):从节点 n 到目标的预估成本,这是一个启发式估计,通常是从 n 到目标的直线距离。
3、f(n):节点 n 的总成本估算,计算为 f ( n ) = g ( n ) + h ( n )。
这些评价指标共同帮助算法决定在图中的哪个方向上继续搜索,以期达到最有效的路径搜索。
A*算法的实现步骤与代码实现
以下是A*算法的基本实现步骤:
1、初始化
创建起始节点和目标节点,初始化 g、h 和 f 值。
创建开放列表(使用优先队列)和封闭列表,将起始节点加入开放列表。
2、节点处理
从开放列表中取出 f 值最小的节点作为当前节点。
检查当前节点是否为目标节点,如果是,回溯路径并返回。
3、邻接节点探索
计算当前节点的四个方向的邻接节点(上、下、左、右)。
对于每个邻接节点,检查是否为有效节点(即在网格范围内且不是障碍物)。
4、更新邻接节点
对于每个有效的邻接节点,如果它不在封闭列表中,则计算它的 g、h 和 f 值。
使用 add_to_open 函数判断是否将邻接节点添加到开放列表。
5、移动到封闭列表
将当前节点移入封闭列表。
如果开放列表为空,说明没有找到路径,返回失败。
6、重复过程
重复步骤 2-5,直到找到目标节点或开放列表为空。
以下是Python实现A*算法的示例代码:
import numpy as np import json class Map: def __init__(self): # 设置起点,终点所在的行列数,左上角为0,0 start_row = 17 start_col = 2 end_row = 9 end_col = 16 with open('map.txt', 'r') as f: my_map = json.loads(f.read()) my_map = np.array(my_map) self.map = np.where(my_map == 0, 1, np.where(my_map == 1, 0, my_map)) self.map[start_row, start_col] = -100 # 起点 self.map[end_row, end_col] = 100 # 终点 def get_start_point(self): indices = np.where(self.map == -100) return indices[0][0], indices[1][0] def get_end_point(self): indices = np.where(self.map == 100) return indices[0][0], indices[1][0] def check_grid(self, point): return self.map[point.x, point.y] class Point: def __init__(self, x_, y_): self.x = x_ self.y = y_ self.father = None self.G = 0 # 起点到当前节点所花费的消耗 self.H = 0 # 到终点的预估消耗 self.F = 0 def get_x_y(self): return self.x, self.y def set_GHF(self, G, H, F): self.H = H self.G = G self.F = F class Astar: def __init__(self): self.openlist = [] self.closelist = [] self.map = Map() self.start_x, self.start_y = self.map.get_start_point() self.end_x, self.end_y = self.map.get_end_point() self.start_node = Point(self.start_x, self.start_y) self.end_node = Point(self.end_x, self.end_y) self.astar() def astar(self): self.openlist.append(self.start_node) while len(self.openlist) > 0: current_node = min(self.openlist, key=lambda o: o.F) self.openlist.remove(current_node) self.closelist.append(current_node) if current_node.x == self.end_x and current_node.y == self.end_y: path = [] while current_node: path.append((current_node.x, current_node.y)) current_node = current_node.father print("Path found:", path) return path for x in [-1, 0, 1]: for y in [-1, 0, 1]: if abs(x) + abs(y) != 0: # 确保不是自己移动一步 new_pos = (current_node.x + x, current_node.y + y) if new_pos[0] < 0 or new_pos[0] >= len(self.map) or new_pos[1] < 0 or new_pos[1] >= len(self.map[0]): continue if self.map.check_grid(Point(*new_pos)): continue temp_node = Point(new_pos[0], new_pos[1]) temp_node.set_GHF(current_node.G + 1, abs(new_pos[0] self.end_x) + abs(new_pos[1] self.end_y), temp_node.G + abs(new_pos[0] self.end_x) + abs(new_pos[1] self.end_y)) temp_node.father = current_node if temp_node not in self.openlist: self.openlist.append(temp_node) self.openlist.sort(key=lambda o: o.F)
以上就是关于“astar算法 深度学习”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/650811.html