在设计基于地图的游戏,特别是isometric斜45度视角游戏时,几乎必须要用到最短路径算法.
Dijkstra算法是寻找当前最优路径(距离原点最近),如果遇到更短的路径,则修改路径(边松弛). 
Astar算法基于Dijkstra算法, 可以理解成, 优先寻找离终点的直线距离最近的路径.(距离原点近且距离终点也近)

1. 地图建模
首先要对地图建模,把地图抽象成图,图由点和有向边表示.
对45度瓦块地图建模,以每个瓦块的中心是一个点,每个瓦块有8条边,指向相邻的8个瓦块.
(由于边可以由节点算出来,所以为了节省内存,可以不保存边的数据结构)

2. 基础数据结构
实现Dijkstra算法,要用到以下3个数据结构

vector<const Edge*> _shortestPathTree; // 最短路径树
最短路径树SPT的key是节点id,value是该节点的一条入边.由入边可以找到该节点的上一个节点.
SPT表示图上起点到任意点的最短路径.

vector<const Edge*> _searchFrontier; // 当前的搜索边界
搜索边界SF的key是节点id,value是该节点的一条入边.
SF表示当前需要考虑的边(节点),由于Dijkstra是贪心算法,所以需要把范围限定在SF寻找局部最优解.

优先队列PQ
PQ作为SF的辅助数据结构,放入(修改)SF中的点也放入(修改)PQ,
PQ为这些点排序(距原点的代价从小到大). 当边松弛时,调整PQ里的排序.
优先队列的数据结构以后写日志介绍.

vector<double> _costs; // 到每个节点的cost
代价COSTS的key是节点id, value是从原点到该点的代价.

3. 算法步骤
(1) 原点O放入SPT,然后O的所有出边(点)都放入SF
(2) 找到SF上距离O最近的点N(通过PQ)
(3) 遍历N的每条出边E指向的点P
(4) 如果P不在SF上,则把<P,E>加入SF
(5) 如果P在SF上且OP新的代价小于老的代价,则修改SF(边松弛)
(6) 重复(2)-(5)直到把目标放入SPT.

4. A*
A*算法完全基于Dijkstra算法.
只是PQ的排序不是按照当前节点到原点的实际代价_costs
而是按照当前节点到原点的启发式代价_fCosts
假设点N到原点的实际代价是_costs[N]
则有4种常用方法计算_fCosts
(1) 直线距离启发因子 
_fCosts[N] = _costs[N] + distance(N, O)
(2) 有噪声的直线距离启发因子
 _fCosts[N] = _costs[N] + distance(N, O) * random()
(3) 退化成Dijkstra算法的启发因子 

_fCosts[N] = _costs[N] + 0
(4) Manhattan启发因子(在瓦块地图游戏中效果最好)
 _fCosts[N] = _costs[N] + |position(N-O).x| + |position(N-O).y|

最短路径算法Dijkstra和A*的更多相关文章

  1. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  2. 有向有权图的最短路径算法--Dijkstra算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

  3. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

  4. 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson

    根据DSqiu的blog整理出来 :http://dsqiu.iteye.com/blog/1689163 PS:模板是自己写的,如有错误欢迎指出~ 本文内容框架: §1 Dijkstra算法 §2 ...

  5. 最短路径算法——Dijkstra算法

    在路由选择算法中都要用到求最短路径算法.最出名的求最短路径算法有两个,即Bellman-Ford算法和Dijkstra算法.这两种算法的思路不同,但得出的结果是相同的. 下面只介绍Dijkstra算法 ...

  6. 最短路径算法——Dijkstra算法与Floyd算法

    转自:https://www.cnblogs.com/smile233/p/8303673.html 最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1    ADE:2  ...

  7. 最短路径算法-Dijkstra

    Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...

  8. 单源最短路径算法---Dijkstra

    Dijkstra算法树解决有向图G=(V,E)上带权的单源最短路径问题,但是要求所有边的权值非负. 解题思路: V表示有向图的所有顶点集合,S表示那么一些顶点结合,从源点s到该集合中的顶点的最终最短路 ...

  9. 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)

    Dijkstra算法 ———————————最后更新时间:2011.9.25———————————Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径. ...

随机推荐

  1. iOS sqlite 增删改查 简单封装(基于 FMDB)

    /** *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * *  基于 FMDB * *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...

  2. 自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选&多选下拉框

    先说点闲话,熟悉Angular的猿们会喜欢这个插件的. 00.本末倒置 不得不承认我是一个喜欢本末倒置的人,学生时代就喜欢先把晚交的作业先做,留着马上就要交的作业不做,然后慢悠悠做完不重要的作业,卧槽 ...

  3. NIO的Selector

    参考自 Java NIO系列教程(六) Selector Java-NIO-Selector java.nio.channels.Selector NIO新功能Top 10(下) 出发点: 如何管理多 ...

  4. 动态链接库中分配内存引起的问题-- windows已在XX.exe中触发一个断点

    动态链接库中分配内存引起的 本文主要是探讨关于在动态链接库分配的内存在主程序中释放所产生的问题,该问题是我在刚做的PJP工程中所遇到的,由于刚碰到之时感动比较诡异(这也是学识不够所致),所以将它写下来 ...

  5. jvisualvm 使用

    和jconsole侧重于内存分析和检测不同,jvisualvm在线程分析方面更强大一些,下面简单介绍下使用: 1. 在要监控的java应用配置文件中,本例是apache-jmeter/bin/jmet ...

  6. 【前端学习】【CSS选择器】

    CSS选择器     CSS选择器 CSS(Cascading Style Sheets)是一项出色的技术,它使得网页的结构和表现样式完全分离.利用CSS选择器能轻松地对某个元素添加样式而不改动HTM ...

  7. AD15高版软件卡不卡,问题解决大讨论

    AD高版软件很卡(包括13 14 15版),这是我遇到过的问题,大家都遇到过的问题, 这里我分享一个解决办法:也请给位有什么好的方法也一起分享. 问题1卡:打开AD15软件, 按住鼠标中键 放大 或 ...

  8. 173. Binary Search Tree Iterator

    题目: Implement an iterator over a binary search tree (BST). Your iterator will be initialized with th ...

  9. linux系统相关的任务[fg、bg、jobs、&、ctrl + z]

    转自: http://blog.chinaunix.net/space.php?uid=20697318&do=blog&id=1891382 fg.bg.jobs.&.ctr ...

  10. 拔高你的Java代码质量吧:推荐使用枚举定义常量(转)

    提高你的Java代码质量吧:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一 ...