递归最佳第一次搜索并找到最佳路径

时间:2013-11-19 23:51:46

标签: recursion lisp graph-algorithm

在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)我得到类似第一,第二,第三,第四,第五个呼叫的内容,然后它再次重复第五次呼叫。

所以问题实际上是如何在循环中打破递归;)

1 个答案:

答案 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>))

这是你想要的形式吗? 而且您可能不需要其他数据结构,因为您只需要在递归中传递参数。