软件价值3-A*算法寻路

A*算法(A-star算法)是一种启发式搜索算法,主要用于在图或网络中找到从起始节点到目标节点的最佳路径。它结合了Dijkstra算法的广度优先搜索和贪婪最优优先搜索的特点,通过估算从起始节点到目标节点的代价来指导搜索方向。

A*算法的核心思想是维护一个开放列表(open list)和一个关闭列表(closed list)。算法在每一步选择开放列表中代价最小的节点进行拓展,同时更新与该节点相邻的节点的代价估计和路径信息。算法通过两个函数来评估每个节点的优先级:

1. g(n):表示从起始节点到节点n的实际代价,即起点到当前节点的路径长度。
2. h(n):表示从节点n到目标节点的启发式估计代价,即当前节点到目标节点的最短可能路径的估计长度(启发式函数)。

A*算法通过计算 f(n) = g(n) + h(n) 来评估每个节点的优先级,然后选择具有最小f(n)值的节点进行拓展。这样,A*算法能够在搜索过程中综合考虑实际代价和启发式估计,以找到一条最优的路径

A*算法的优点在于它在搜索空间中能够更加智能地选择节点,减小搜索范围,从而提高搜索效率。但需要注意,启发式函数的选择对算法的性能有很大影响,不同的启发式函数可能导致不同的搜索结果。

详情可以看博文:

A* 寻路算法

演示:

Matt Yanos实现的A*寻路

绿色为起点,红色是终点,黑色是结果路径,黄色是搜索路径范围,由图可见A*算法在迷宫里搜索效率还是比较高的。

其中一种启发式函数 Manhattan 的实现:

package astargazer.map.heuristic;import astargazer.map.WeightedPoint;/*** Manhattan distance heuristic* * @author Matt Yanos*/
public class HeuristicManhattan extends HeuristicScheme
{@Overridepublic float distance(WeightedPoint one, WeightedPoint two){return Math.abs(two.getCol() - one.getCol()) + Math.abs(two.getRow() - one.getRow());}@Overridepublic String getLabel(){return "Manhattan";}@Overridepublic String getExplanation(){return "Manhattan (or Taxicab) distance only permits travelling along " + "the x and y axes, so the distance between (0, 0) and (1, 1) is " + "2 from travelling along the X axis 1 unit and then up the Y " + "axis 1 unit, and not the hypotenuse, which would be sqrt(2)/2. " + "It's so named because in a city you're bound to the streets. " + "You can't cut diagonally through a building to go north/south " + "one block and east/west one block.";}
}

曼哈顿距离(Manhattan distance)是一种启发式函数,常用于A*算法等路径搜索算法中。它也被称为城市街区距离、L1距离或曼哈顿长度。

对于在二维平面上的两点P(x1, y1)和Q(x2, y2),它们之间的曼哈顿距离定义为它们在水平和垂直方向上的坐标差的绝对值之和:

\text{Manhattan Distance}(P, Q) = |x1 - x2| + |y1 - y2| 

在路径搜索问题中,曼哈顿距离常被用作启发式函数,特别是在网格状结构(如棋盘格)中。对于这种结构,每一步只能在水平或垂直方向上移动一个单位,因此曼哈顿距离提供了一种很好的启发式方法来估计两点之间的实际路径代价。

在A*算法中,曼哈顿距离作为启发式函数 h(n) 的一部分,用于估计从当前节点到目标节点的最短可能路径的长度。曼哈顿距离的选择通常能够提高A*算法的搜索效率,特别是在图或网络结构中的路径搜索问题中。

结论:

A*算法可以应用于障碍寻路。

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

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

相关文章

Android中属性property_get和property_set的详细用法介绍

1,property_get和property_set的作用说明 在Android操作系统中,property_get和property_set是用于获取和设置系统属性的函数。这些属性通常用于存储和读取配置信息,例如设备配置、网络设置、系统参数等。 property_get函数用于获取指定属性…

二叉树中和为某一值的路径

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

一、创建Vue3项目

1. 下载 node.js 下载地址:https://nodejs.org/zh-cn 优先选择 16 版本; node -v || node -version 可以检查本地 node.js 版本 2. 设置淘宝镜像源 npm config set registry https://registry.npmmirror.com/ 设置淘宝镜像源 npm config get registry 查看当前镜像…

如何获得《幻兽帕鲁》隐藏帕鲁唤夜兽?13000个配种配方查询 幻兽帕鲁Steam好评率还在涨 Mac苹果电脑玩幻兽帕鲁 Crossover玩Windows游戏

《幻兽帕鲁》是一款Steam平台热门游戏,开放式大陆和养成式冒险结合,成为2024首款热门游戏,不过由于官方仅发布了Windows版的游戏客户端,Mac用户无法直接玩,好在有Crossover这样的神器,让苹果电脑也能玩上《…

JavaScript 基础 (二)

