A star算法

1. 算法的理解

1.2 a 星算法的基本的原理

a 星 是一种启发式搜索算法, 用于在地图中的两个目标点之间寻找最短的路径,它结合了最优先搜索和Dijkstra算法的特点,通过考虑从起点到当前点的距离(或者代价 g(n) ) 和估算的从当前点到目标点的最短距离(启发式估计h(n) )来进行,算法为图中每一个节点维护一个值 f(n) = g(n) + h(n),它代表了从起点经过节点n 到达目标点的估计成本 ,在搜索过程中,a 星算法会优先选择扩展f(n) 值最小的点,这有助于它高效的找到最短路径 。

1.2 a 星算法如何在效率和准确性之间权衡?

主要取决于额启发式函数h(n) , 在cost :f(n) = g(n) + h(n) 如果对

  • 启发式估计h(n)总是低估从任意节点到目标节点的实际成本,那么可以保证找到最短路径
  • 启发式估计h(n)很大,能更快的找到目标, 但路径可能不是最优的
  • 启发式估计h(n)过小或者小于0 ,那么a 星会退化成DijKstra算法,效率低但是可以找到确保找到最短路径。

因此启发式函数的选择需要在搜索效率和路径优化度之间做出权衡 。

1.3 a 星算法中常用的启发式函数

  • 曼哈顿距离(Manhattan Distance) : 其中移动仅限于水平和垂直方向,启发式计算的是两点在各轴上的差值的绝对之和
  • 欧几里得距离(Euclidean Distance):启发式是两点之间的直线距离
  • 对角线距离(Diagonal Distance): 移动可以是水平垂直以及对角线方向
  • 切比雪夫距离(Chebyshev distance):计算的是在任何方向上移动所需最大步数
cpp 复制代码
    switch (distance_norm)
    {
    case Euclidean:
        {
        double dx = abs((double)(start_index(0) - end_index(0)));
        double dy = abs((double)(start_index(1) - end_index(1)));
        double dz = abs((double)(start_index(2) - end_index(2)));
        h = std::sqrt((std::pow(dx,2.0) + std::pow(dy,2.0)+std::pow(dz,2.0)));
        break;}
    case Manhattan:
        {
        double dx = abs((double)(start_index(0) - end_index(0)));
        double dy = abs((double)(start_index(1) - end_index(1)));
        double dz = abs((double)(start_index(2) - end_index(2)));
        h = dx + dy + dz;
        break;}
    case L_infty:
        {
        double dx = abs((double)(start_index(0) - end_index(0)));
        double dy = abs((double)(start_index(1) - end_index(1)));
        double dz = abs((double)(start_index(2) - end_index(2)));
        h = std::max({dx,dy,dz});}
        break;
    case Diagonal:
        {
        double distance[3];
        distance[0] = abs((double)(start_index(0) - end_index(0)));
        distance[1] = abs((double)(start_index(1) - end_index(1)));
        distance[2] = abs((double)(start_index(2) - end_index(2)));
        std::sort(distance,distance+3);
        h = distance[0] + distance[1] + distance[2] +(std::sqrt(3.0)-3) * distance[0] + (std::sqrt(2.0)-2)*distance[1];
        break;}
    
    default:
        break;
    }

1.4 实现a星的数据结构

cpp 复制代码
#ifdef _Node_H_ 
#define _Node_H_ 

#include<iostream>
#include<ros/ros.h>
#include<Eigen/Eigen>
#include<Memory>


#define inf 1>>20 ; 
struct GridNode;
typedef std::shared_ptr<GridNode> GridNodePtr ; 

struct GridNode{
    int id_ ; 
    Eigen::Vector3d coord_ ; 
    Eigen::Vectros3i dir_ ; 
    Eigen::Vector3i index_ ; 

    double gScore_ ; 
    double fScore_ ; 

    GridNodePtr cameFrome_ ; 

    std::multimap<double , GridNodePtr> ::iterator nodeMapIt ;  

    GridNode(Eigen::Vector3i index , Eigen::Vector3d coord)
    {
        id_  = 0 ; 
        coord_ = coord  ; 
        index_ = index  ; 

         gScore = inf ; 
         fScore  = inf ; 

    cameFrome_  = nullptr ; 
    }

    ~GridNode() ;
    GridNode() ;

}
#endif
相关推荐
笔画人生19 小时前
进阶解读:`ops-transformer` 内部实现与性能调优实战
人工智能·深度学习·transformer
池央19 小时前
CANN oam-tools 诊断体系深度解析:自动化信息采集、AI Core 异常解析与 CI/CD 流水线集成策略
人工智能·ci/cd·自动化
CV@CV19 小时前
2026自动驾驶商业化提速——从智驾平权到Robotaxi规模化落地
人工智能·机器学习·自动驾驶
财经三剑客19 小时前
AI元年,春节出行安全有了更好的答案
大数据·人工智能·安全
赛姐在努力.19 小时前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
艾莉丝努力练剑19 小时前
图像处理全栈加速:ops-cv算子库在CV领域的应用
图像处理·人工智能
tq108619 小时前
AI 时代的3类程序员
人工智能
island131419 小时前
CANN ops-nn 算子库深度解析:核心算子(如激活函数、归一化)的数值精度控制与内存高效实现
开发语言·人工智能·神经网络
骥龙19 小时前
第六篇:AI平台篇 - 从Jupyter Notebook到生产级模型服务
ide·人工智能·jupyter
TOPGUS19 小时前
谷歌SEO第三季度点击率趋势:榜首统治力的衰退与流量的去中心化趋势
大数据·人工智能·搜索引擎·去中心化·区块链·seo·数字营销