《游戏人工智能中A*算法的应用研究》阅读笔记

2022-02-23
1.引言 随着上世纪六十年代出现的电子游戏至今,许多经典的、有趣的、质量极高的游戏呈现出现在了我们面前(如,坦克大战、马里奥、lol、艾尔登法环)毋庸置疑的,当一个游戏随之成长,那么玩家的体验也会提高,现在的游戏有着更真实的物理模拟引擎、绝美的画面、良好的互动以及逼真的人工智能(强调人工智能)所带给玩家的极佳沉浸感强调沉浸
正式开始
2.背景 今天我为大家来分享的是一篇由杭州电子科技大学研究生贾森浩所写的论文《游戏人工智能中A*算法的应用研究》,为该算法的优化提出一些建议
不管是在英雄联盟和人机的对战里,还是斗地主的 AI 托管里,在游戏中,人工智能的运用范围极广,但大家有没有想过,其实游戏中 NPC的自动寻路系统、亦是人工智能算法的一种体现
(寻路视频)
而寻路系统中,我们最常用的算法,其实就是 本文中提到的 A*路径搜索算法
3.A*算法 解决什么问题? ROS机器人:全局路径规划,根据给定的目标位置和全局地图进行总体路径规划。导航中使用 A*算法 计算出机器人到目标位置的最优路线,作为机器人的全局路线。
常用于游戏中的 NPC 的移动计算,或线上游戏的 BOT 的移动计算上。
(三国战纪 天剑狂刀)【3】
来历 其实游戏人工智能的路径搜索算法最早来源于简单 A*算法,由Peter Hart (需要其人照片及简单介绍)Peter E. Hart - Wikidata于 1968 年, 描述了该算法,其启发函数参考 Dijkstra算法,亦是对其的一种扩展,是一种高效的搜索算法。
BFS 虽然我们最熟悉的其实 BFS 。如果我们将一张图分成一个个小块,用二维数组来表示地图,那么广度优先算法实际上就是通过对图的遍历来找到最短路径
视频演示
但是,很明显 BFS也存在一定缺陷,就是在最坏的情况下,它要遍历所有的点或是大部分的点才能找到最短路径,这浪费了大量的时间和空间。所以我们利用贪心算法的思维给它加一个评估函数,来判断当先代价最小的路径,而这也是我们重点要介绍的 A*算法的核心思维。
原理 【《游戏人工智能中A*算法的应用研究》阅读笔记】视频演示
这是它的为伪代码:【3】

//FindPath do{ //确定中心搜索点,上一个中心点关闭,新的中心点开启 查找:Find the minimumm "point" of "F" from the "open_list" center; "now_point" = "min_point"; //minimumm point "now_point"添加到"close_list"; //新中心点的周围点开启,新中心点关闭 循环遍历:"now_point"相邻的周围8格"s_now_point"中的每一个; //这一块它指的就是now_point周围8点当前搜索点 s_now_point,为了简单直接用它表示 if (它不可通过||它已经在"close_list"中){ 什么也不做; } else if (它不在开启列表中){ 把它添加进"open_list"; 把"now_point"作为这它的"father",计算它的"F","G","H"; }else if (它已经在开启列表中){//通过G来判断是否需要更新 if (new_G < old_G){ 更新它的"father"为当前中心搜索点"now_point"; 更新它的"G"与"F" ; } else{ 不更新,保持原来的"father", "G"与"F" ; } } } while(目标格"end_point"已经在"open_list"||"open_list"==NULL) //存在路径:目标格"end_point"已经在"open_list" //不存在路径: "open_list"==NULL,搜索了所有可能的点

那么我从论文中找到了这张图方便大家理解【图2-8】
//图注:开启列表:存放着即将被访问当为被访问的点 ; 关闭列表:列表存放着已经完成的节点路径信息(包括节点的关键信息)//
缺点 开启链表的维护 在 A* 算法进行寻路搜索的过程中,每次都要从开启列 表中查找一个顶点,同时还会对该表有插入、删除、替换等操作,这些对表的操作都需要一定的时间。
但当游戏地图很小时,开启列表的维护是简单的,当当游戏地图很大有几百万、千万的时候 A*算法的维护就会变的困难。
启发函数的选择 如果启发函数算出大量的相同的路径长度时,如果每个都要再算一遍会浪费很多时间,其实只要选其中一条路径即可
对边缘不规则的障碍物进行寻路时,路径会产生锯齿形
甚至会出现下一步要搜索的店“穿过”障碍的情况
“多对一”的困难
当一个集群要寻找相同的目标点时,只能一个一个找他们的最短路径
改进 使用最小二叉堆来维护开启列表和关闭列表
开启列表的操作
  1. 不断循环的读入当前估价最好的节点,并将之删除
  2. 访问相邻节点时,检查此点是否在表中,
  3. 如果在表中,且此次估价要比表内估价好,则替换表内估价和关键信息
  4. 访问新的临接节点,并插入表中
    二叉堆1.性质
    1、完全二叉树 2、父节点的值总是比子节点要大(或小)

    2.操作(以【图-3】为例)
    1、插入 2、删除

    启发函数优化
【1】A*算法入门 . 极限定律 . 2009-04-191.
【2】A*寻路算法详解 #A星 #启发式搜索 . 奇乐编程学院 . 2020-09-30
【3】A*算法 . Clark-dj . 2020-11-17
【4】Introduction to the A* Algorithm (redblobgames.com)

    推荐阅读