A* 算法简介

一、A* 算法简介
A* algorithm is a popular choice for
graph searchBreadth First Search is the simplest of the graph search algorithms. Graph search algorithms, including A*, take a “graph” as input. 
A* algorithm is a
modification of Dijkstra’s Algorithm that is optimized for a single destination.
A* algorithm uses both the
actual distance from the start and the estimated distance to the goal.
From: https://www.redblobgames.com/pathfinding/a-star/introduction.html

二、A* 算法的估值更新
A* 算法的估值更新,需要用到 A* 算法的
启发函数 h(x)
相应地,A* 算法的可表示为:
f(x)=g(x)+h(x)其中:
f(x):从初始状态经由当前状态 x 到目标状态的估计代价
g(x):从初始状态到当前状态 x 的
实际代价
h(x):从当前状态 x 到目标状态的估计代价

注意:
1. 针对 f(x)=g(x)+h(x),如果 h(x)=0,就是普通的BFS算法;如果 g(x)=0,就是贪心算法。所以
A* 算法就是“BFS+贪心”。
2. 启发函数 h(x) 决定了A*算法的优劣。启发函数 h(x) 包括
曼哈顿距离对角线距离(切比雪夫距离)、欧几里得距离等。启发函数 h(x) 必须满足单调性(即估计代价不会超过从当前状态 x 到目标状态的的实际代价)。A*算法的主要难点设计合适的 h(x) 函数,而编码很容易。
3. 在二维平面上,有3种方法可以近似计算 h(cur)。
下面的 (cur.x, cur.y) 是 cur 点的坐标,(t.x, t.y) 是终点 t 的坐标。
(1)曼哈顿距离
应用场景:只能在四个方向(上,下,左,右)移动。

h(cur)=abs(cur.x–t.x)+abs(cur.y–t.y)
(2)对角线距离
应用场景:可以在八个方向上移动,例如国际象棋的国王的移动。

h(cur)=max(abs(cur.x–t.x), abs(cur.y–t.y))
(3)欧几里得距离。
应用场景:可以向任何方向移动。

h(cur)=sqrt((cur.x–t.x)^2+(cur.y–t.y)^2)
非平面问题,需要设计合适的 h 函数。
4. 计算 h(x) 时,要
忽略路径中的障碍物。因为 h(x) 是对剩余距离的估算值,而不是实际值,因此  h(x) 为估计代价。
5. A*算法中,地图必须是可行的,即不存在无法通过的障碍物或无法到达的区域。同时,需将地图“
网格化”,“网格化”其实就是将连续的问题离散化
6. A*算法中,选取下一个格子的
标准不是离终点最近,而是离起点和终点的距离之和最近

三、A* 算法的步骤
在 A* 算法中,需要使用两个辅助表来记录结点。
一个用于记录可被访问的结点,称为
openList 表;一个是记录已访问过的结点,称为 closeList 表。
A* 算法的终止条件是终点在 closeList 表中(找到路径)或 openList 表为空(找不到路径)。
-------------------------------------
A* 算法的简单步骤如下:
1.把起始节点添加到openList;
2.重复如下步骤:
   a) 寻找 openList 当中 F 值最低的结点,将其称为当前结点;
   b) 将该结点从 openList 中删除,并加入 closeList 当中;
   c) 对于当前结点相邻的 8 个结点
       * 如果它不可通过或者已在 closeList 当中,忽略它,反之如下;
       * 如果它不在 openList 当中,将其添加进去。把当前结点作为它的父结点。同时更新它的 F,G 和 H 值。
       * 如果它已经在 openList 当中,通过判断沿当前结点到它的路径的
G 值是否更小,若更小,则将当前结点作为它的父结点,同时更新它的 F 和 G 值。否则,不做任何操作。
   d) 当目标结点已添加到 closeList 时,路径已被找到;或者没有找到目标结点,此时 openList 已为空。这时候,路径不存在。以上两种情况结束循环。
3.
路径回归。从目标结点开始,沿着每一个结点的父结点移动至起始结点,形成的路径即为所求路径。


 

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

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

相关文章

华为OD机试 - 部门人力分配(Java JS Python C)

题目描述 部门在进行需求开发时需要进行人力安排。 当前部门需要完成 N 个需求,需求用 requirements 表述,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。 这部分需求需要在 M 个月内完成开发,进行人力安排后每个月人力时固定的。 目前要求每个月最多有2个…

在k8s中部署nfs-client-provisioner

1、部署过程 1.1、环境依赖 在部署nfs-client-provisioner之前,需要先部署nfs服务。 因为,nfs-client-provisioner创建的pv都是要在nfs服务器中搭建的。 本示例中的nfs server的地址如下: [rootnode1 /]# showmount -e Export list for …

pinia 持久化插件使用

