2016-12-07 119 views
0

我试图定义一个A *在口齿不清CLISP - 翻译成伪实际Lisp代码

伪代码搜索算法可以发现here

这是我到目前为止有:

;;; A* 
(defun a* (problem) 
;;;;;;;;;;;;;;;;;;;;;;;;;;; cameFrom -> Parent do node 
;;;;;;;;;;;;;;;;;;;;;;;;;;; gScore -> node-g 
;;;;;;;;;;;;;;;;;;;;;;;;;;; fScore -> node-g + node-h   
    (setq closedSet '()) 
    (setq openSet (list (make-node :state (problem-initial-state problem)))) 
    (setq listaVizinhos '()) 

    (loop while(not(eq openSet nil)) 

     (setq tamanho_openS (list-length (openSet)))               ;        
     (setq current (nth 0 openSet))                   ; 
     (dotimes (i tamanho_openS)                    ;PARA ENCONTRAR O NODE COM MENOR FSCORE 
      (if (< (+ (node-g (nth i openSet)) (node-h (nth i openSet))) (+ (node-g current) (node-h current))) ;    CURRENT 
      (setq current (nth i openSet))))                 ; 

     (if (funcall (problem-fn-isGoal problem) (node-state current)) (return-from a* (solucao current)))  ; caso current seja solucao -> retorna-o para a funcao solucao (que cria a solucao pedida) 

     (remove current openSet) ; retira o curretn da lista dos abertos 
     (append (list(current)) closedSet) ; introduz curretn na lista dos fechados 

     (setf estadosVisinhos (nextStates (node-state current))) ; nextestates de current-state 
     (setf tamanho_estadosVizinhos (list-length (estadosVisinhos))) 

     (dotimes (i tamanho_estadosVizinhos)            ; 
      (setf visinho (make-node :parent current :state (nth i estadosVisinhos)))  ;PARA CRIAR LISTA COM TODOS NODES VIZINHOS DE CURRENT 
      (append (list(visinho)) listaVizinhos))           ;     LISTAVIZINHOS 

     (loop for vizinho in listaVizinhos do 
      (if (member vizinho closedSet) (continue)) 

      (setq tentative_gScore (+ (node-g current) (dist_between current vizinho))) 

      (if (not(member vizinho closedSet)) (append (list(vizinho)) openSet))   ; 
      (if (>= (tentative_gScore) (node-g vizinho)) (continue))      ; MAYBE CONDS AQUI 

      (setq (node-g vizinho) tentative_gScore) 
      (setq (node-f vizinho) (+ (node-g vizinho) (compute-heuristic (node-state vizinho)))) 
) 
) 

(return-from a* nil)) 

和我的节点结构是:

;;; Definition of a search node 
;;; * parent - the parent node 
;;; * state - the state of the node 
;;; * f - estimate of the cost 
;;; * g - cost from the initial node to the current node 
;;; * h - estimate of the cost from the current node to the nearest goal 
(defstruct node 
    parent 
    state 
    f 
    g 
    h) 

在我的翻译我使用其他功能,但那些我已经测试,是正确的。

当我尝试编译我的代码我得到一个语法错误,但我不知道在哪里..

编辑: 错误消息:

LOOP: illegal syntax near (setq tamanho_openS (list-length (openSet))) in loop (and then the terminal prints the entire loop) 
+0

1.请修复缩进(例如,使用emacs编辑您的代码); 2.请准确粘贴错误信息文本; 3.请使用'let'而不是'setq'作为局部变量。 – sds

回答

2

您正在使用的“扩展” loop形式,所以你需要做的

(loop while ... 
    do ...) 

,而不是

(loop while ... 
    ...) 

这是什么错误告诉你:它想要一个关键字while条件后,它找到了正文的第一条语句。

您可能要更仔细地检查The LOOP Facility

PS。请绑定局部变量使用letloop,with,然后将它们设置为setq。否则,你的变量是全球特价。

PPS。请正确缩进您的代码;你可以使用Emacs。

+0

已经编辑我的问题!我会尽力谢谢! – xicocana

+0

是的,谢谢,我对你的错误的猜测是正确的,你错过了身体前的“做”。 – sds