A星寻路算法的Lua实现

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星寻路算法的Lua实现_第1张图片
(图片来自莫水千流: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,算法)