前言
依然在公司实习,但是待在一个比较成熟的项目组(战地风暴invasion),没什么机会着手项目代码,只能拿着项目代码自己琢磨,学习,然后由于最近玩莉莉丝的art of conquest,被它的垃圾寻路气哭了,所以想自己写写寻路系统,此版本的代码是为了unity而设计的,但是其实因为unity有成熟的navigation插件,所以权当练手了。
图论基础
我们抛开图的数学理论不谈,在计算机数据结构中的图是一种树链的扩充结构,图的遍历和树非常相似,如果你对树或者链表算法非常熟悉,那么恭喜你,图的结构你也能很快熟悉。
1、储存方式
图的储存主流的有两种储存方式,一种是矩阵
如果你要使用矩阵,那么推荐你使用eigen作为c++的矩阵运算库
另一种是邻接表
其实这两种储存方式都不是最佳的,因为矩阵法储存了大量的0,对于边很少的图(稀疏图)造成了很大的浪费。而邻接表法每条边都储存了两次,所以在稠密图(边很多的图)中,有一半的空间都用来储存重复的边了。
算法提要
本系列主要研究的是游戏中的导航图,所以算法都是基于稀疏图。
主要有:深度搜索,广度搜索,A star,其他的算法会在后面补充
应用
导航图常见于AI算法中的寻路,以及基于导航图的行为树或者状态机
无向稀疏连通图的实现
通用性的考虑
为了提高算法的通用性,我们不使用c++中的指针来表示邻接表中的链式结构,而是通过储存数组,和数组索引的方法来获取元素,这样我们不仅很容易扩展到各种不可直接操作内存的语言中,而且这样也便于拷贝操作(直接拷贝数组),析构操作(直接施放数组)。
索引节点
为了将实体数据&