图论,导航图基础(c#版)

本文介绍了图论在计算机数据结构中的应用,重点探讨了无向稀疏连通图的实现,包括储存方式、算法提要、以及在游戏AI寻路中的应用。文章详细讲解了矩阵和邻接表的储存方法,以及如何优化存储以适应稀疏图,并提供了通用性的实现考虑。此外,还介绍了索引节点、图的顶点和边的概念,为后续的深度搜索、广度搜索和A*算法铺平道路。

前言

依然在公司实习,但是待在一个比较成熟的项目组(战地风暴invasion),没什么机会着手项目代码,只能拿着项目代码自己琢磨,学习,然后由于最近玩莉莉丝的art of conquest,被它的垃圾寻路气哭了,所以想自己写写寻路系统,此版本的代码是为了unity而设计的,但是其实因为unity有成熟的navigation插件,所以权当练手了。

图论基础

我们抛开图的数学理论不谈,在计算机数据结构中的图是一种树链的扩充结构,图的遍历和树非常相似,如果你对树或者链表算法非常熟悉,那么恭喜你,图的结构你也能很快熟悉。
常见图结构

1、储存方式

图的储存主流的有两种储存方式,一种是矩阵
这里写图片描述
如果你要使用矩阵,那么推荐你使用eigen作为c++的矩阵运算库

另一种是邻接表
这里写图片描述

其实这两种储存方式都不是最佳的,因为矩阵法储存了大量的0,对于边很少的图(稀疏图)造成了很大的浪费。而邻接表法每条边都储存了两次,所以在稠密图(边很多的图)中,有一半的空间都用来储存重复的边了。

算法提要

本系列主要研究的是游戏中的导航图,所以算法都是基于稀疏图。
主要有:深度搜索,广度搜索,A star,其他的算法会在后面补充

应用

导航图常见于AI算法中的寻路,以及基于导航图的行为树或者状态机


无向稀疏连通图的实现

通用性的考虑

为了提高算法的通用性,我们不使用c++中的指针来表示邻接表中的链式结构,而是通过储存数组,和数组索引的方法来获取元素,这样我们不仅很容易扩展到各种不可直接操作内存的语言中,而且这样也便于拷贝操作(直接拷贝数组),析构操作(直接施放数组)。

索引节点

为了将实体数据(比如unity中想将图实例化,我们需要存一些实体)和索引分开,我们需要有一种类,它不存放实体数据,其本身是一种索引,我们需要实体数据时,通过索引在实体表中寻找。

public cla
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值