2016-11-06 41 views
0

嘗試寫代碼做一個有限的深度優先搜索在給定的問題和限制..即時通訊使用這種語言很新,所以這是basicly只是一些想法..不要欺負我由xDCLISP - 有限深度優先搜索

(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) 
) 
+3

嗨@xicocana!請查看http://stackoverflow.com/help/how-to-ask。這裏的用戶通常希望在嘗試幫助之前看清明確的問題並提供明確的解決方案......(即,您運行了什麼,包括測試數據,您觀察到了什麼,您期望觀察的是什麼,您嘗試過什麼解決問題?) – BadZen

回答

0

I second @ BadZen的評論,但它似乎你是相當新的常見的lisp,所以我只是給你的代碼一些指針或評論。

首先,請考慮下面對common-lisp的介紹,例如:Practical common lisp快速入門,或者更好(儘管基於方案)the SICP lectures,以便更深入地理解lisp。

另請提交至少需要編譯的代碼,或者提出有關您獲得的錯誤消息的問題。你的代碼不能編譯。請儘量使用common-lisp標準樣式,至少用「 - 」分隔名稱中的多個單詞。你的代碼很難閱讀。

你的代碼:

  1. limdepthfirstsearchreturn是不必要的。在共口齒不清return僅用於從一個零命名塊返回一個值和出口,例如環,或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)(兩次出現)中刪除父項。這裏需要一個循環發生的變量。

  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

請重寫考慮到這些評論你的代碼,並採取介紹了Common Lisp的(至少一對夫婦從gigamonkeys書籍章節)後,和編輯您的問題或提交一個新的,有代碼如@BadZen所暗示的那樣編譯和輸入示例。我還建議鍵入註釋你的結構,或者使用:type或者註釋。