A星寻路优化方案

news2024/11/20 21:17:42

1.存储常用位置间的路径信息(此优化方案一般用于地图较大,且起始点离终点较远情况下)

对于地图信息已知且各障碍位置固定的情况下,可以将常用的位置及其之间的路径信息保存,然后寻路时分别找到离开始点,结束点较近的位置,分别进行寻路,再将路径组合得到最终路径,不过此路径可能较正常寻路出的路径较远但寻路用时较少。

2.启发函数优化

2.1离终点距离公式优化

简单寻路中启发函数公式:

f(寻路消耗)= g(实际消耗也可以说离起点距离)+ h(预计消耗也可以说离终点距离)

一般情况下,h距离使用欧几里得距离公式,即h=\sqrt{(x1-x)^{2}+(y1-y)^{2}}

但是对于四方向寻路时(只能前后左右寻路,不能斜角寻路),

h可以使用曼哈顿距离公式,即h = | x1 - x | + | y1 - y |

当对于八方向寻路时,h可以使用切比雪夫距离公式,即h = max(| x1 - x |, | y1 - y |)

2.2增加权重值

简单情况下,寻路消耗是由实际消耗与预计消耗1:1相加得到,但是实际情况是预计消耗是预计值,它不等于真实的距离终点的值,此时可以增加一个系数w,将寻路消耗公式变为

f = g + w * h

此时可以通过修改w的值来改变实际消耗与预计消耗的混合比,比如当w > 1时,寻路消耗会更优先考虑当前路径预计造成的代价,当w < 1时,寻路会更优先考虑当前路径已造成的代价。

2.3寻路消耗比较时启发函数的优化

在开启列表中寻找寻路消耗最小点时,一般情况下避免不了寻路消耗一样的点的出现,此时就需要对这些点进行取舍,而取舍的方式就是为预估函数增加一个微小的偏移量p,这个偏移量p能起作用的原因是:当某两个节点的启发函数值相同时,我们希望优先判断那个距离终点更近的节点,而距离终点近也就意味着其预估函数值更小,所以,如果我们为预估函数增加一个小偏移量p(p甚至可取0.1%左右),就会使得距终点近的的节点的启发函数值更小,就会被优先选择。因此,我们可以将启发函数进一步优化为如下形式

f = g + w * h + p * h = g + (w + p) * h

2.4减少拐点

寻路有时会出现频繁转向的路径,虽然该路径确实是消耗最小的路径,但是也会存在其他消耗一样的路径且没有过多转向。结合实际,其实转向也是有消耗的,所以可以增加一个值e用来表示转向消耗,当没有转向时e = 0,当转向时e = 1,此时启发函数变为

f = g + (w + p) * h + e

3.开启列表优化

开启列表在寻路中是一个会被频繁插入数据并排序的一个列表,若每次都插入数据再排序会十分消耗性能,所以在插入数据时可以先进行数据比较,再插入数据,就能一定程度上优化开启列表。

4.遍历相邻点优化

寻路是一个重复计算一个点周围所有点距离起点和终点距离的过程,但有时并不需要将周围所有点都纳入计算,比如终点在起点右上方时,起点左下角的个别点其实可以不进行计算,因为它们的消耗一般情况下都会更大,此时循环对这些点进行计算会浪费很多时间,所有在计算时可以舍弃部分点。

但有时舍弃相邻的部分点也会导致寻路得到的路径并不是最优路径,比如起点被障碍包围,只在被舍弃的周围点附近留有缺口时,寻找到的路径就会绕路,这时旧还需优化(但本人没找到好的优化方案^_^)

下面是使用unity实现的可视化A星寻路优化工程

unity工程-A星寻路优化

除了上述几点外,A星寻路还有其他的优化方案,但我在工程中只实现上述几种,并没有实现存储常用位置间的路径信息的优化,而且A星寻路有时就是找不到最优路径,尤其在障碍点较复杂时比如在我工程中的情况,所以还有待优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1088416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JUC】原子操作类及LongAddr源码分析

文章目录 1. 十八罗汉2. 原子类再分类2.1 基本类型原子类2.2 数组类型原子类2.3 引用类型原子类2.4 对象的属性修改原子类2.5 原子操作增强类 3. 代码演示及性能比较&#xff1a;4. LongAddr原理5. LongAddr源码分析5.1 add()5.2 longAccumulate()5.3 sum() 6. 小总结6.1 Atomi…

【JUC】CAS原理

CAS原理 文章目录 CAS原理1. 概述2. 原理3. Unsafe4. CAS与自旋锁 1. 概述 compare and swap的缩写&#xff0c;中文翻译成比较并交换,实现并发算法时常用到的一种技术。它包含三个操作数一一内存位置、预期原值及更新值 执行CAS操作的时候&#xff0c;将内存位置的值与预期原…

和鲸 × 北中医:高规格、高并发,一场真正的人工智能分析应用临场实践考核

百舸争流&#xff0c;奋楫者先&#xff0c;2023 年&#xff0c;人工智能已逐渐成为引发千行百业产生颠覆性变革的前沿技术。随着人工智能时代的加速到来&#xff0c;我国政产学研各界对于创新型、复合型 AI 人才的能力要求正不断提升。 面对一批又一批激流勇进、乘风破浪的莘莘…

【Leetcode】 738. 单调递增的数字

当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9 示例 2: 输入: n 1234 输出: 1234 示例3 : …

精通Maven的捷径:一文包揽所有必知必学

