1. 程式人生 > >A星尋路演算法的Lua實現

A星尋路演算法的Lua實現

A*搜尋演算法俗稱A星演算法。這是一種在圖形平面上,有多個節點的路徑,求出最低通過成本的演算法。

對A星演算法的理解還是要從公式 F = G + H開始:在節點化的地圖上,每一步的操作,使得已走距離 + 距離終點距離最小。具體的實現上是維護一個open表和一個closed表。(看到一篇用遞迴實現的文章,也是很贊。)

這是關鍵實現:

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

這裡是測試用例

    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)