python 实现A-Star算法

embedded/2024/10/18 8:34:19/

A-Star算法介绍

A-Star(A*)算法是一种广泛使用的启发式搜索算法,用于在图形平面或网络中找到从起点到终点的最短路径。它结合了Best-First Search算法和Dijkstra算法的特点,通过使用启发函数来指导搜索过程,从而提高搜索效率。

A算法的基本原理*

A*算法在搜索过程中维护两个关键值:

g(n):从起点到当前节点n的实际代价。
h(n):从当前节点n到目标节点的估计代价。

这两个值被用来计算f(n),即节点n从起点到目标点的估价函数,表示为: f ( n ) = g ( n ) + h ( n ) f(n) = g(n) + h(n) f(n)=g(n)+h(n)

A算法的工作流程*

A*算法的工作流程通常包括以下几个步骤:

初始化:将起点加入开放列表(Open List),并计算其f(n)值(初始为0)。
循环探索:只要开放列表不为空,就执行以下步骤:
从开放列表中选择f(n)值最小的节点作为当前节点。
如果当前节点是目标节点,则算法结束,找到了最短路径。
将当前节点从开放列表移动到关闭列表(Closed List),表示该节点已被探索过。
对当前节点的所有相邻节点进行探索,并更新它们的f(n)、g(n)和h(n)值。
如果相邻节点已在开放列表中,但新的路径更短,则更新其f(n)值和父节点信息。
重构路径:如果找到了目标节点,则从目标节点开始,通过父节点回溯到起点,形成最短路径。

启发式函数h(n)的选择

启发式函数h(n)的选择对A*算法的性能有很大影响。一个好的启发式函数可以显著提高搜索速度,因为它可以更快地引导算法向目标节点靠近。常用的启发式函数包括:

曼哈顿距离(Manhattan Distance):移动仅限于水平和垂直方向,启发式计算的是两点在各轴上的差值的绝对之和。
欧几里得距离(Euclidean Distance):启发式是两点之间的直线距离。
对角线距离(Diagonal Distance):移动可以是水平垂直以及对角线方向。

A算法的应用*

A算法在计算机科学和人工智能领域有广泛的应用,特别是在路径规划、游戏开发、机器人控制等领域。例如,在游戏AI中,A算法常用于角色寻路,确保角色能够智能地避开障碍物,找到到达目的地的最短路径。在自动驾驶领域,A*算法可以用于路径规划,帮助汽车在复杂的交通环境中找到最佳行驶路线。

总结

A*算法是一种高效的启发式搜索算法,它通过结合实际代价和估计代价来找到最短路径。其性能受到启发式函数选择的影响,因此在实际应用中需要根据具体问题选择合适的启发式函数。

python_40">A-Star算法python实现样例

下面是一个简单的实现A*算法python代码:

python">import heapq# 定义一个节点类
class Node:def __init__(self, position=None):self.position = position    # 节点的位置坐标self.g = 0                   # g值(从起始节点到当前节点的移动代价)self.h = 0                   # h值(从当前节点到目标节点的估计移动代价)self.f = 0                   # f值(g值加上h值)self.parent = None           # 父节点# 定义节点比较方法,用于堆排序def __lt__(self, other):return self.f < other.f# 定义A*算法函数
def astar(start, end, grid):# 获取地图的行数和列数rows = len(grid)cols = len(grid[0])# 定义开始节点和目标节点start_node = Node(start)end_node = Node(end)# 定义开放列表和关闭列表(使用堆排序)open_list = []closed_list = []# 将开始节点加入到开放列表中heapq.heappush(open_list, start_node)# 开始搜索while len(open_list) > 0:# 从开放列表中取出f值最小的节点current_node = heapq.heappop(open_list)# 如果当前节点是目标节点,搜索结束if current_node.position == end_node.position:path = []while current_node is not None:path.append(current_node.position)current_node = current_node.parentreturn path[::-1]    # 反转路径# 将当前节点加入到关闭列表中closed_list.append(current_node)# 获取当前节点的相邻节点neighbors = []for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:x = current_node.position[0] + dxy = current_node.position[1] + dyif x >= 0 and x < rows and y >= 0 and y < cols and grid[x][y] != 1:neighbor_node = Node((x, y))neighbors.append(neighbor_node)# 处理相邻节点for neighbor_node in neighbors:# 如果相邻节点已经在关闭列表中,跳过if neighbor_node in closed_list:continue# 计算相邻节点的g值和h值neighbor_node.g = current_node.g + 1   # 假设相邻节点的移动代价都是1neighbor_node.h = abs(neighbor_node.position[0] - end_node.position[0]) + abs(neighbor_node.position[1] - end_node.position[1])# 如果相邻节点已经在开放列表中,更新其g值和f值if neighbor_node in open_list:if neighbor_node.g < neighbor_node.g:neighbor_node.g = neighbor_node.gneighbor_node.f = neighbor_node.g + neighbor_node.hneighbor_node.parent = current_nodeelse:# 如果相邻节点不在开放列表中,将其加入到开放列表中neighbor_node.f = neighbor_node.g + neighbor_node.hneighbor_node.parent = current_nodeheapq.heappush(open_list, neighbor_node)return None   # 如果找不到路径,返回None