Maven是每个Java程序都会遇到的包管理工具&#xff0c;今天整理一下Maven的相关知识&#xff0c;从青铜到王者&#xff0c;一文全了解&#xff0c;我们开始吧&#xff01; 1、maven是什么&#xff0c;为什么存在&#xff1f;项目结构是什么样子&#xff0c;怎么定位jar 官方网…

【ROS】ros-noetic和anaconda联合使用【教程】

【ROS】ros-noetic和anaconda联合使用【教程】 文章目录 【ROS】ros-noetic和anaconda联合使用【教程】1. 安装anaconda2. 创建虚拟环境3. 查看python解释器路径4. 在虚拟环境中使用任意的包5. 创建工作空间和ros功能包进行测试Reference 1. 安装anaconda 在Ubuntu20.04中安装…

统一观测丨使用 Prometheus 监控 SQL Server 最佳实践

作者&#xff1a;啃唯 SQL Server 简介 SQL Server 是什么&#xff1f; Microsoft SQL Server 是 Microsoft 推出的关系型数据库解决方案&#xff0c;支持企业 IT 环境中的各种事务处理、商业智能和分析应用程序。Microsoft SQL Server 是市场领先的数据库技术之一。 SQL S…

【算法-动态规划】最长上升子序列-力扣 300

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

无限连接:前端跨页面通信的实现与应用

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 引言 1. 前端跨页面通信的概述 2. 前端跨页…

RunnerGo测试平台,无代码玩转UI自动化测试

首先需要进入官网&#xff0c;RunnerGo支持开源&#xff0c;可以自行下载安装&#xff0c;也可以点击右上角体验企业版按钮快速体验 点击体验企业版进入工作台后可以点击页面上方的UI自动化 进入到测试页面 创建元素 我们可以在元素管理中创建我们测试时需要的元素 这里我们以…

PPT制作软件哪个好?各种类型的10款好用PPT软件盘点!

想必大家对PPT并不陌生&#xff0c;它在日常的工作或学习中有诸多应用场景&#xff0c;小到制作一份电子相册&#xff0c;大到一场产品发布会&#xff0c;都可以看到PPT的影子。 如果我们细究PPT的话&#xff0c;会发现可以细分出各种类型的PPT软件&#xff0c;诸如&#xff1…

Linux指令集合

磁盘相关命令 df//查看磁盘整体状况df -h //查看磁盘整体状况du //查看磁盘使用情况&#xff0c;如果不加目录&#xff0c;默认为当前目录du -h -d 0//表示我们只希望看当前目录磁盘使用情况&#xff0c;不会继续展示这层目录的下一级目录 du -h -d 1//表示展示当前目录的下一…

微信自动批量添加好友的方法

在现在的营销中微信已成为一种重要的沟通方式。微信目前是没有自动批量添加好友的功能&#xff0c;需要运营者一个一个手动去添加&#xff0c;这样太过于浪费时间&#xff0c;并且加频繁了还容易被封号&#xff0c;今天给大家介绍几种手动批量加好友的方式以及怎么借助第三方软…

深入理解AQS之ReentrantLock源码分析

开题&#xff1a;如何自己生成一把独占锁&#xff1f; 1. 管程 — Java同步的设计思想 管程&#xff1a;指的是管理共享变量以及对共享变量的操作过程&#xff0c;让他们支持并发。 互斥&#xff1a;同一时刻只允许一个线程访问共享资源&#xff1b; 同步&#xff1a;线程之间…

【测试】丝滑版本测试记录2023-10-13

目录 四组24个视频拉取 视频拉取的带宽 本地内存不足 四组24个视频拉取 视频拉取的带宽 本地内存不足 由于 edge需要内存大几百M,加截wasm要更多一点&#xff0c;只剩下 400M,不足以使用

git+gitee代码上传

gitgitee代码上传 1、git应用工具下载安装 gitee应用注册并创建仓库点创建后进入到仓库 git命令关于.gitignore只执行一次的命令经常执行的命令 1、git应用工具 下载安装 https://git-scm.com/downloads $ git --version git version 2.39.0.windows.2代码仓库&#xff1a; …

全力以赴,火山引擎边缘云代表团出战亚运会

END 未来&#xff0c;火山引擎边缘云赛事阵容将继续全力以赴&#xff0c;通过领先、可信赖的云和智能技术&#xff0c;助力游戏行业呈现更加精彩的竞技赛事。

LeetCode【240】搜索二维矩阵

题目&#xff1a; 思路&#xff1a; 1、单靠对角线元素无法判定位置 2、主要逐行进行二分 代码&#xff1a; public boolean searchMatrix(int[][] matrix, int target) {int rows matrix.length;int columns matrix[0].length;// 按行进行二分for (int i 0; i < rows…

Apipost连接数据库详解

Apipost提供了数据库连接功能&#xff0c;在接口调试时可以使用数据库获取入参或进行断言校验。目前的Apipost支持&#xff1a;Mysql、SQL Sever、Oracle、Clickhouse、达梦数据库、PostgreSQL、Redis、MongoDB 8种数据库的连接操作 新建数据库连接&#xff1a; 在「项目设置…

ue5蓝图请求接口

安装与使用 1、在虚幻商城搜索 VaRest 插件 2、选择自己项目的对应版本安装 3、查看是否安装成功 4、进入项目后,分别启动VaRest、JSON Blueprint Utilities两个插件(勾选后会提示重启项目) 5、基本用法:打开关卡蓝图使用(url改为自己的接口、Verb是请求方式) 5.1、或者…