A星寻路算法的Lua实现
2016-03-06 19:48
661 查看
A*搜寻算法俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。
这里有一篇前辈的文章,很适合新手学习 莫水千流:A星寻路算法介绍 http://www.cnblogs.com/zhoug2020/p/3468167.html 。
对A星算法的理解还是要从公式 F = G + H开始:在节点化的地图上,每一步的操作,使得已走距离 + 距离终点距离最小。具体的实现上是维护一个open表和一个closed表。(看到一篇用递归实现的文章,也是很赞。)
花了一点时间,也参考了一些别人的实现,用Lua实现了自己的A*。
完整的Lua代码请到我的GitHub上下载。https://github.com/MagicDavid20/LuaProj/blob/master/DOD/src/app/arithmetic/AStarFindRoute.lua
(图片来自莫水千流:A星寻路算法介绍 http://www.cnblogs.com/zhoug2020/p/3468167.html ,数据是模拟的这张图片。)
这里有一篇前辈的文章,很适合新手学习 莫水千流:A星寻路算法介绍 http://www.cnblogs.com/zhoug2020/p/3468167.html 。
对A星算法的理解还是要从公式 F = G + H开始:在节点化的地图上,每一步的操作,使得已走距离 + 距离终点距离最小。具体的实现上是维护一个open表和一个closed表。(看到一篇用递归实现的文章,也是很赞。)
花了一点时间,也参考了一些别人的实现,用Lua实现了自己的A*。
完整的Lua代码请到我的GitHub上下载。https://github.com/MagicDavid20/LuaProj/blob/master/DOD/src/app/arithmetic/AStarFindRoute.lua
这是关键实现:
while (table.nums(OPEN_LIST) > 0) do CURRENT_POS = OPEN_LIST[1] table.remove(OPEN_LIST, 1) OPEN_MAP[CURRENT_POS.key] = nil if IS_SAME_P(CURRENT_POS, END_POS) then return makePath(CURRENT_POS) else CLOSED_MAP[CURRENT_POS.key] = CURRENT_POS local nextPoints = getNextPoints(CURRENT_POS) for i = 1, #nextPoints do local nextPoint = nextPoints[i] if (OPEN_MAP[nextPoint.key] == nil )and (CLOSED_MAP[nextPoint.key] == nil) and (IS_BARRIER(nextPoint, BARRIER_LIST) == false) then OPEN_MAP[nextPoint.key] = nextPoint table.insert(OPEN_LIST, nextPoint) end end table.sort(OPEN_LIST, COMPARE_FUNC) end end return nil
这里是测试用例
(图片来自莫水千流:A星寻路算法介绍 http://www.cnblogs.com/zhoug2020/p/3468167.html ,数据是模拟的这张图片。)
local prop = {} prop.x = 7 prop.y = 6 prop.startPos = { x = 2, y = 3 } prop.endPos = { x = 6, y = 2 } prop.barrageList = {} prop.barrageList[1] = { x = 4, y = 2 } prop.barrageList[2] = { x = 4, y = 3 } prop.barrageList[3] = { x = 4, y = 4 } prop.barrageList[4] = { x = 4, y = 5 } prop.barrageList[5] = { x = 2, y = 2 } local path = AStarFindRoute.init(prop) local src = "" for i, point in ipairs(path) do src = src..point.key.."->" end print("david say path is "..src)
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- 详解Lua中的表的概念及其相关操作方法
- Lua编程示例(二):面向对象、metatable对表进行扩展
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 把Lua编译进nginx步骤方法
- Lua脚本自动生成APK包
- Lua中的元表(metatable)、元方法(metamethod)详解
- Lua中的metatable介绍
- Lua中ipair和pair的区别
- Lua中的函数精讲笔记
- 浅谈Lua的面向对象特性
- 详解Lua中的变量相关知识点
- Lua脚本语言入门笔记
- Lua脚本调用外部脚本
- 详解Lua中的if语句的使用方法
- Lua中调用函数使用点号和冒号的区别
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中强大的元方法__index详解