最短路径算法之AStar算法(四) 可变H函数

2023-05-16

前面的文章已经讨论过,当H函数可变时,前面给出的AStar算法伪过程存在问题,并且通过实际的例子证明了问题的存在。现在,让我们具体分析一下问题究竟出现在什么地方。

 

我们回顾一下AStar算法的证明过程,其中一个关键的过程在于结论2的得出。结论2的得出依靠引理3。如果H函数可变,那么引理3是不成立的。对于某个节点node而言,F(node)=G(node)+H(node)。如果H值不变,则当G值最小时F值最小。如果H函数可变,则当函数G函数最小时,对于当前的H值来说是最小的F值。可是如果后面H值变了,则对于某个稍大的G值而言,所得的F值可能会小于之前那个F值。
我们来看看注意点7的过程和图2。

                      图2

 

开始的H值为:H(A)=-100,H(C)=40,H(end)=0。先扩展start节点然后是A节点。此时从start节点到A节点的路径值G(A)=100,F(A)=0,此时A的F值并不是最小值。如果H函数值不变,则扩展C节点时会再次计算A节点的F值,因为G(A)=30,则F(A)=-70,此时根据引理3,该G(A)为最小值,对应的F值是最小值。可是H函数值可变,当G(A)达到最小值时,H(A)变成了20远大于之前的H值-100,使得尽管G值达到最小,但是对应的F值并没有达到最小,根据AStar算法,不会进行更新,使得从start到A的路径没有更新成从start到C到A。


我们现在对算法作出修改,在原始的算法中,注意注释中的程序注意点1和程序注意点2,比较都是基于F值进行比较,现在我们对这两处作出修改,比较基于G值进行。


作出了修改以后,引理3就不存在了。因为比较基于G值进行比较,G(S1)= Pstp (start-S1)是最小值,设定此时的F值为F1,根据修改过的AStar算法,此时节点S1的F值不会改变。并且因为H(S1)<=β(S1),F1<= Pstp (start-S1)<=N<M。至此,结论1仍然成立。
现在我们假设节点Sm以最小的G值进行了扩展,1<=m<=k,G(Sm)= Pstp(start-Sm),此时对应的F值是Fm。下面看看节点Sm+1。如果m=k,那么Sm+1就是end节点。
扩展Sm节点时,因为Sm+1节点是其后继节点,则计算Sm+1节点的F值为F(Sm+1)=G(Sm+1)+H(Sm+1)=G(Sm)+w(Sm,Sm+1)+ H(Sm+1)。因为G(Sm)= Pstp(start-Sm)。因为Sm节点以及Sm+1节点都是最短路径stp上的节点,很显然,Pstp(start-Sm)+w(Sm,Sm+1)= Pstp(start-Sm+1)。因此,F(Sm+1)= Pstp(start-Sm+1)+ H(Sm+1)<=N<M。令此时的F值为Fm+1。至此结论2仍然成立。
结论1和结论2仍然成立。和上面的证明相同的过程,可以得出算法的正确性。
现在将修改过的算法伪过程列出来:

 

struct Node{
    int g;   //该节点的g值
    int h;   //该节点的h值
    int f;   //该节点的f值
    Node* pre;  //该节点的前驱节点
};


AStar_Search(){
    struct  Node  start_node;
    start_node.g = 0;
    start_node.h = H(start);
    start_node.f = start_node.h;
    start_node.pre = NULL;

 

    OPEN链表 = [start_node]; CLOSE链表 = [];

 

    while ( OPEN链表非空 ) {

        如果H函数发生了变化,更新OPEN链表中的Node结构的h和f属性


        从OPEN链表中取得F值最小的Node,称之为x_node,对应的节点称之为为x;
        从OPEN链表中删除x_node;

 

        if (x是end节点){
            根据每个节点对应的node结构的pre指针,返回路径;
        }

 

        for (x的每一个后继节点y){
            struct  Node  y_node;
            y_node.g = x_node.g+w(x,y);
            y_node.h = H(y);
            y_node.f = y_node.g+y_node.h;
            y.pre = x_node;

 

            if( y不在OPEN表 and 不在CLOSE表中){
                把y_node放到OPEN表中;
            }else  if( y在OPEN表中){
                取出OPEN表中的y节点对应的Node结构,称之为y_open;

 

                if( y_node.g小于y_open.g) {               //程序注意点1
                    y_open.g=y_node.g;
                    y_open.h=y_node.h;
                    y_open.f =y_node.f;
                    y_open.pre = y_node.pre;
                }
            }else{              //y在CLOSE表中
                取出CLOSE表中的y节点对应的Node结构,称之为y_close;


                if(y_node.g小于y_close.g){              //程序注意点2
                    将y_close从CLOSE链表中删除
                    把y_node放到OPEN表中;
                }
            }
        }  //end  for

 

        将x_node放入到CLOSE表中;


    }    //end  while
}    // end  AStar_Search

  

