在Recursive Best-First Search中,如何修改它,以便能够追踪路线?
我是否需要一个数据结构来跟踪上次递归中断后哪些节点被展开?
我已经在LISP和RBFS本身中实现了启发式和辅助函数(图解析器,距离计算)。现在,为了打印最佳路径,我有一个每个递归步骤的所有返回值(结果)的列表。
请参阅RBFS - Recursive Best-First Search Algorithm (PDF, slide 4)。
我的LISP代码:
(defun rbfs (state cost f-limit goal)
(let ((node (first state))
(f (second state)))
(if (equal node goal)
(list node cost)
(let ((successors
(loop
:for city :in (expand node)
:collect (list city (max (+ cost (getdistance city node)
(getlineardistance city goal)) f))
:into successors
:finally (sort successors #'my-comparator)))
(result (list)))
(if (< (length successors) 2)
(list fail inf)
(loop
:for best := (first successors)
:and alternative := (second successors)
:if (> (second best) f-limit) :do (list fail (second best))
:else :if (not (equal node fail) )
:do (list node cost)
:collect (rbfs best
(+ cost (getdistance (first best) node) )
(min f-limit (second alternative) ) goal)))))))
现在,这段代码的问题在于递归永远不会解开。使用(trace rbfs)我得到类似第一,第二,第三,第四,第五个呼叫的内容,然后它再次重复第五次呼叫。
所以问题实际上是如何在循环中打破递归;)
答案 0 :(得分:0)
你能编写这样的代码(在common-lisp中):
(defun rbfs (<your-arguments> lst)
(let ((city (car lst)))
(append lst (get-successors city))
(cond ((null lst) NIL)
((not (null (goal-test city))) (<return the path>))
(t (rbfs <your-arguments> (sort (cdr lst)))))))
(defun get-successors (city)
(<expand the city node here and returning a list>))
(defun goal-test (city)
(<judge using your h(n) function>))
这是你想要的形式吗? 而且您可能不需要其他数据结构,因为您只需要在递归中传递参数。