基于A_算法的游戏地图最短路径搜索

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2
2.1
Heuristics 启发式
启发函数 启 发 函 数 h (n) 给 A* 一 个 从 任 意 节 点
n 到目标节点的最小花费时间的估计值, 选择一 个好 的启 发函数 是非 常重要 的, 因 为启 发 式 函 数 能 够 控 制 A* 算 法 的 行 为 。 (1)极 端 情 况 下 , 如果 h (n)= 0, f 则 (n) (n) =g +0=g (n), 么 只 有 g 那 (n)起 作 用 , A* 算 法 就 变 成 了 Dijkstra 算 法 ,这 可 以 确 保找 到 最 短 路 径 。 (2) 果 h n) 是 小 于或 等 于 从 n 到 如 ( 总 目标 的 实 际 花 费 ,那 么 A* 算 法 就 能 确 保 找到 最 短 路 径 。h(n) 的 值 越 小 , 算 法 要 A* 扩展 的 节 点 就 越 多 , 法 就 越 慢 。 算 (3) 果 h n) 值 恰 好 等 于 从 节点 n 如 ( 的 到目 标 节 点 的 确 切 时 间 花 费 ,那 么 A* 算 法就仅扩展最优路径上的节点而不会扩 展其 它 任 何 节 点 , A* 算 法 十 分 迅 速 。 使 虽 然不能 总是 遇到 这种情 况, 但我 们可 以在 某些 特殊 的情 况下 使 h n) ( 更加 精确 , 要知 道 h n) ( 提供的 信息越精确 , A*算法 就会越 完美 。 (4) 时 如 果 h n) 从节 点 n 到 目 标 有 ( 比 节点 的 实 际 花 费 要 大 ,那 么 A* 算 法 不 能 保证 找 到 的 使 最 短 路 径 ,但 是 A* 算 法 运 行的 比 较 快 。 (5) 一 种 极 端 情况 , 果 h 另 如 (n) 对 相 于 g n) 常 大 , 么 只 有 h n) 作 用 , ( 非 那 ( 起 这 时 A* 算 法 就 近乎 于 BFS 算法 。 因 此 ,我 们 选 择 A* 算 法 将 能 以 尽 可 能快 的 速 度 获 得 最 短 路 径 。 如 果 h (n)过 小 , 们仍能得到最短路径, 速度会很 我 但 慢; 如 果 h n) 大 , 们 就 得 不 到 最 短 而 ( 过 我 路径 ,但 A* 算法 会 运 行 得 很 快 。 在 游 戏 中, 算 法 的 这 种 属 性 非 常 有 用 。 如 在 A* 例 某些情 况下 , 会发 现你想 得到 的是 一条 你 相对好的路径而不是一条最佳路径。因 此, g n) h n) 间 做 出 权 衡 , 们 就 在( 和( 之 我
它节点。 (3) 到 步 骤 跳 (2) 继 续 循环 , 到 找 , 直 到解或无解退出。 1.3 数据结构 (1) 索 树 结 构 搜 根节点为开始节点, 节点为空, 父 在 到 达目标 节点 后, 从目 标节 点回溯 到根 节 点, 遍历的节点就是最短路径。 所 typedef struct tree_node *TREE; struct tree_node { TREE parent ; 该 节 点 的 父 指 针 // int height ;// 该 节 点 在 搜 索 树 中 的 高 度 int tile ; n(x,y) 的 位 置 标号 // (y* 地 图 高 度 + x) } (2) OPEN 表 , CLOSED 表 OPEN 表 和 CLOSED 表 分 别 是 用 于 保 存未处理和已处理的节点的链表 typedef struct node_link *LINK; struct node_link { TREE node; 节 点 内 容 // int f; 估 价 函 数 // LINK next; 下 一 个 节 点 // } LINK open,close; (3) 价 函 数 (x, =g(x,) + h x, 估 f y) y ( y) 其 中 f 是 当 前节 点 (x, 的 估 价 函 数。 y)
0
前言
搜索 分为无 提示信 息搜索 (也 称盲目
h*(n) 为 节 点 n 到 终 点 的 实 际 距 离 , 而 使 从 得找到 的路 径为 最短路 径或 最优路 径。 在 保证 h(n)<=h*(n) 的前 提 下 ,(n) 的值 越 大 , h 则启发 信息 也越 大, 可以减 少搜 索过 程中 扩展 的 节 点 数 , 加快 搜 索 速 度 。 1.2 算 法 (1) 把起始节点 S 放到 OPEN 有序表中。 (2) 果 OPEN 表 为 空 , 失 败 退 出 , 如 则 无解 。 (3)从 OPEN 表 中 选 择 一 个 f 值 最 小 的节 点 n 。 (4) n 从 OPEN 表中移出, 把 放入 CLOSED 表 中 。 (5) 果 n 是 目 标 节 点 , 成 功 退 出 , 如 则 求得 一 个 解 ; 则跳 到 否 (6) 。 步 (6)扩 展 节 点 n,生 成 其 全 部 后 继 节 点。 对 于 n 的 每 个 后 继 节 点 m, 计 算 f (m) 。① 如 果 m 不 在 OPEN 表 和 CLOSED 表中 ,把 它 加 入 OPEN 表 中 ,给 m 加 一 指 向其 父 节 点 n 的 指 针 , 便 找 到 目 标 节 点 以 时记 住 解 答 路 径 ; 如 果 m 已在 OPEN 表 ② 中, 比 较刚 计 算 的(m) 值 和 该节 点 m 则 f 新 在表 中 的 (m) 值 , 果 (m) 值 较 小 , f 旧 如 f 新 表示 找 到 了 一 条 更 好 的 路 径 ,则 以此 新 f (m) 取 代 表 中 该 节 点 的(m) 值 , 节 值 f 旧 将 点 m 的 父 指 针 指 向 当 前的 n 节 点 , 不 是 而 指向它的历史父节点; ③如果 m 在 CLOSED 表中, 跳过该 节点 , 回 则 返 (6) 续扩 展其 继
搜 索) 有 提 示 信 息 和 (启 发 式) 搜索 [1]。 最 短路 径搜 索, 就是 根据游 戏地 图中 的地形 和 障 碍 ,寻 找 一 条 从起 点 到 终 点 的 最 近 、 最 直 接 的 路 径 的 算 法 。许 多 著 名 的 游 戏 均采 用了 该技术 , 如帝国 时代 和圣 剑英雄 传 等 。在 大 多 数 计 算机 教 材 中 , 径搜 索 路 算法 大多 建立在 数学 中图 的基础 上, 即图 是 由 边(edges)连 接 的 一 系 列 点 (vertices) 的集合。而在瓦片 (tiled) 戏 地 图 中 , 游 我 们可以把地图中的每个瓦片 (tile) 看作点, 并 且 邻 接 瓦 片 间 由 边(edge)连 接 。本 文 中,我们假设使用的都是这种二维栅格 (grid) title 游 戏 地 图 。 的 1968 年 , 们 提 出 了 A* 算 法 , 算法 人 该 结 合 了 像 BFS (Best-First-Seareh)的 启发 式 方 法 和 Dijkstra 算 法 的 形式 化 方 法 。 BFS 像 算法这样的启发式算法通常给你一种估 计的方式来解决问题而不能保证你得到 最优解。 A*算法却能够保证找到最短路径。
1 A*算法
1.1 思想 A* 算 法 把 OPEN 表 中 的 节 点 按估 价 函 数 f (n)=g (n)+h (n) 的 值 从 小 到 大 进行 排 序 , 所 有 的 搜 索 节 点 n, h (n)<=h*(n), 对 使
, 山东临 沂人, 硕士 , 究方向 为算 法设计 与分析 、 算机网 络技 术; 治华 研 计 顾 (1963 ) 男, , 湖北武 汉人, 硕士 , 汉理工 大 武 作 者简 介: 振兴 崔 (1983 ) 男, 学计算 机科 学与技 术学院 副教授 , 研究方 向为软 件工 程、 数据库 应用 技术。
所有 可 扩 展 的 结 点 展 开 ,而 是 利 用 估 价 函 数对 所 有 未 展 开 的 结 点 进 行 估 价 ,从 而 找 出最应该 被展开的 结点,将其展 开,直到找 到 目 标 结 点 为 止 。A* 算 法 的 实 现 难 点 在 建立 一 个 合 适 的 估 价 函 数 ,估 价 函 数 构 造 得越 准 确 , 则 A* 搜 索 的 时 间 越 短 , 而 建 然 立估价函 数还没有 严格的方 法可循,为此 , 下文 针 对 这 一 问 题 进 行 了 讨 论 。
算法与语言
基于 A*算法的游戏地图最短路径搜索
崔 振兴 , 顾治 华
(武汉理工大 学 计算机科学 与技术学院, 北 武汉 4300ห้องสมุดไป่ตู้3) 湖
摘 要: 介绍了常 用的搜索 算法思想 , 重点剖 析了采用 启发式 A*算法 实现大地 图与复杂 地形的最 短路径搜 索, 在对估 价函数特 性进行分 析的基础 上,讨论了它 的几个一 般构造原 则,并简要介 绍一些常 用的启发 函数。 关键 词: 短路径; 最 Dijkstra 算法; Best-First-Search; 算法; A* 启发函 数 中图 分类号: TP312 文献标识 码: A 文 章编号: 1672-7800(2007)09-0145-03
软 件导 刊・2007 ・ 月号 9
145
算法与语言
g x, 表 示 从 起 始 节 点 ( y) (start_x, start_y) 到 当前节点 (x, y)的 步 数 , 该 节 点 在搜 索 即 树 中 的 高 度 。h x, 是 从 节 点 ( y) (x, 到 目 y) 标节点 (end_x, end_y) 最短路径的估计代价。 (4) 路径 的 搜 索 过 程 可 以 描 述 如 下 : A_starSearch ) ( { OPEN=[ 起 始 节 点 ]; CLOSED=[]; While OPEN 表 非 空) ( { 从 OPEN 表 中 取 得 一 个 节 点 S,并 将 其 从 OPEN 表 中 删 除 if 是 目 标 节点) (S { 求 得 路 径 path, 返 回 路 径 path ; 并 } else { for(S 的 每 一 个 子 节 点 Y) { 根 据 估价 函 数 计 算 节 点 Y 的 估价 值 ; if 不 在 OPEN 表 和 CLOSED 表 中) (Y { if(Y 的估 价 值 小 于 OPEN 表 中 的估 价 值) 更 新 OPEN 表 中 的 估 价值 及 Y 的父 节 点; } else { if(Y 的 估 价 值 小 于 CLOSED 表 中的 估 价值) { 更 新 CLOSED 表 中的 估 价 值 ; 从 CLOSED 表 中 移 出 节 点 , 并放 入 OPEN 表 中 ; } } 将 节 点 S 插入 CLOSED 表 中 ; 按 估 价 值 将 OPEN 表 中 的 节 点 排 序 ; }//end for }//end else } end while }end function A* 算 法 其 实 是 在 宽 度 优 先 搜 索 的 基 础 上 引 入 了 一 个 估价 函 数 , 每 次 并 不是 把
可 以 改 变 A* 算 法 的 性 能 。 从 技 术 上 讲 , 果 h(n)>h*(n), 时 该 如 这 算 法 只 能 称 为 A 算 法 ,而 不 能 称 之为 A* 算 法 。然 而 , 本 文 中, 者 仍 称 之为 A* 在 作 算 法 , 为 它 们的 实 现 相 同 , 且 游 戏 编 因 而 程界并未严格区分它们。 2.2 构造启发函数时应考虑的因素 (1) 度 与 精 确 度的 权 衡 速 A* 算 法 这 种 基 于 启 发 函 数 来 改 变 其 行为的能力在游戏中经常运用。速度和 精度之间的运行速度折衷可以提高游戏 有 效 性 。在 大 多 数 游 戏 中 , 们 并 没 有 必 我 要 找出两 点之 间的 最佳路 径, 你所 需要 的 可以是接近最佳路径的路径。你在速度 和精度之间的权衡取决于你想在游戏中 做什么, 者你计算机的速度。 或 假如游戏中有两种地形,平地和山 脉, 其路径的时间花费分别是 1 和 4, 那么, A* 算 法 沿 着 平 地 搜 索 的 距 离 将 会 是 山 脉 的 4 倍。这是因为可能存在这样一条路 径 , 着 平 地 前 进 从 而 绕 过 山 脉 。你 可 以 沿 加 快 A* 算 法 的 搜 索 速度 , 种 方 法是 : 一 使 用 2 作 为地 图中 两 空间 的启 发距 离, A*算 法比 较 4 和 2, 不会像 比较 4 和 1 那么 糟 就 糕了; 一种做法是: 算法将山脉地形 另 A* 的 运动 时间 花费 设定 为 3 来代 替实 际 的 4 以减少算法在山脉周围搜索的次数。 种 2 方法都放弃了最理想的路径而得到了更 快的搜索速度。 速度和精确度之间的选择不一定是 静 态 的 。 可 以 根 据 CPU 的 速 度, 径 搜 你 路 索的时间片数, 图上的单元数量, 个 地 每 单元的重要程度, 戏的难度级别, 者 游 或 其它的因素做出动态的选择。做出动态 选 择 的 一 种 方 法 是 :创 建 一 个 启发 函 数 , 假设穿过一个栅格空间的最小时间花费 是 1, 建 如 下 的 花 费 函 数 : 构 g ' (n)=1 + alpha * ( g (n) - 1 ) 若 alpha=0, 修 正 的 花 费 函 数 g'(n) 恒 则 等 于 1。 在 这 种 情 况 下 ,地 形 的 花 费 就 完 全被忽略了, 地图上所有的栅格只有可通/ 不 可 通 。 若 alpha=1, g'(n)=g (n), 则 g (n)为 原 始 的 花 费 函 数 ,这 时 就 会 完 全 获得 A* 算 法 的 优 点 。 可 以 设 置 alpha 为 0 到 1 间 的任意值。 速度和精确度间的选择不一定必须 是 全局的 , 可以根 据地 图中 某些区 域的 需
相关文档
最新文档