H函数毕竟是一个估计函数,随着算法的进行,有可能对节点的H值进行更新以更准确的反映出节点到终点的最短路径值。因此,这里对算法的修改会具有某些实际意义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最短路径算法之AStar算法(四) 可变H函数 的相关文章

  • 飞astar避障的时候点了目标点但是没有规划路径可能就是目标点有障碍物,认为不可到达。

    飞astar避障的时候点了目标点但是没有规划路径可能就是目标点有障碍物 xff0c 认为不可到达 https gitee com maxibooksiyi Prometheus blob v1 0 stable Modules planni
  • 最短路径算法之AStar算法(三) 《A* Pathfinding for Beginners》一文中的两个问题

    现在 xff0c 看看网上流传的很广的一篇文章 A Pathfinding for Beginners xff0c 经典的A STar算法的入门文章 xff0c 也是我前面推荐的阅读文章 个人认为 xff0c 这篇入门文章的算法不能找出最短
  • 最短路径算法之AStar算法(四) 可变H函数

    前面的文章已经讨论过 xff0c 当H函数可变时 xff0c 前面给出的AStar算法伪过程存在问题 xff0c 并且通过实际的例子证明了问题的存在 现在 xff0c 让我们具体分析一下问题究竟出现在什么地方 我们回顾一下AStar算法的证
  • Astar算法

    1 什么是Astar算法 xff1f Astar算法是一种图形搜索算法 xff0c 常用于寻路 它是个以广度优先搜索为基础 xff0c 集Dijkstra算法与最佳优先 best fit 算法特点于一身的一种算法 它通过下面这个函数来计算每
  • PHP 中的 A* 搜索算法 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有没有人有实施A 算法在 PHP 中 我知道维基百科有一个伪代码和一个 C 伪代码的链接 但我似乎找不到已经用 PHP 编写的伪代码 我也在寻找一种高效的书面 A 算法 None
  • 寻找 A* 算法的启发式有哪些好方法?

    您有一张方形图块地图 您可以在其中向 8 个方向中的任意方向移动 鉴于您有名为的函数cost tile1 tile2 它告诉您从一个相邻图块移动到另一个图块的成本 您如何找到既可接受又一致的启发式函数 h y goal 给定此设置 寻找启发
  • A* 算法:封闭列表包含太多元素/太大

    我目前正在 JavaScript 中实现 A 算法 但是 我遇到了一个问题 我的 closeList 似乎太大了 这是输出的屏幕截图 什么可能导致这个问题 我的启发式计算错误吗 Node prototype getHeuristic fun
  • 曼哈顿距离 A*

    我正在使用 A 搜索算法并使用曼哈顿距离作为启发式来实现 NxN 谜题求解器 我遇到了一个好奇的问题bug 我无法理解 考虑这些谜题 0 元素是空白 最初的 1 0 2 7 5 4 8 6 3 goal 1 2 3 4 5 6 7 8 0
  • 无法在java中实现A Star

    我一整天都在尝试让这个算法启动并运行 但我一辈子都做不到 我在网上阅读了很多教程 以及 AS3 javascript 和 C 的源代码 但我无法将我所看到的内容适应我自己的代码 我创建了一个 AStar 类 它有一个名为 Node 的嵌套类
  • 使用 A* 的启发式方法来查找增益最高的路径

    假设我想改变 A 中的逻辑 试图找到最有用的路径 即增益最高的路径 而不是找到最短路径 即成本最低的路径 就我而言 目标并不固定为唯一的结束节点 节点定义为具有距离的任何节点B从起点开始 在普通版本 找到最短路径 中 我需要不要高估成本 即
  • 如何使用A*算法找到最佳的3条路线

    在 A 中 通常您得到的结果只是一条路径 对于给定的出发地和目的地 是否有可能根据 A 有 3 条推荐路径 所以第二个返回的是第二最佳路径 第三个返回的是第三最佳路径 我正在考虑也许以某种方式修改启发式以反映第二和第三最佳路径 你们觉得怎么
  • Astar 可以多次访问节点吗?

    我一直在阅读维基百科的 Astararticle 在他们的实现中 他们检查每个节点是否在closed设置 如果是这样 他们会跳过它 是不是有可能 如果启发式是可以接受的 但是NOT一致 我们可能需要重新访问一个节点两次 或更多次 才能改进它
  • A*,开放列表的最佳数据结构是什么?

    免责声明 我真的相信这不是类似问题的重复 我读过这些内容 他们 大多数 建议使用堆或优先级队列 我的问题更多的是 我不明白这些在这种情况下如何运作 简而言之 我指的是典型的 A A star 寻路算法 如维基百科上所述 例如 https e
  • 通过四维数据寻路

    问题是找到飞机穿过四维风 不同高度的风 并且随着飞行而变化的风 预测风模型 的最佳路线 我使用了传统的 A 搜索算法 并对其进行了修改 使其能够在 3 维和风向量中工作 它在很多情况下都有效 但速度非常慢 我正在处理大量数据节点 并且不适用
  • A* 用于寻找最短路径并避开障碍物

    我必须获得二维两点之间的 最短 最佳 距离 我必须避免可能连接在一起的线条形状 关于如何表示我可以行驶的节点有什么建议吗 我曾想过制作一个网格 但这听起来不太准确或优雅 如果一条线的任何点位于正方形内 该节点是正方形的中心 我会认为该节点不
  • 最快的跨平台 A* 实施?

    有这么多可用的实现 使用小网格的 C 执行速度最快 CPU 占用最少 二进制文件最小 跨平台 Linux Mac Windows iPhone A 实现是什么 实施 谷歌返回 http www heyes jones com astar h
  • 当网格地图中有多个目标时,如何设计A*的启发式?

    我面临一个问题 我必须使用 A 来搜索地图 并且该地图中有多个目标需要达到 我的目标是扩展地图中的最少节点 关于如何设计这个 A 算法的启发式有什么想法吗 谢谢 假设 多个目标 是指您想要实现的目标any one 只需取所有启发式中的最小值
  • 明星算法:距离启发式

    我正在使用 A 星算法 如此处所示 取自http code activestate com recipes 578919 python a pathfinding with binary heap http code activestate
  • 路径未到达我的 A* 算法中的结束节点

    继从如何在大空间范围内加速最小成本路径模型 https stackoverflow com questions 23202199 how to speed up least cost path model at large spatial
  • 为什么A*的复杂度在内存中是指数级的?

    维基百科关于 A 复杂度的说法如下 链接在这里 http en wikipedia org wiki A search algorithm 比当时更成问题 复杂度是A 的内存使用量 在 最坏的情况 也必须记住 指数数量的节点 我不认为这是正

