-
A*算法介绍 A*算法是一种高效的路径搜索算法,广泛应用于人工智能、机器人技术、游戏开发等领域。它由Peter Hart、Nils Nilsson和Bertram Raphael于1968年首次提出。A算法结合了Dijkstra算法的系统性搜索和启发式搜索的优点,通过使用启发式函数来减少搜索空间,同时保证找到最短路径。A*算法的核心概念 A*算法是一种最佳优先搜索算法,它通过以下三个关键函数来评估路径:g(n):从起点到当前节点的实际代价。h(n):从当前节点到目标节点的启发式估算代价。f(n) = g(n) + h(n):通过当前节点到达目标的总估算代价。 在每次迭代中,A*算法会选择具有最低f(n)值的节点进行扩展,并更新其邻居节点的代价。如果邻居节点的试探性代价低于之前记录的值,则会更新该节点的代价,并将其添加到开放集合中。这一过程会持续进行,直到找到目标节点或确定路径不存在。A*算法的特点最优性:当使用可接受的启发式函数时,A*算法能够找到最短路径。效率:启发式函数的引导使得A*算法比Dijkstra算法探索更少的节点。灵活性:启发式函数可以根据不同场景进行定制。完整性:如果存在解决方案,A*算法将找到它。A*算法示例:迷宫以下是使用A*算法在一个示例迷宫中寻找路径的详细步骤说明:假设有以下10x10的迷宫:S 0 0 0 0 0 0 0 0 00 1 1 0 1 1 0 1 1 00 1 0 0 0 0 0 0 1 00 1 1 1 1 1 0 1 1 00 0 0 0 1 0 0 0 0 00 1 1 0 1 1 1 1 1 00 1 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 E其中,S 表示起点 (0,0),E 表示终点 (9,9),0 表示可以通行的路径,1 表示障碍物.执行步骤第1步:初始化起始节点:(0,0),初始化其 g(n)=0,h(n) 由直线距离计算,f(n)=0+13.416=13.416。开放列表:未被选择的节点。封闭列表:已被选择的节点。当前节点:起始节点。第2步:扩展当前节点(起始节点)邻节点:(0,1), (1,0)。检查范围:确保邻节点在迷宫范围内。障碍物检查:(0,1) 是 0,(1,0) 是 0。计算邻节点g(n):(0,1):起始节点的 g(n)=0+1=1。(1,0):起始节点的 g(n)=0+1=1。计算邻节点h(n):(0,1) 的 h(n)=sqrt((9-0)^2 + (9-1)^2)= sqrt(81+64)=11.401。(1,0) 的 h(n)=sqrt((9-1)^2 + (9-0)^2)=sqrt(64+81)=11.401。计算邻节点f(n):(0,1) 的 f(n)=1+11.401=12.401。(1,0) 的 f(n)=1+11.401=12.401。在开放列表中添加邻节点:(0,1) 和 (1,0) 添加到开放列表。第3步:选择下一个节点(最低 f(n)) 开放列表中有 (0,1) 和 (1,0),它们的 f(n) 都是 12.401。可以选择其中任意一个: 选择 (0,1) 作为当前节点。第4步:处理当前节点 (0,1)邻节点:(0,0)(起点,已在封闭列表),(0,2),(1,1)。障碍物检查:(0,2) 是 0。(1,1) 是 1(障碍物)。生成有效邻节点:(0,2)。计算(0,2) 的 g(n):来自 (0,1),g(n)=1+1=2。计算(0,2) 的 h(n):sqrt((9-0)^2 + (9-2)^2)= sqrt(81+49)=10.630。计算 (0,2) 的 f(n):2+10.630=12.630。将 (0,2) 添加到开放列表:开放列表现在包含 (1,0), (0,2)。第5步:继续探索 重复步骤,选择开放列表中 f(n) 最低的节点,继续扩展并更新邻节点的 g(h,f) 值,直到到达目标节点 (9,9)。重点说明扩展当前节点:每次从开放列表中取出 f(n) 最低的节点,生成其邻节点。更新邻节点信息:如果邻节点未被访问过,计算其 g(h,f) 并加入开放列表。如果邻节点已在开放列表中,需要比较新的 g(n) 是否更小。如果更小,更新父节点和 g(n)。终止条件:当前节点是目标节点,回溯路径。开放列表为空,没有路径。最终结果 经过反复的节点扩展和评估,A* 算法最终找到从起点 (0,0) 到终点 (9,9) 的最短路径。路径将避免迷宫中的所有障碍物,确保每一步都是经过成本最低的选择。A*算法与其他相关算法的比较算法 与A*的关系 关键差异 优缺点Dijkstra算法 A*是Dijkstra算法的扩展 A*使用f(n)=g(n)+h(n),Dijkstra仅使用g(n) A*在有启发式函数时性能更好,Dijkstra无需启发式函数Bellman-Ford算法 基于边的松弛 Bellman-Ford支持负边权重,A*通常更快 Bellman-Ford适用于有负权重的图,A*需要启发式函数Floyd-Warshall算法 解决所有点对最短路径问题 Floyd-Warshall使用动态规划,A*是增量搜索 Floyd-Warshall适合密集图,A*适合实时路径搜索[Python] A*算法实现 项目代码我已经放入下面链接里面:🔥A*算法实现若是下面代码复现困难或者有问题,也欢迎评论区留言。"""《A*算法实现》 时间:2025.02.27 环境:迷宫 作者:不去幼儿园"""import heapqimport matplotlib.pyplot as pltimport numpy as np class Node: """节点类表示搜索树中的每一个点。""" def __init__(self, parent=None, position=None): self.parent = parent # 该节点的父节点 self.position = position # 节点在迷宫中的坐标位置 self.g = 0 # G值:从起点到当前节点的成本 self.h = 0 # H值:当前节点到目标点的估计成本 self.f = 0 # F值:G值与H值的和,即节点的总评估成本 # 比较两个节点位置是否相同 def __eq__(self, other): return self.position == other.position # 定义小于操作,以便在优先队列中进行比较 def __lt__(self, other): return self.f < other.f def astar(maze, start, end): """A*算法实现,用于在迷宫中找到从起点到终点的最短路径。""" start_node = Node(None, start) # 创建起始节点 end_node = Node(None, end) # 创建终点节点 open_list = [] # 开放列表用于存储待访问的节点 closed_list = [] # 封闭列表用于存储已访问的节点 heapq.heappush(open_list, (start_node.f, start_node)) # 将起始节点添加到开放列表 while open_list: current_node = heapq.heappop(open_list)[1] # 弹出并返回开放列表中 f 值最小的节点 closed_list.append(current_node) # 将当前节点添加到封闭列表 if current_node == end_node: # 如果当前节点是目标节点,则回溯路径 path = [] while current_node: path.append(current_node.position) current_node = current_node.parent return path[::-1] # 返回反向路径,即从起点到终点的路径 (x, y) = current_node.position neighbors = [(x-1, y), (x+1, y), (x, y-1), (x, y+1)] # 获取当前节点周围的相邻节点 for next in neighbors: if 0 <= next[0] < maze.shape[0] and 0 <= next[1] < maze.shape[1]: # 确保相邻节点在迷宫范围内 if maze[next[0], next[1]] == 1: # 如果相邻节点是障碍物,跳过 continue neighbor = Node(current_node, next) # 创建相邻节点 if neighbor in closed_list: # 如果相邻节点已在封闭列表中,跳过不处理 continue neighbor.g = current_node.g + 1 # 计算相邻节点的 G 值 neighbor.h = ((end_node.position[0] - next[0]) ** 2) + ((end_node.position[1] - next[1]) ** 2) # 计算 H 值 neighbor.f = neighbor.g + neighbor.h # 计算 F 值 if add_to_open(open_list, neighbor): # 如果相邻节点的新 F 值较小,则将其添加到开放列表 heapq.heappush(open_list, (neighbor.f, neighbor)) return None # 如果没有找到路径,返回 None def add_to_open(open_list, neighbor): """检查并添加节点到开放列表。""" for node in open_list: if neighbor == node[1] and neighbor.g > node[1].g: return False return True # 如果不存在,则返回 True 以便添加该节点到开放列表 def visualize_path(maze, path, start, end): """将找到的路径可视化在迷宫上。""" maze_copy = np.array(maze) for step in path: maze_copy[step] = 0.5 # 标记路径上的点 plt.figure(figsize=(10, 10)) plt.imshow(maze_copy, cmap='hot', interpolation='nearest') path_x = [p[1] for p in path] # 列坐标 path_y = [p[0] for p in path] # 行坐标 plt.plot(path_x, path_y, color='orange', linewidth=2) start_x, start_y = start[1], start[0] end_x, end_y = end[1], end[0] plt.scatter([start_x], [start_y], color='green', s=100, label='Start', zorder=5) # 起点为绿色圆点 plt.scatter([end_x], [end_y], color='red', s=100, label='End', zorder=5) # 终点为红色圆点 plt.legend() plt.show() # 设定迷宫的尺寸maze_size = 100maze = np.zeros((maze_size, maze_size))obstacle_blocks = [ (10, 10, 20, 20), # (y起始, x起始, 高度, 宽度) (30, 40, 20, 30), (60, 20, 15, 10), (80, 50, 10, 45),]for y_start, x_start, height, width in obstacle_blocks: maze[y_start:y_start+height, x_start:x_start+width] = 1start = (0, 0)end = (92, 93)maze[start] = 0maze[end] = 0path = astar(maze, start, end)if path: print("路径已找到:", path) visualize_path(maze, path, start, end)else: print("没有找到路径。")[Results] 运行结果[Notice] 注意事项# 环境配置Python 3.11.5torch 2.1.0torchvision 0.16.0gym 0.26.2 由于博文主要为了介绍相关算法的原理和应用的方法,缺乏对于实际效果的关注,算法可能在上述环境中的效果不佳或者无法运行,一是算法不适配上述环境,二是算法未调参和优化,三是没有呈现完整的代码,四是等等。上述代码用于了解和学习算法足够了,但若是想直接将上面代码应用于实际项目中,还需要进行修改。适用场景A*算法最适合以下场景:单源单目标路径搜索。可以提供领域特定的启发式函数。需要最优解。有足够的内存来维护开放/关闭集合。主要应用场景迷宫寻路:在游戏开发中,A*算法可以用来为游戏角色找到从起点到终点的最短路径,例如在迷宫类游戏中,角色需要绕过障碍物尽快到达目标。机器人路径规划:在机器人领域,A*算法可用于规划机器人在复杂环境中的移动路径,帮助其避开障碍物并找到到达目标位置的最佳路线。地图导航:在 GPS 导航系统或地图应用中,A*算法可以计算两点之间的最短路径,考虑道路长度、交通状况等多种因素,为用户提供最优的行驶路线建议。实现建议使用优先队列(如二叉堆或斐波那契堆)快速选择节点。根据图的大小选择合适的数据结构。设计并验证有效的启发式函数。算法优点寻找最短路径:无论是二维平面还是三维空间,A*算法都能够有效地在复杂的环境图中找到从起点到终点的最短路径,尤其是在具有障碍物和多重路径选择的情况下。优化效率:相比传统的广度优先搜索和深度优先搜索,A*算法通过结合启发式估计和实际路径成本,能够更高效地探索可能的路径,减少不必要的计算,大大提升了路径寻找的效率。适应复杂环境:A*算法能够灵活地处理各种环境变化,如新增障碍物、改变目标位置等,只需重新计算路径即可,无需对整个地图进行重新规划。实现效果准确性:A*算法能够精确地找到最优路径,确保路径的总成本(如距离、时间等)最小,对于大多数场景来说,其结果都是全局最优的。实时性:在处理复杂地图时,A*算法能够在较短时间内完成路径规划,满足实时性要求,特别是在一些动态环境(如即时战略游戏或动态交通导航)中。可视化:通过可视化工具,可以清晰地看到 A*算法的搜索过程,路径是如何被逐步探索和确定的,这对于调试和理解算法的工作原理非常有帮助。———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/qq_51399582/article/details/145691955
-
Manus 比起传统的AI Agent厉害在哪里?为什么能继deepseek之后引起这么大轰动?
-
最近deepseek大火,并且随着训练的成本大幅度的降低,未来下一个爆火的模型会有什么样的提升呢 ,训练成本会不会再次降低,犹如王谢堂前燕,飞入寻常百姓家。
-
开年就有王炸,春晚是机器人扭秧歌,后有deepseek深度求索,以一敌百让漂亮国措手不及,最后杭州某位ai创始人,用眼睛放演讲稿让科技领先,AI时代的到来究竟带来了哪些的机遇?又有哪些改变?
-
如何通过一个js文件把华为数字人集成到网站里?
-
1、管理通信机房环境温度,控制空调运行2、管理通信机房的人员进场情况,控制门禁3、管理通信机房的设备运行情况,记录设备启用时间、超期服役下线提醒、维修记录、对于指派负责人处理4、管理通信机房的ODF签芯使用情况,记录业务名称及连接关系5、管理通信机房的光缆接入情况,显示纤芯使用情况、质量情况6、管理通信机房安全,监控环境情况,防火、防水
-
【华为云】尊敬的开发者朋友:MetaStudio数字内容生产线提供数字人视频制作、视频直播、智能交互、企业代言等多种服务能力,使能千行百业降本增效。诚邀您参与产品满意度调研,约1 分钟。提交问卷将有机会获得华为手表GT5。https://survey.huaweicloud.com/survey/#/qtn?id=f2a31bbd4ea6458998f5af0a2a8ed394 ,期待您的卓识,为数字人产品点亮新方向,共铸非凡!
-
数字人将会带来什么样的产业变革?!12月11日16:30,华为云DTT直播间为你揭秘!学习干货之余,更有华为无线耳机等好礼等你! 扫码加入数字人群聊,与众多开发者碰撞更多数字人新玩法!数字人立即使用:MetaStudio服务 (huaweicloud.com)
-
希望执行器能添加一个本地录制的功能,在比较复杂的流程中有,录屏可以更方便的去排查问题
-
号外号外~数字人体验官开始有奖招募啦!!!有数字人应用场景的小伙伴千万不要错过成功受邀参与体验的用户可获得京东卡激励哦名额有限,欢迎大家积极参与~【招募激励】受邀参与体验的用户,可获得100元京东卡/1小时【招募时间】24年11月5日-25日【招募人数】1-首期活动计划邀请8人2-我们将持续举办多期活动,所有报名信息均会保留,会不定期发出邀请【招募人群】1-有虚拟数字人应用场景的企业用户2-所在行业不限3-企业规模不限【虚拟数字人常见应用场景】如数字人播报、知识科普、上课/培训、直播带货、企业宣传、数字客服等请您花【1~2分钟填写】下方报名问卷,也欢迎转发给您其他有数字人应用需求的朋友更多活动信息可识别下方二维码查阅,感谢大家的支持
-
项目是deveco Studio创建的,求教我该如何集成此sdk呢
-
制作AI换脸,需要哪些工具和技术
-
华为云开发者日·南京站来啦!参加“基于MetaStudio数字内容生产线四步制作数字人视频”体验项目提出你的建议或使用体验有机会获得开发者盲盒礼包惊喜不容错过,快叫上小伙伴一起来参加吧~【体验项目】基于MetaStudio数字内容生产线四步制作数字人视频【活动时间】2024年10月25日-10月31日【参与方式】直接在此活动帖下方回帖提建议/提建议即可比如对产品功能的改进建议、对活动流程的感想、对现场活动的感悟等等PS:不要少于30字哦~【获奖规则】奖项设置有效回复楼层评选条件获奖名额激励礼品优质建议奖20对产品功能有改进价值的建议1名开发者盲盒礼品价值50-100元积极反馈奖20优质建议奖轮空的情况下进行抽取每满20层抽取1名开发者盲盒礼品价值50元【活动规则】1、本帖的回帖建议不少于30字,仅限于对“基于MetaStudio数字内容生产线四步制作数字人视频”体验项目,其他项目建议不参与此次活动,否则将视为无效内容。2、本次活动将根据实际参与情况发放奖励,包括但不限于用户百分之百中奖或奖项轮空的情况;以上奖品均为实物奖品,具体发放视出库情况而定;3、活动预计于结束后七天内完成奖项公示,并于结束后15个工作日内完成邮寄。【温馨提示】1、请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效)。如一个实名认证对应多个账号,只有一个账号可领取奖励,若同一账号填写多个不同收件人或不同账号填写同一收件人,均不予发放奖励。2、所有获得奖品的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励。
-
华为云开发者日·武汉站来啦!参加“基于MetaStudio数字内容生产线四步制作数字人视频”体验项目提出你的建议或使用体验有机会获得开发者盲盒礼包惊喜不容错过,快叫上小伙伴一起来参加吧~【体验项目】基于MetaStudio数字内容生产线四步制作数字人视频【活动时间】2024年10月16日-10月20日【参与方式】直接在此活动帖下方回帖提建议/提建议即可比如对产品功能的改进建议、对活动流程的感想、对现场活动的感悟等等PS:不要少于30字哦~【获奖规则】奖项设置有效回复楼层评选条件获奖名额激励礼品优质建议奖20对产品功能有改进价值的建议1名开发者盲盒礼品价值50-100元积极反馈奖20优质建议奖轮空的情况下进行抽取每满20层抽取1名开发者盲盒礼品价值50元【活动规则】1、本帖的回帖建议不少于30字,仅限于对“基于MetaStudio数字内容生产线四步制作数字人视频”体验项目,其他项目建议不参与此次活动,否则将视为无效内容。2、本次活动将根据实际参与情况发放奖励,包括但不限于用户百分之百中奖或奖项轮空的情况;以上奖品均为实物奖品,具体发放视出库情况而定;3、活动预计于结束后七天内完成奖项公示,并于结束后15个工作日内完成邮寄。【温馨提示】1、请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效)。如一个实名认证对应多个账号,只有一个账号可领取奖励,若同一账号填写多个不同收件人或不同账号填写同一收件人,均不予发放奖励。2、所有获得奖品的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励。
-
上滑加载中