官方文档 本文主要介绍 vue3组合式 api 使用持久化插件的写法。 选项式 写法官方已给出 安装依赖 pnpm i pinia-plugin-persistedstate插件的使用 import { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstateconst pinia creat…

JavaMap工具类(MapUtils)

1、Object转Map 2、将 map 中的 value 为null的的元素转成空字符串"" 3、map转Object 4、MAP 判空 5、Map 排序 按key值长度进行排序 6、两个MAP对比,在oldMap中移除remMap中所有的key值 备注:排序的话(TreeMap)是可以直接实现简单排序的…

VR转接线方案/VR Link串流数据线方案/VR眼镜PD快充方案

虚拟现实技术(英文名称:Virtual Reality,缩写为VR),又称虚拟实境或灵境技术,是20世纪发展起来的一项全新的实用技术。虚拟现实技术囊括计算机、电子信息、仿真技术,其基本实现方式是以计算机技术为主,利用并…

Java:commons-lang3中的StringUtils.strip实现移除字符串首尾字符

依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version> </dependency>示例 // 包名 import org.apache.commons.lang3.StringUtils;// 处理字符串&…

kafka支持外网访问

kafka支持外网访问 1.kafka正常部署之后如果不修改&#xff0c;外网是无法访问的&#xff0c;具体如下&#xff08;这里是单节点&#xff09; 2.这个时候需要修改kafka的config中的server.properties中的 listeners 修改为0.0.0.0 监控所有网卡&#xff0c;advertised.listene…

管理空闲存储空间

位示图是操作系统中一种管理空闲存储空间的方法。管理空闲除使用位示图法还可用&#xff1a;空闲区表法&#xff0c;空闲链表法&#xff0c;成组链接法 1.空闲区表法 空闲表法属于连续分配方法。它与内存管理中的动态分区分配方法雷同。 将外存空间上一个连续未分配区域称为“…

[三次反转法]循环移动数组元素

循环移动 题目描述 给定一组整数&#xff0c;要求利用数组把这组数保存起来&#xff0c;然后实现对数组的循环移动。假定供有n个整数&#xff0c;则要使前面各数顺序向后移m个位置&#xff0c;并使最后m个数变为最前面的m个数(m<n)。 注意&#xff0c;不要用先输出后m个数…

口袋参谋:如何对订单实现一键批量插旗?

​在淘宝店铺运营中&#xff0c;对宝贝订单标注插旗&#xff0c;也算是常态了&#xff0c;至少90%的商家都不陌生&#xff0c;剩下的10%是刚入行的新手&#xff0c;正如我刚入行一样。 01 首先我们要了解什么是插旗&#xff1f; 其实就是淘宝店铺利用各种颜色的旗子来代表订单…

A-23 P离子交换树脂:高效去除无机有机污染物的新选择

在当今水处理行业中&#xff0c;高效、环保的离子交换树脂备受关注。本文将为您介绍一款具有卓越性能的碱性季胺基阴离子交换树脂——Tulsion A-23 P。通过分析其特性和应用&#xff0c;展示其在水处理领域的优势。 一、Tulsion A-23 P离子交换树脂的特性 物理化学稳定性&#…

Vue生命周期函数执行顺序(使用注意事项)

文章目录 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed Vue.js 是一个基于 MVVM 模式的前端框架&#xff0c;它的核心是一个响应式的数据绑定系统。在 Vue.js 中&#xff0c;组件是一个可复用的 Vue 实例&#xff0c;它拥有自己的生命周期…

input聚焦,失去焦点的那些事

需求&#xff1a; 1&#xff1a;搜索输入时显示清空按钮和搜索按钮&#xff1b; 2&#xff1a;点击搜索按钮失去焦点&#xff0c;并查询&#xff1b; 3&#xff1a;点击清空按钮后重新聚焦&#xff1b; 需要解决的问题&#xff1a; 1&#xff1a;失去焦点需要别的处理的话要加…

Linux命令——nc

Linux命令——nc 文章目录 Linux命令——nc例子客户端/服务端模型数据传输与服务端交互端口扫描使用代理发送文件聊天工具一次性 Web Server文件夹传输远程克隆磁盘shell反向 shell 参考 netcat&#xff0c;简写为 nc&#xff0c;是 unix 系统下一个强大的命令行网络通信工具&a…

JS手写Promise.all方法

测试例子 var f11 Promise.resolve("111");var f22 Promise.resolve("222");var f33 Promise.resolve("333");// var f33 Promise.reject("333");1、用原生 Promise 实现 逻辑说明&#xff1a;接收一个由多个promise方法组成的数组…

uniapp开发小程序-pc端小程序下载后端接口的二进制流文件

fileName包含文件名后缀名&#xff0c;比如test.png这种格式 api.DownloadTmtFile后端接口返回的是文件的二进制流 值得注意的是&#xff0c;微信开发者工具中是测试不了wx.saveFileToDisk的&#xff0c;需要真机或者体验版测试 handleDownload(fileName) {if (!fileName) retu…

mysql表的字段建议加上NOT NULL约束

mysql的列加上NOT NULL约束&#xff0c;这是一个好的实践&#xff08;但不是一个强制要求&#xff09;&#xff0c;因为它能带来一些好处&#xff0c;例如&#xff1a; 设置为NOT NULL&#xff0c;可以确保该列没有NULL值&#xff0c;对该列的数据的规范性进行约束。加上NOT N…

大文件传输软件和传统软件的优缺点

在当前信息时代&#xff0c;文件和数据的传输已成为我们工作和生活中不可或缺的一环。无论是向同事发送报告还是与朋友分享电影&#xff0c;我们都需要依赖软件完成这些操作。然而&#xff0c;随着文件和数据容量的增大&#xff0c;传统的文件传输软件如FTP、HTTP、SMB、NFS等已…

pycharm中py文件设置参数

在py文件中右键 直接对应复制进去即可

sql35(Leetcode1204最后一个能进入巴士的人)

代码&#xff1a; from t1,t2 自连接 两两组合 group by having 求和 选出<1000的项 # Write your MySQL query statement below select a.person_name from Queue a, Queue b where a.turn>b.turn group by a.person_id having sum(b.weight)<1000 order by a.t…