2016-11-06 1 views
0

주어진 문제에 대해 제한된 깊이의 검색을 수행하는 코드를 작성하려고합니다.이 언어에 매우 익숙하지 않으므로 기본적으로 생각 만합니다. 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

@ BadZen의 의견은 두 번째이지만, 일반적인 lisp에는 새로운 것이므로 코드에 몇 가지 포인터 나 주석을 제공 할 것입니다.

먼저 common-lisp에 대한 소개를 고려하십시오 (예 : Practical common lisp). 스킬에 대해 자세히 이해하려면 the SICP lectures을 빨리 시작하거나 더 나은 방법 (체계를 기반으로 함)을 사용해보십시오.

최소한 컴파일 된 코드를 제출하거나 얻은 오류 메시지에 대해 질문하십시오. 코드가 컴파일되지 않습니다. 그리고 common-lisp 표준 스타일을 조금 사용해보십시오. 적어도 "-"로 이름에 여러 단어를 구분하십시오. 코드를 읽기가 어렵습니다. 코드에

:

  1. limdepthfirstsearch에서, return는 불필요합니다. 공통 LISP에서는 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의 정의에서 (recursiveldfs (apply #'make-node (problem-initial-state problem)) problem limit)

  3. 를 작성해야, 문 (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을 시작해야할까요?

  5. 아래 루프에서 괄호를 (possible-actions) (두 번)에서 삭제하십시오. 여기에서 루프가 발생하는 변수가 필요합니다. (3)이 (node-state node)problem 구조를 반환한다는 의미 같이

  6. (probem-fn-nextstates(node-state node))

    다시 problem-fn-nextstates 후 공간을 누락하고있다. do은 다음 줄에 있습니다 (일반적인 lisp 스타일 가이드를 찾아보십시오).

  7. do 뒤에 첫 번째 명령문 만 do에 속하며 나머지는 구문 오류입니다. 반복문에 do 문이 필요하면 do (progn (...) (...) ... (...))을 사용하십시오.

  8. child 및은 정의 된 함수도 아니고 정의 된 변수도 아닙니다 (4 참조).

  9. :corte은 무엇입니까?

하고, (적어도 gigamonkeys 책에서 장을 몇) 커먼 리스프에 대한 소개를 복용 후 마음에 이러한 의견 코드를 재 작성하고 질문을 수정 또는 코드와 함께, 새로운 하나를 제출해주십시오 @BadZen이 제시하는 것처럼, 컴파일하고 예제 입력을 사용합니다. 또한 유형을 사용하거나 주석을 사용하여 구조에 주석을다는 유형을 제안합니다.