当前位置: 首页 > news >正文

A-star算法

算法简介

A*(A-star)算法是一种用于图形搜索和路径规划的启发式搜索算法,它结合了最佳优先搜索(Best-First Search)和Dijkstra算法的思想,能够有效地寻找从起点到目标点的最短路径。A*算法广泛应用于导航、游戏AI、机器人路径规划等领域。

代码说明

Node类:表示搜索过程中的一个节点,包含位置、从起点到当前节点的代价 (g)、从当前节点到目标节点的启发式代价 (h),以及父节点用于回溯路径。
A算法:astar函数实现了A算法的核心逻辑。通过开放列表优先队列不断从代价最小的节点扩展,直到找到目标节点。
启发式函数:heuristic使用曼哈顿距离作为启发式代价,适用于网格布局。
邻居节点:get_neighbors返回当前节点的四个邻居(上下左右)。
在这里插入图片描述

代码

import heapqclass Node:def __init__(self, position, g=0, h=0):self.position = position  # 坐标 (x, y)self.g = g  # 从起点到当前节点的代价self.h = h  # 从当前节点到目标节点的预估代价(启发式估计)self.f = g + h  # 总代价self.parent = None  # 记录父节点def __lt__(self, other):return self.f < other.f  # 优先队列按 f 值排序def astar(start, goal, grid):# 创建开放列表(优先队列)和闭合列表open_list = []closed_list = set()# 将起点添加到开放列表start_node = Node(start, 0, heuristic(start, goal))heapq.heappush(open_list, start_node)while open_list:# 从开放列表中取出代价最小的节点current_node = heapq.heappop(open_list)# 如果目标已经找到,返回路径if current_node.position == goal:path = []while current_node:path.append(current_node.position)current_node = current_node.parentreturn path[::-1]  # 返回反转后的路径# 将当前节点添加到闭合列表closed_list.add(current_node.position)# 获取相邻节点neighbors = get_neighbors(current_node.position)for neighbor in neighbors:if neighbor in closed_list:continue  # 如果相邻节点已经被处理过,跳过g_cost = current_node.g + 1  # 假设每步的代价为1h_cost = heuristic(neighbor, goal)neighbor_node = Node(neighbor, g_cost, h_cost)neighbor_node.parent = current_node# 如果相邻节点不在开放列表中,加入开放列表heapq.heappush(open_list, neighbor_node)return None  # 如果没有路径,返回 Nonedef heuristic(node, goal):# 计算启发式代价(这里使用曼哈顿距离)return abs(node[0] - goal[0]) + abs(node[1] - goal[1])def get_neighbors(position):# 获取当前节点的相邻节点(上下左右)x, y = positionreturn [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]if __name__ == "__main__":start = (0, 0)  # 起点goal = (4, 4)  # 目标点grid = [[0 for _ in range(5)] for _ in range(5)]  # 假设网格,0表示可行走区域path = astar(start, goal, grid)print("找到的路径:", path)
http://www.lryc.cn/news/495807.html

相关文章:

  • 前端用原生js下载File对象文件,多用于上传附件时,提交之前进行点击预览,或打开本地已经选择待上传的附件列表
  • 服务器记录所有用户docker操作,监控删除容器/镜像的人
  • 关于使用天地图、leaflet、ENVI、Vue工具实现 前端地图上覆盖上处理的农业地块图层任务
  • 基于yolov4深度学习网络的排队人数统计系统matlab仿真,带GUI界面
  • 用 React 编写一个笔记应用程序
  • 如何离线安装dockerio
  • LocalDateTime序列化(跟redis有关)
  • 【redis】如何跑
  • Scala学习记录,全文单词统计
  • 【MyBatis】验证多级缓存及 Cache Aside 模式的应用
  • 学习ASP.NET Core的身份认证(基于Session的身份认证3)
  • 速盾:高防 CDN 可以配置客户端请求超时配置?
  • DRM(数字权限管理技术)防截屏录屏----ffmpeg安装
  • 使用PyQt5开发一个GUI程序的实例演示
  • 【VUE3】【Naive UI】<NCard> 标签
  • 选择排序之大根堆
  • AI的魔力:如何为开源软件注入智慧,开启无限可能
  • 如何在 VPS 上使用 Git 设置自动部署
  • Linux下的三种 IO 复用
  • 通过 SSH 进行WordPress网站的高级服务器管理
  • 速盾高防cdn支持移动端独立缓存
  • PMP–一、二、三模、冲刺–分类–8.质量管理
  • 如何快速使用Unity 的UPR---1资源检测保姆级
  • pytorch中的.clone() 和 .detach()
  • 三十二:网络爬虫的工作原理与应对方式
  • nodejs相关知识介绍
  • MySQL排它锁
  • HarmonyOS4+NEXT星河版入门与项目实战(22)------动画(属性动画与显示动画)
  • Vue3 Ts 如何获取组件的类型
  • RAG数据拆分之PDF