我一直在尝试实现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
然而问题是这个伪代码不处理循环,因为进入循环时循环不会终止。如何做到这一点?
答案 0 :(得分:-1)
我建议您创建两个节点列表并检查每次迭代:
打开列表包含尚未展开的节点。按评估函数 f(n)= g(n)+ h(n)排序。最初包含根。要展开节点,您将从列表中获得第一个节点。此外,您将后续添加到列表中。
已关闭列表包含已展开的节点。当您要扩展节点时,请检查它是否在关闭列表中。如果是你丢弃它。
希望这有帮助。