CLISP - 有限深度优先搜索

时间:2016-11-06 05:05:35

标签: search common-lisp

尝试编写代码,对给定问题进行有限深度优先搜索并限制..我对这种语言非常新,所以这基本上只是一些想法..别欺负我xD

(defstruct state 
   pos 
   vel
   action
   cost
   track
   other)

(defstruct problem 
   initial-state
   fn-nextStates 
   fn-isGoal 
    fn-h);heuristic funtion

(defstruct node
  parent
  state)

(defun limdepthfirstsearch (problem limit)
  (return (recursiveldfs make-node(problem-initial-state) problem limit )))

(defun recursiveldfs (node problem limit)
  (if (problem-fn-isGoal (node-state node)) (solution(node)))
  (if (= limit 0) ':corte)

  (setf (cutoff_ocurred) nil)

  (loop for each (possible-actions) in (problem-fn-nextstates(node-state node)) do
    (setf (child) (nextState (node-state node) (possible-actions)))
    (setf (result) (recursiveldfs child problem (- limit 1)))
    (if (= result ':corte) (setf (cutoff_ocurred) t))
    (if (!= result nil) (return result))
  )
  (if (= cutoff_ocurred t) '(:corte))
  (if (= cutoff_ocurred nil) nil)
)

1 个答案:

答案 0 :(得分:0)

我的第二个@ BadZen的评论,但看起来你对普通的lisp来说还是一个新手,所以我只是给你的代码提供一些指示或评论。

首先,请考虑遵循common-lisp的介绍,例如:Practical common lisp以便快速入门,甚至更好(尽管基于方案)the SICP lectures,以便更深入地了解口齿不清。

另外请提交至少编译的代码,或者询问有关您收到的错误消息的问题。您的代码无法编译。请尝试使用common-lisp标准样式,至少用“ - ”分隔名称中的多个单词。您的代码很难阅读。

致你的代码:

  1. limdepthfirstsearch中,return是不必要的。通常,lisp return仅用于返回值并从nil命名的块中退出,例如循环或dolist等。

  2. 在同一个函数中,make-node(problem-initial-state)语法错误(这不是lisp函数如何获取参数),此外,make-node需要两个参数(父级和状态)。你可能想要的是: (recursiveldfs (make-node NIL (problem-initial-state problem)) problem limit)其中NIL我认为是最初的问题父(无论你的结构意味着什么)。如果(problem-initial-state problem)实际上是列表'(parent state),那么您需要撰写(recursiveldfs (apply #'make-node (problem-initial-state problem)) problem limit)

  3. recursiveldfs的定义中,语句(problem-fn-isGoal (node-state node)表示(node-state node)返回problem结构。在同一行中,(solution(node))在语法上是错误的,代码中没有名为solution的函数,node也不是函数。 solution(node)之间缺少空格。我无法弄清楚这里是什么意思。

  4. 再次在recursiveldfs的定义中,您可以编写(setf (cutoff_ocurred) nil)。由于没有名为cutoff_ocurred的函数,我认为你的意思是(setf cutoff_ocurred nil),但仍然没有名为cutoff_ocurred的变量。这是什么意思?也许您需要使用recursiveldfs来启动(let ((cutoff_ocurred nil)) ..)

  5. 在下面的循环中,从(possible-actions)(两次出现)中删除parens。这里需要一个循环发生的变量。

  6. (probem-fn-nextstates(node-state node))problem-fn-nextstates之后缺少空格,再次如(3)所示,它意味着(node-state node)返回problem结构。 do进入下一行(查找一些常见的lisp样式指南)。

  7. do之后,只有第一个语句属于do,其余语句在语法错误。如果您需要do循环中的多个语句,请使用do (progn (...) (...) ... (...))

  8. childresult既未定义函数也未定义变量(参见4)。

  9. 什么是:corte

  10. 请记住这些评论时重写您的代码,并在介绍了常见的lisp(至少从gigamonkeys书的几章开始)之后,编辑您的问题或提交一个新的问题,并编译代码,以及使用示例输入,如@BadZen所示。我还建议使用:type或注释来对结构进行注释。