使用示例:

python"># 定义地图
grid = [[0, 0, 0, 0, 0],[0, 1, 1, 1, 0],[0, 0, 0, 0, 0],[0, 1, 1, 1, 0],[0, 0, 0, 0, 0]
]# 定义起始节点和目标节点
start = (0, 0)
end = (4, 4)# 调用A*算法函数
path = astar(start, end, grid)# 打印路径
if path is not None:print("Path:", path)
else:print("No path found.")

注意:上述代码仅为A*算法的简单实现,可能不适用于所有情况,可以根据实际需求进行修改和优化。


http://www.ppmy.cn/embedded/120532.html

相关文章

【Java】虚拟线程与Java 8普通线程池的对比

文章目录 IO密集型任务高并发Web服务器异步编程微服务架构大规模并行处理事件驱动的应用不适用的场景使用对比Java 8普通线程池虚拟线程 性能分析资源消耗并发能力性能测试 总结 在JDK 21之前&#xff0c;Java并发编程主要依赖于传统的线程池&#xff0c;如Java 8中的 Executo…

C++ STL(1)迭代器

文章目录 一、迭代器详解1、迭代器的定义与功能2、迭代器类型3、示例4、迭代器失效4.1、vector 迭代器失效分析4.2、list 迭代器失效分析4.3、set 与 map 迭代器失效分析 5、总结 前言&#xff1a; 在C标准模板库&#xff08;STL&#xff09;中&#xff0c;迭代器是一个核心概念…

XHTML学习

XHTML学习 1.XHTML 简介2.XHTML - 元素标准3.XHTML - 属性标准 1.XHTML 简介 XHTML是一个严格遵循 XML语法规则的 HTML 标准。它是 HTML4 的一种重构版本&#xff0c;结合了 HTML 的灵活性和 XML 的严格性&#xff0c;如今XHTML已经得到了所有主流浏览器的支持 与 HTML 相比最…

Metasploit渗透测试之服务端漏洞利用

简介 在之前的文章中&#xff0c;我们学习了目标的IP地址&#xff0c;端口&#xff0c;服务&#xff0c;操作系统等信息的收集。信息收集过程中最大的收获是服务器或系统的操作系统信息。这些信息对后续的渗透目标机器非常有用&#xff0c;因为我们可以快速查找系统上运行的服…

基于STM32的智能家居交互终端:使用FreeRTOS与MQTT协议的流程设计

一、项目概述 简要介绍项目的目标和用途 随着智能家居的普及&#xff0c;家庭智能交互终端成为提升居住体验的重要设备。本文将介绍一个基于STM32的家庭智能交互终端的设计与实现&#xff0c;该终端能够通过触摸屏、语音识别和传感器数据采集等功能&#xff0c;提供家庭环境监…

OpenHarmony(鸿蒙南向)——平台驱动指南【PWM】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 PWM即脉冲宽度调制&#xff08;Pulse Width Modul…

基于SpringBoot+Vue的留学信息推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

centos72009源码编译R语言

./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -Psparkr -Phive -Phive-thriftserver -Pmesos -Pyarn -Dhadoop.version3.4.0 -Pkubernetes spark3.5.3 源码版本 ./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -P…