文章目录 JavaScript 基础 (二)一.运算符1.1 **算术运算符**1.1.1 基础1.1.2 算术运算符执行的优先级顺序1.1.3 小结 1.2 **赋值运算符**1.2.1 基础1.2.2 小结 1.3 **一元运算符**1.3.1 基础1.3.2 小结 1.4 **比较运算符**1.4.1 比较运算符的介绍1.4.2 比…

如何改变音频的频率教程

这是一篇教你如何通过一些工具改变音频频率的教学文章。全程所用的软件都是免费的。 本文用到的软件: AIX智能下载器 用于抓取任何视频网站资源的插件 格式工厂 将mp4转化为mp3 Audacity 改变音频频率的软件 如果你已备好mp3或其他格式的音频,那么直接看…

flutter module打包成framework引入原生工程

Flutter - 将 Flutter 集成到现有项目(iOS - Framework篇) 本篇文章大幅参考了 caijinglong 大佬的总结文章: 把flutter作为framework添加到已存在的iOS中[1] 用 Flutter 来开发,从来都不可能是新开的一个纯 Flutter 项目&#xf…

Ubuntu22.04 网络图标突然消失

本来好好的,突然就发现没有网络了,图标也不见了。 特别是Ubuntu虚拟机,容易出现此问题。 修复办法 1. sudo service network-manager stop2. sudo rm /var/lib/NetworkManager/NetworkManager.state3. sudo service network-manager start到…

【STM32CubeMX】生成代码错误

1、不能有中文路径 参考博客: http://t.csdnimg.cn/OdYi2 生成的代码已经帮忙初始化,只需修改main函数的while(1)即可: 2、有可能是Java环境版本不对 我安装的时候操作正确

The Rise and Potential of Large Language Model Based Agents: A Survey 中文翻译

大型语言模型代理的崛起与潜力:综述 摘要 长期以来,人类一直追求与或超越人类水平的人工智能(AI),而人工智能代理被视为实现这一目标的有希望的方式。人工智能代理是感知环境、做出决策并采取行动的人工实体。已经有…

林浩然探索庄子美妙哲学境界

林浩然探索庄子美妙哲学境界 Lin Haoran Explores the Sublime Philosophical Realm of Zhuangzi 在现代社会这个信息洪流中,犹如一片繁华喧嚣的都市丛林,青年学者林浩然却如一只挣脱了世俗束缚的鲲鹏,以其独特的视角和深邃的思考&#xff0c…

TensorFlow2实战-系列教程7:TFRecords数据源制作1

🧡💛💚TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、TFRecords 在训练过程中,基本都是使用GPU来计算,但是取一个…

易点易动设备管理平台助力制造企业实现设备的能耗监控

在当今注重环保和可持续发展的时代,能源消耗成为制造企业关注的重要问题。为了提高能源利用效率和降低能源成本,制造企业需要对设备的能耗进行有效监控和管理。易点易动设备管理平台作为一款智能化设备管理解决方案,为制造企业提供了全面的能…

Java 枚举enum类

Java枚举(Enum) 枚举 定义: Java枚举是一种特殊的类,用来表示一组固定的常量。 被enum关键字修饰的类型就是枚举类型 (如果枚举不添加任何方法,枚举值默认为从0开始的有序数据。 比如定义一个枚举类表示…

【C语言】位操作符详解

目录 1、按位与( & ) 2、按位或( | ) 3.按位异或( ^ ) C语言中的位操作符有以下: & | ^//按位与 //按位或 //按位异或 位运算符是计算两者之间的补码,然后得到的是计算后补…

防御保护----防火墙基本知识

一.防火墙的基本知识--------------------------------------------------------- 防火墙:可以想象为古代每个城市的城墙,用来防守敌军的攻击。墙,始于防,忠于守。从古至今,墙予人以安全之意。 防火墙的主要职责在于&…

ES实战回顾

1、你用的集群节点情况? 一个ES集群,18个节点,其中3个主节点,15个数据节点,500G左右的索引数据量,没有单独的协调节点,它的每个节点都可以充当协调功能; 2、你们常用的索引有哪些&a…

一个基于 .NET 7 + Vue.js 的前后端分离的通用后台管理系统框架 - DncZeus

前言 今天给大家推荐一个基于.NET 7 Vue.js(iview-admin) 的前后端分离的通用后台权限(页面访问、操作按钮控制)管理系统框架:DncZeus。 官方项目简介 DncZeus是一个基于 .NET 7 Vue.js 的前后端分离的通用后台管理系统框架。后端使用.NET 7 Entity Framework…

Mysql-事务(隔离级别,事务底层原理,MVCC)

什么是事务?有哪些特性? 事务:事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败。 事务特性: 原子性(Atomicity): 原子性是指事务是一个不…

设计模式——2_0 职责链(Chain of Responsibility)

楼下一个男人并得要死,那家隔壁的一家唱着留声机,对面是弄孩子。楼上有两人狂笑;还有打牌声,河中的船上有女人哭她死去的母亲。人类的悲欢并不相通,我只觉得他们吵闹 ——鲁迅 文章目录 定义图纸一个例子:如…