在设计基于地图的游戏,特别是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. 1206: [HNOI2005]虚拟内存 - BZOJ

    Description 操作系统中一种重要的存储管理技术就是虚拟内存技术.操作系统中允许进程同时运行,也就是并行.每个进程都有其相对独立的数据块(进程运行的过程中将对其进行读写操作).理想的情况下,这 ...

  2. js实现网页图片延时加载的原理和代码 提高网站打开速度

    有时我们看到一些大型网站,页面如果有很多图片的时候,当你滚动到相应的行时,当前行的图片才即时加载的,这样子的话页面在打开只加可视区域的图片,而其它隐藏的图片则不加载,一定程序上加快了页面加载的速度,对 ...

  3. Javascript字典操作

    <script type="text/javascript">        var dic = new Array();      //注意它的类型是Array    ...

  4. [转载]jquery获取元素索引值index()方法:

    jquery的index()方法 搜索匹配的元素,并返回相应元素的索引值,从0开始计数. 如果不给 .index() 方法传递参数,那么返回值就是这个jQuery对象集合中第一个元素相对于其同辈元素的 ...

  5. 打车APP可能的盈利模式

    贺滨,蓄力的芦苇 竺宇祺.郑子威.党培兵 等人赞同 按现在国内几十家类似start-ups的竞争态势看,嘀嘀现阶段应该还处于烧钱培育市场期. 斗胆想象一下可能的盈利模式: 前向收费(面向用户): 特权 ...

  6. HDU1353+贪心

    注意精度. /* */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<al ...

  7. OSharp框架总体设计

    OSharp框架解说系列(1):总体设计 〇.前言 哈,距离前一个系列<MVC实用构架设计>的烂尾篇(2013年9月1日)已经跨了两个年头了,今天是2015年1月9日,日期已经相映,让我们 ...

  8. Maven学习总结(四)——Maven核心概念

    一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Maven坐标主要组成 groupId:组织标识(包名) artifactId:项目名称 ver ...

  9. IntelliJ IDEA MyBatis插件安装

    打开IntelliJ IDEA工具,打开菜单File--> Settings 选择 Plugins,点击Browse repositories,在搜索框输入MyBatis.

  10. java去除重复的字符串和移除不想要的字符串

    在java开发中碰到了有些字符串是重复的,如果在进行业务处理要全部遍历太对的数据就会重复,所以在进行业务处理前进行一个去重操作. 这里由于业务需要所以先将字符串转化为string数组,使用split分 ...