随机推荐

  • 弱网络环境模拟--树莓派搭建ATC

    弱网络环境模拟 树莓派搭建ATC 1 硬件和系统2 搭建过程3 遇到的问题1 Failed to start hostapd service Unit hostapd service is masked2 django python版本问题
  • OpenCV双目相机测距程序

    本文主要分享一个双目测距的实现程序 xff0c 用的bumblebee2相机 使用的OpenCV自带的BM算法 在OpenCV3中 xff0c StereoBM算法发生了比较大的变化 xff0c StereoBM被定义为纯虚类 xff0c
  • stm32 printf 串口输出

    在使用STM32调试时 xff0c 经常使用串口发送信息 xff0c 为了方便调试与串口发送信息 xff0c 用printf xff08 xff09 函数实现通过串口打印信息 1 添加包含printf xff08 xff09 函数的头文件
  • 【slighttpd】基于lighttpd架构的Server项目实战(7)—http-parser

    对于http服务器 xff0c http request的解析是比较麻烦的 xff0c 由于我们的重点并不在这上面 xff0c 所以这一部分不打算自己编写 xff0c 而是使用开源的http parser库 xff0c 下面我们将使用该库来
  • C#实现以图搜图

    朋友们 xff0c 如需转载请标明出处 xff1a http blog csdn net jiangjunshow 前言 最近在逛淘宝时发现了淘宝的图片搜索功能 xff0c 可能是我太Low了这个技术点已经实现很长时间了 想想自己能不能实现
  • 床长人工智能教程 - 前言

    朋友们 如需转载请标明出处 xff1a http blog csdn net jiangjunshow 人工智能被认为是一种拯救世界 终结世界的技术 毋庸置疑 xff0c 人工智能时代就要来临了 xff0c 科幻电影中的场景将成为现实 xf
  • 如何做接口测试呢?接口测试有哪些工具【小白都会系列】

    回想入职测试已经10年时间了 xff0c 初入职场的我对于接口测试茫然不知 后来因为业务需要 xff0c 开始慢慢接触接口测试 从最开始使用工具进行接口测试到编写代码实现接口自动化 xff0c 到最后的测试平台开发 回想这一路走来感触颇深
  • C++有限状态自动机解析HTTP协议

    一 HTTP请求报文格式 HTTP请求报文主要由四部分组成 xff0c 分别为请求头 请求行 空行 请求体 xff1b 请求方法 请求方法包括GET HEAD PUT POST TRACE OPTIONS DELETE等 xff1b xff
  • 解析URL

    简介 在github有轮子http parser解析器 小的就不再造轮子了 xff0c 哈哈 xff08 造这个轮子真不是一时半会的事 xff09 目前该解析器用于nodejs的http解析 xff0c 另还有大家熟知的tcpflow 以及
  • ubuntu 串口调试助手

    ubuntu 下的串口调试助手推荐有两个 PuTTY 和 CuteCom PuTTY 除了串口通讯功能外还有 SSH 和 Telnet 等功能 CuteCom 只能用于串口通讯 但串口界面更友好 安装串口工具 ubuntu 标准安装源中包含
  • 数据的存储(1):字节序与比特序

    前言 在计算机的发展过程中 xff0c 由于不同硬件体系在数据高低有效位及存储方式理解上的差异 xff0c 出现了大端和小端这两种截然相反的对数据的位进行解释的模式 大小端模式本身没有优劣之分 xff0c 但我们在开发过程中 xff0c 需
  • [C/C++后端开发学习] 11 实现一个简单的HTTP服务器

    文章目录 实现GET方法约定GET时URI的格式状态机与websocket协议兼容实现几个辅助函数GET请求一个html页面 一张图片或一个PDF文件 实现POST方法实现一个简单的服务框架POST请求报文处理的代码块POST响应报文处理的
  • C++ Primer Plus习题及答案-第六章

    习题选自 xff1a C 43 43 Primer Plus 第六版 内容仅供参考 xff0c 如有错误 xff0c 欢迎指正 1 简单文件输入 输出 xff08 写入到文本文件中 xff09 对于文件输入 xff0c C 43 43 使用
  • 航模电池-LiPo锂聚合物电池(未完待续)

    一 外形 1 一般有几个电芯 xff0c 就是几 S xff0c 比如三个电芯就是3S 2 从电池上 xff0c 会引出两组导线 xff0c 一组细的 xff0c 一组粗的 细的一组 xff0c 由一根红线和若干根黑线组成 xff0c 最前
  • visual studio 编译C++程序,加快编译速度

    网上很多有关于选择预编译选项出现 xff0c fatal error C1083 无法打开预编译头文件 pch No such file or directory xff0c 这样的错误 xff0c 好多人会选择直接不使用预编译选项 如果工
  • C++中标准名称空间出错(cout,cin,endl是一个未知标识符)

    相信有很多小伙伴刚刚学习C 43 43 都有出现cout cin endl为未知标识符 原因是 xff1a lt iostream gt 头文件没有namespace std库 解决方法有3种 xff0c 如下 方法1 xff1a 加 us
  • C++源文件编译过程

    对于C 43 43 源文件 xff0c 从文本到可执行文件一般需要四个过程 xff1a 预处理阶段 编译阶段 汇编阶段 链接阶段 预处理阶段 xff1a 对源代码文件中文件包含关系 xff08 头文件 xff09 预编译语句 xff08 宏
  • 最短路径算法之AStar算法(一) AStar算法的证明

    本文并不试图对A Star算法进行一个入门式的讲解 xff0c 因为光是那个讲解就有可能会占据很长的篇幅 xff0c 而且网上已经有讲解的文章 xff0c 讲的肯定比我好 所以 xff0c 本文是面向已经对A Star算法有了一定了解的人
  • 最短路径算法之AStar算法(三) 《A* Pathfinding for Beginners》一文中的两个问题

    现在 xff0c 看看网上流传的很广的一篇文章 A Pathfinding for Beginners xff0c 经典的A STar算法的入门文章 xff0c 也是我前面推荐的阅读文章 个人认为 xff0c 这篇入门文章的算法不能找出最短
  • 最短路径算法之AStar算法(四) 可变H函数

    前面的文章已经讨论过 xff0c 当H函数可变时 xff0c 前面给出的AStar算法伪过程存在问题 xff0c 并且通过实际的例子证明了问题的存在 现在 xff0c 让我们具体分析一下问题究竟出现在什么地方 我们回顾一下AStar算法的证