Advertisement
alestane

A* foundation

Jan 31st, 2012
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 0.92 KB | None | 0 0
  1. local function removeLowest(set, costs, h)     
  2.     return function(t, ...)
  3.         local prospect, cost
  4.         for node in pairs(t) do
  5.             if not cost or costs[node] + h(node) < cost then
  6.                 prospect, cost = node, costs[node] + h(node)
  7.             end
  8.         end
  9.         if prospect then
  10.             local parent = t[prospect]
  11.             t[prospect] = nil
  12.             return prospect, parent
  13.         end
  14.     end, set
  15. end
  16.  
  17. return function(start, goal, neighbors, h)
  18.     local open = {[start] = false}
  19.     local costs = {[start] = 0}
  20.     local parents = {}
  21.    
  22.     for prospect, parent in removeLowest(open, costs, function(source) return h(source, goal) end) do
  23.         if prospect == goal then
  24.             return parent, costs[prospect], parents
  25.         end
  26.         for successor, cost in neighbors(prospect) do
  27.             cost = cost + costs[prospect]
  28.             if not costs[successor] or costs[successor] > cost then
  29.                 costs[successor] = cost
  30.                 open[successor] = prospect
  31.                 parents[successor] = prospect
  32.             end
  33.         end
  34.     end
  35. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement