您的位置:首页 > 编程语言 > Lua

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

这是关键实现:

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lua 算法 A A星寻路