我试图定义一个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)
1.请修复缩进(例如,使用emacs编辑您的代码); 2.请准确粘贴错误信息文本; 3.请使用'let'而不是'setq'作为局部变量。 – sds