在设计基于地图的游戏,特别是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. [转载]Unity3D的断点调试功能

    断点调试功能可谓是程序员必备的功能了.Unity3D支持编写js和c#脚本,但很多人可能不知道,其实Unity3D也能对程序进行断点调试的.不过这个断点调试功能只限于使用Unity3D自带的MonoD ...

  2. PAT-乙级-1006. 换个格式输出整数 (15)

    1006. 换个格式输出整数 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们用字母B来表示“百” ...

  3. The 11th Zhejiang Provincial Collegiate Programming Contest->Problem G:G - Ternary Calculation

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3782 题意:把输入的三元运算用计算机运算出来. ;          ci ...

  4. 分析jQuery中的each方法

    在看jQuery源码是怎么实现each方法之前,我们看一下js的原生实现. ECMAScript 5为数组定义了一个forEach方法,该方法接受两个参数:第一个参数是要在每一个数组项上运行的函数,第 ...

  5. jquery 请求jsp传递json数据的方法

    $(function() { $("a[name=hrefID]").click(function() { var id = $(this).attr("id" ...

  6. HDU4647+贪心

    /* 贪心. 题意:给定一些点 一些边 点和边都有价值.现在A B 选点.求A-B的maxVal 思路:分割边.边的1/2分给两个端点. 如果这两个点被同一个人取,则ok:否则 做减法也行,对题意无影 ...

  7. linux 使用文本编辑器编写shell脚本执行权限不够

    在linux下,自己编写的脚本需要执行的时候,需要加上执行的权限 解决方式:chmod 777 test.sh

  8. JixiPix 各种图像软件,很不错的说,还有affinity designer

    http://jixipix.com/purchase.html https://www.board4allcz.eu/showthread.php?t=639107 https://affinity ...

  9. 动态改变QSS

    通常,一旦设置使用setObjectName来初始设置QSS: list_widget = new QListWidget(); list_widget->setObjectName(" ...

  10. 208. Implement Trie (Prefix Tree)

    题目: Implement a trie with insert, search, and startsWith methods. 链接: http://leetcode.com/problems/i ...