A*简介

A*(A-Star)算法是一种启发式算法,是静态路网中求解最短路最有效的方法。公式表示为:f(n)=g(n)+h(n),

其中f(n) 是节点n从初始点到目标点的估价函数,

g(n) 是在状态空间中从初始节点到n节点的实际代价,

h(n)是从n到目标节点最佳路径的估计代价。

网上大量的A*算法教程都是将搜索区域分成无数个小方格,再分别从小方格的8个方向进行计算,如下图:

而我们熟悉的 Dijkstra 算法却是在点线图上进行计算的,这曾经让我一度以为方格图和点线图是这两者的区别之一,但实际应用中会因为各种各样的原因使用点线图,这就使我进行了进一步的学习,后来,我找了几段源码进行一段时间的学习,发现事实上并不是,这只是表现形式的不一样而已,两者的区别在于有没有估计值,即 Dijkstra 和 A* 的主要区别在于前者为后者h(n)=0时的特殊情况。下面是我学习后的理解,并且在实际开发中已经得到检验是可行的。

1、数据结构

  1)点

  id、坐标(x、y)

  2)线

  id、起点、终点、是否可逆(考虑单行线的情况)

2、搜索过程

(1)   设置路径起止点,例如黄色为起点,蓝色为终点;

(2)   定义类 queue (名称自定,下同),包含 distance、maxDistance、endNode、path,其中,distance 表示起点到当前点的前一点的路径值(这个真的没搞懂为什么是前一点,但事实证明就是前一点,囧),maxDistance表示当前点到终点的两点间距离值(公式中的估计值,可自己定义其他估计值)加上该点的 distance,endNote 表示目标点,path 则表示到目标点的路径(经过的点的集合);

(3)   定义queue的列表,记录遍历过程中的记录,并按照 maxDistance 从小到大排列;

(4)   将起点设为当前点,由点的连接线的 id 可以获得所有与该点相邻点的 id,则可知起点与 a、d 相邻,分别将 a 和 d 设为目标点(endNode),并将 a 点和 d 点的 queue 加入列表并将列表按 maxDistance 由小到大排序,若目标点除了前一点之外无任何相邻点,则将 maxDistance 设为 ∞;

(5)   取出列表中 maxDistance 最小的记录,将 endNode 设为当前点后重复步骤(4)-(5),直到endNode为蓝色点,即终点为止。

以上是我的学习结果,欢迎大家一起讨论······

点线图中的A*算法的更多相关文章

  1. 图中最短路径的算法--dijiska算法C语言实现

    #include <stdio.h> #include <stdlib.h> #define ERROR_NO_MEM -1 /*内存不足的错误码*/ #define MAX_ ...

  2. 如何看K线图基础知识

    在日K线图中一般白线.黄线.紫线.绿线依次分别表示:5.10.20.60日移动平均线,但这并不是固定的,会根据设置的不同而不同,比如你也可以在系统里把它们设为5.15.30.60均线. 你看K线图的上 ...

  3. 第六篇:R语言数据可视化之数据分布图(直方图、密度曲线、箱线图、等高线、2D密度图)

    数据分布图简介 中医上讲看病四诊法为:望闻问切.而数据分析师分析数据的过程也有点相似,我们需要望:看看数据长什么样:闻:仔细分析数据是否合理:问:针对前两步工作搜集到的问题与业务方交流:切:结合业务方 ...

  4. 箱线图(boxplot)简介与举例

    简述:   盒图是在1977年由美国的统计学家约翰·图基(John Tukey)发明的.它由五个数值点组成:最小值(min),下四分位数(Q1),中位数(median),上四分位数(Q3),最大值(m ...

  5. UOJ#373. 【ZJOI2018】线图 搜索,树哈希,动态规划

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ373.html 前言 真是一道毒瘤题.UOJ卡常毒瘤++.我卡了1.5h的常数才过QAQ Orzjry 标算居然是指数做法 ...

  6. R绘图 第六篇:绘制线图(ggplot2)

    线图是由折线构成的图形,线图是把散点从左向右用直线连接起来而构成的图形,在以时间序列为x轴的线图中,可以看到数据增长的趋势. geom_line(mapping = NULL, data = NULL ...

  7. PHP使用HighChart生成股票K线图详解

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...

  8. javascript实现有向无环图中任意两点最短路径的dijistra算法

    有向无环图 一个无环的有向图称做有向无环图(directed acycline praph).简称DAG 图.DAG 图是一类较有向树更一般的特殊有向图, dijistra算法 摘自 http://w ...

  9. 图中最短路径算法(Dijkstra算法)(转)

    1.Dijkstra 1)      适用条件&范围: a)   单源最短路径(从源点s到其它所有顶点v); b)   有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E ...

随机推荐

  1. Codeforces Round #334 (Div. 2) D. Moodular Arithmetic 环的个数

    D. Moodular Arithmetic Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/60 ...

  2. 【Android 应用开发】Android 开发环境下载地址 -- 百度网盘 adt-bundle android-studio sdk adt 下载

    19af543b068bdb7f27787c2bc69aba7f Additional Download (32-, 64-bit) Package r10 STL debug info androi ...

  3. log4net的应用

    1.下载log4net 2编写log4net的配置文件 <?xml version="1.0" encoding="utf-8" ?> <co ...

  4. rabbitmq——用户管理

    安装最新版本的rabbitmq(3.3.1),并启用management plugin后,使用默认的账号guest登陆管理控制台,却提示登陆失败. 翻看官方的release文档后,得知由于账号gues ...

  5. Computer skills one can learn within one day

    Computer related technical skills are usually thought as complicated and difficult to understand. It ...

  6. python之装饰器详解

    这几天翻看python语法,看到装饰器这里着实卡了一阵,最初认为也就是个函数指针的用法,但仔细研究后发现,不止这么简单. 首先很多资料将装饰器定义为AOP的范畴,也就是Aspect Oriented ...

  7. JavaFX(二)自定义窗口标题栏

    1.问题场景 PC客户端登录界面仿QQ,上边显示图片,下边显示输入框和登录按钮.而JavaFX默认的窗口,不满足需求. 2.解决思路 隐藏窗口默认的标题栏,使用创建label对象,使用css将按钮图片 ...

  8. Java中执行外部命令

    在项目中执行一个linux的shell脚本,于是需要在java环境下执行外部命令如系统命令.linux命令的需求,本人小小研究了一下,又上网查了一些资料先整理如下. java执行外部命令主要依赖两个类 ...

  9. Python 字典排序

    思路是把字典转为列表后再排序 d={'z':1,'y':2,'x':3} # 字典 s=d.items() # [('y', 2), ('x', 3), ('z', 1)] 列表 s.sort() # ...

  10. VMware系统运维(三 )SQL Server 2008 R2安装

    1. 点击"全新SQL Server 独立安装或向现有安装添加功能" 2.验证通过,点击确定. 3.输入数据库密钥,必须支持正版,不然微软打你屁屁,嘻嘻 4.不接受不让你过,所以不 ...