使用循环实现迭代深化A *图

时间:2017-04-06 15:37:34

标签: algorithm graph-algorithm

我一直在尝试实现Iterative Deepening A *算法,其中我有一个带循环的图。我查看了下面的维基百科的伪代码:

 node              current node
 g                 the cost to reach current node
 f                 estimated cost of the cheapest path (root..node..goal)
 h(node)           estimated cost of the cheapest path (node..goal)
 cost(node, succ)  step cost function
 is_goal(node)     goal test
 successors(node)  node expanding function, expand nodes ordered by g + h(node)

 procedure ida_star(root)
   bound := h(root)
   loop
     t := search(root, 0, bound)
     if t = FOUND then return bound
     if t = ∞ then return NOT_FOUND
     bound := t
   end loop
 end procedure

 function search(node, g, bound)
   f := g + h(node)
   if f > bound then return f
   if is_goal(node) then return FOUND
   min := ∞
   for succ in successors(node) do
     t := search(succ, g + cost(node, succ), bound)
     if t = FOUND then return FOUND
     if t < min then min := t
   end for
   return min
 end function

然而问题是这个伪代码不处理循环,因为进入循环时循环不会终止。如何做到这一点?

1 个答案:

答案 0 :(得分:-1)

我建议您创建两个节点列表并检查每次迭代:

打开列表包含尚未展开的节点。按评估函数 f(n)= g(n)+ h(n)排序。最初包含根。要展开节点,您将从列表中获得第一个节点。此外,您将后续添加到列表中。

已关闭列表包含已展开的节点。当您要扩展节点时,请检查它是否在关闭列表中。如果是你丢弃它。

希望这有帮助。