Astar路径规划算法复现-python实现
# -*- coding: utf-8 -*-
"""
Created on Fri May 24 09:04:23 2024"""import os
import sys
import math
import heapq
import matplotlib.pyplot as plt
import time'''
传统A*算法
'''class Astar:'''AStar set the cost + heuristics as the priorityAStar将成本+启发式设置为优先级'''def __init__(self, s_start, s_goal, heuristic_type, xI, xG):self.s_start = s_startself.s_goal = s_goalself.heuristic_type = heuristic_typeself.u_set = [(-1, 0), (0, 1), (1, 0), (0, -1)]# self.obs = self.obs_map() # 障碍物位置self.Open = [] # 优先级序列,open集合self.Closed = [] # 相邻点集合,访问visited序列self.parent = dict() # 相邻父节点self.g = dict() # 成本self.x_range = 51 # 设置背景大小self.y_range = 51self.xI, self.xG = xI, xGself.obs = self.obs_map()def animation(self, path_l, visited_l, name, path_color='g'):# 绘制地图基础元素obs_x = [x[0] for x in self.obs]obs_y = [x[1] for x in self.obs]plt.plot(self.xI[0], self.xI[1], "bs") # 起点plt.plot(self.xG[0], self.xG[1], "gs") # 终点plt.plot(obs_x, obs_y, "sk") # 障碍物plt.title(name)plt.axis("equal")# 移除起点和终点于visited_l列表中,避免它们被标记为已访问点visited_l = [node for node in visited_l if node != self.xI and node != self.xG]# 绘制所有已访问节点for x in visited_l:plt.plot(x[0], x[1], color='gray', marker='o')# 绘制路径path_x = [point[0] for point in path_l]path_y = [point[1] for point in path_l]plt.plot(path_x, path_y, linewidth=3, color=path_color)# 显示最终图形plt.show(block=True)def obs_map(self):"""Initialize obstacles' positions:return: map of obstacles初始化障碍物位置返回:障碍物"""x = 51y = 31self.obs = set()# 绘制边界self.obs.update((i, 0) for i in range(x))self.obs.update((i, y - 1) for i in range(x))self.obs.update((0, i) for i in range(y))self.obs.update((x - 1, i) for i in range(y))# 给出障碍物坐标集1self.obs.update((i, 15) for i in range(10, 21))self.obs.update((20, i) for i in range(15))# 给出障碍物坐标集2self.obs.update((30, i) for i in range(15, 30))# 给出障碍物坐标集3self.obs.update((40, i) for i in range(16))return self.obsdef searching(self):"""A_star Searching.:return: path, visited orderAstart搜索,返回路径、访问集,"""self.parent[self.s_start] = self.s_start # 初始化 起始父节点中只有起点。self.g[self.s_start] = 0 # 初始代价为0self.g[self.s_goal] = math.inf # 目标节点代价为无穷大# 将元素(self.f_value(self.s_start), self.s_start)插入到Open堆中,# 并保持堆的性质(最小堆中父节点的值总是小于或等于其子节点的值))# 这行代码的意思是:计算起始节点s_start的评估值f_value(self.s_start),# 然后将这对值(f_value, self.s_start)作为一个元组插入到self.Open这个最小堆中。# 这样做的目的是在诸如A*搜索算法等需要高效管理待探索节点的场景下,# 确保每次可以从堆顶(也就是当前评估值最小的节点)取出下一个待处理的节点。# 这对于寻找最短路径、最小成本解决方案等问题非常有用。heapq.heappush(self.Open, (self.f_value(self.s_start), self.s_start))while self.Open:# heappop会取出栈顶元素并将原始数据从堆栈中删除# 在这个例子中,heappop返回的元素假设是一个包含两个元素的元组,# 但代码中只关心第二个元素(实际的数据,比如一个状态、节点或其他任何类型的数据),# 所以用_占位符丢弃了第一个元素(通常是评估值或优先级),而把第二个元素赋值给了变量s_, s_current = heapq.heappop(self.Open) # s_current存储的是当前位置的坐标# print('栈顶元素为{0}'.format(s_current))self.Closed.append(s_current)if s_current == self.s_goal: # 迭代停止条件,判断出栈顶元素是否为目标点,如果为目标点,则退出break# 如果不是,更新该点附近的代价值# get_neighbor为获取附近点的坐标for s_next in self.get_neighbor(s_current):new_cost = self.g[s_current] + self.cost(s_current, s_next)if s_next not in self.g:self.g[s_next] = math.infif new_cost < self.g[s_next]:self.g[s_next] = new_costself.parent[s_next] = s_current# heappush入栈时需要存储的该点的代价值的计算方式为heapq.heappush(self.Open, (self.f_value(s_next), s_next))# self.animation(self.extract_path(self.parent), self.Closed, "A*")return self.extract_path(self.parent), self.Closeddef get_neighbor(self, s_current):""":param s_current::return: 相邻点集合"""return [(s_current[0] + u[0], s_current[1] + u[1]) for u in self.u_set]def cost(self, s_current, s_next):""":param s_current 表示当前点:param s_next 表示相邻点:return 若与障碍物无冲突,则范围欧式距离成本,否则为无穷大成本计算当前点与相邻点的距离成本"""# 判断是否与障碍物冲突if self.is_collision(s_current, s_next):return math.inf# 这里返回欧式距离成本return math.hypot(s_next[0] - s_current[0], s_next[1] - s_current[1])def is_collision(self, s_current, s_next):"""check if the line segment (s_start, s_end) is collision.:param s_current: start node:param s_next: end node:return: True: is collision / False: not collision检查起终点线段与障碍物是否冲突如果线段的起点或终点之一位于障碍物集合 self.obs 内,则直接判定为碰撞,返回 True。若线段不垂直也不水平(即斜线段),则分为两种情况检查:若线段为45度线(斜率为1:1或-1),则检查线段的端点形成的矩形框内是否有障碍物。否则检查线段端点形成的另一矩形框内是否有障碍物。若上述任一矩形框内有障碍,则判定为碰撞,返回 True若无碰撞情况,则返回 False"""# obs是障碍物,如果遇到障碍物,则距离(成本)无穷大if s_current in self.obs or s_next in self.obs:return True''''''# 如果该点s_start与相邻点s_end不相同if s_current[0] != s_next[0] and s_current[1] != s_next[1]:# 如果两点横纵坐标之差相等,即线段不垂直也不水平。135度线if s_next[0] - s_current[0] == s_current[1] - s_next[1]:s1 = (min(s_current[0], s_next[0]), min(s_current[1], s_next[1]))s2 = (max(s_current[0], s_next[0]), max(s_current[1], s_next[1]))# 如果两点横纵坐标之差不相等else:s1 = (min(s_current[0], s_next[0]), max(s_current[1], s_next[1]))s2 = (max(s_current[0], s_next[0]), min(s_current[1], s_next[1]))# obs是障碍物if s1 in self.obs or s2 in self.obs:return Truereturn Falsedef f_value(self, s_currrent):"""f = g + h. (g: Cost to come, h: heuristic value):param s: current state:return: f"""return self.g[s_currrent] + self.heuristic(s_currrent)def extract_path(self, parent):path = [self.s_goal]s = self.s_goalwhile True:s = parent[s]path.append(s)if s == self.s_start:breakreturn list(path)def heuristic(self, s_current):heuristic_type = self.heuristic_type # heuristic typegoal = self.s_goal # goal node# 如果为manhattan,则采用曼哈顿距离,s存储的是中间点if heuristic_type == "manhattan":return abs(goal[0] - s_current[0]) + abs(goal[1] - s_current[1])# 否则就是欧几里得距离,符合勾股定理else:return math.hypot(goal[0] - s_current[0], goal[1] - s_current[1])if __name__ == '__main__':time_start = time.time()s_start = (5, 5)s_goal = (45, 26)star_m = Astar(s_start, s_goal, "ee", s_start, s_goal)path, visited = star_m.searching()star_m.animation(path, visited, "A*") # animationtime_end = time.time()print("程序运行时间:", time_end - time_start)

相关文章:
Astar路径规划算法复现-python实现
# -*- coding: utf-8 -*- """ Created on Fri May 24 09:04:23 2024"""import os import sys import math import heapq import matplotlib.pyplot as plt import time 传统A*算法 class Astar:AStar set the cost heuristics as the priorityA…...
低-零功率技术在军事中的应用
“低-零功率”概念最先由美国国防部提出,主要是针对诸如俄罗斯等大国的远程传感器,帮助美军破除“灰色地带挑衅”的威胁。由于“灰色地带”冲突仅依托小规模军事力量,其强度维持在不足以引发美国及其盟国进行直接干预的程度,因此&…...
【培训】企业档案管理专题(私货)
导读:通过该专题培训,可以系统了解企业档案管理是什么、为什么、怎么做。尤其是对档案的价值认知,如何构建与新质生产力发展相适应的企业档案工作体系将有力支撑企业新质生产力的发展,为企业高质量发展贡献档案力量,提…...
某国资集团数据治理落地,点燃高质量发展“数字引擎”
某国有资产经营控股集团为快速提升集团的内控管理能力和业务经营能力,以数字化促进企业转型的信息化建设势在必行。集团携手亿信华辰开启数据治理项目,在数据方面成功解决“哪里来、怎么盘、怎么管、怎么用”的问题,不断推动企业数字化转型…...
2024.06.12【读书笔记】丨生物信息学与功能基因组学(第十四章 细菌和古细菌基因组 第二部分)【AI测试版】
读书笔记:《生物信息学与功能基因组学》第十四章 - 第二部分 摘要 第二部分深入讨论了基于不同标准的细菌和古细菌的分类方法,包括形态学、基因组大小和排列、生活方式以及与人类疾病的关系。此外,还探讨了基于核糖体RNA序列的分类方法&…...
企业数据API接口大全
一、工商信息 (1)精确获取企业唯一标识 根据企业名称、注册号或统一社会信用代码,获取企业唯一标识 (2)企业模糊查询 关键字名称模糊搜索匹配企业 (3)企业详情 根据企业唯一标识、企业名称…...
【HTML】格式化文本 pre 标签
文章目录 <pre> 元素中的文本以等宽字体显示,文本保留空格和换行符。 <pre> 元素支持 HTML 中的全局属性和事件属性。 示例: <pre> pre 元素中的文本 以等宽字体显示, 并且同时保留 空格 和 换行符。 </pre&…...
力扣每日一题(2024-06-13)2813. 子序列最大优雅度
基于官方题解,进行补充说明 给你一个长度为 n 的二维整数数组 items 和一个整数 k 。 items[i] [profiti, categoryi],其中 profiti 和 categoryi 分别表示第 i 个项目的利润和类别。 现定义 items 的 子序列 的 优雅度 可以用 total_profit distinct_…...
MySQL -- 优化
1. 查询优化 使用索引 示例:有一个包含数百万用户的表,名为 users,常见的查询是通过 email 字段查找用户。 CREATE INDEX idx_email ON users(email);通过创建索引 idx_email,SELECT * FROM users WHERE email exampleexample…...
学会python——密码校验(python实例三)
目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 pycharm编译 3、纠正密码输入的格式问题 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可…...
【Python】中的X[:,0]、X[0,:]、X[:,:,0]、X[:,:,1]、X[:,m:n]、X[:,:,m:n]和X[: : -1]
Python中 x[m,n]是通过numpy库引用数组或矩阵中的某一段数据集的一种写法,m代表第m维,n代表m维中取第几段特征数据。 通常用法: x[:,n]或者x[n,:] X[:,0]表示对一个二维数组,取该二维数组第一维中的所有数据,第二维中取第0个数据。 X[0,:]使用类比前者。 举例说明: x[:,0…...
【Java基础】OkHttp 超时设置详解
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
巴西:海外媒体投放,大舍传媒实现企业与巴西媒体间的交流
引言 随着全球化的进程,海外市场的开拓对于企业的发展至关重要。巴西作为南美洲最大的经济体和人口大国,具有巨大的商机。在与巴西媒体的交流中,大舍传媒的投放成为了一种高效的宣传和合作途径。 巴西媒体的多样性 巴西媒体以其丰富多样的…...
MT7981B+MT7976C+MT7531A RF定频测试方法
1、从下面网址下载QA软件包,然后在WIN系统下安装QA环境。 https://download.csdn.net/download/zhouwu_linux/89428691?spm1001.2014.3001.5501 在WINDOWS 7系统下先安装WinPcap_4_1_3.exe。 2、搭建硬件环境,电脑先连接仪器,主板网络与电…...
支持微信支付宝账单,极空间Docker部署一个开箱即用的私人账本『cashbook』
支持微信支付宝账单,Docker部署一个开箱即用的私人账本『cashbook』 哈喽小伙伴好,我是Stark-C~ 不知道屏幕前的各位富哥富姐们有没有请一个专业的私人财务助理管理自己的巨额资产,我不是给大家炫耀,我在月薪300的时候就已经有了…...
异常检测方法
1 异常检测方法适用范围 什么时候我们需要异常点检测算法呢?常用的有三种情况。 1.做数据预处理的时候需要对异常的数据做过滤,防止对归一化等处理的结果。2.对没有标记输出的特征数据做筛选,找出异常的数据。3.对有标记输出的特征数据做二…...
在网站建设时,如何选择适合自己的网站模版
可以根据以下几个地方选择适合的网站模板 1.公司的核心业务 根据公司的业务内容来确定网站展示的内容之一,不同的业务内容可以有不同的展示方式,以此来确定网站的展示风格之一,公司肯定是要有明确的业务内容,并且能够在网站…...
rabbitmq单机安装及性能测试
RabbitMQ单机安装及性能测试 本文使用CentOS7.9安装RabbitMQ单机环境,并进行性能测试。 1. 安装RabbitMQ RabbitMQ依赖Erlang,版本配套关系参考官网:https://www.rabbitmq.com/docs/which-erlang。 本文安装RabbitMQ3.8.21,Erlang版本要求…...
字节流和字符流的区别
字节流和字符流的区别 字节流 **数据单位:**Byte为单位进行数据传输和处理。 **应用场景:**适用于所有类型的文件,包括视频、视频、音频等二进制文件,以及文本文件。 比如InputStrem和子类(FileInputStream&#x…...
【仿真建模-anylogic】EventRate原理解析
Author:赵志乾 Date:2024-06-13 Declaration:All Right Reserved!!! 1. 类图 2. 原理解析 EventOriginator是Anylogic中各类事件的父类,对外暴露的接口主要有: 函数功能boolean isActive()判定…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
