我正在尝试修改现有的爬山函数,该函数采用两个节点名称(例如 A 和 E),并具有递归使用的可选参数(队列)。我正在尝试定义一个“更便宜”的函数来评估一条路径是否比另一条路径便宜。此外,我试图传递一个目标节点列表,而不是一个目标节点,该函数在到达其中一个节点时停止评估。
问题是除了我输入的起始节点和一个空列表之外,我的函数不会返回任何内容。
这是我的网络/图表和相关成本:
(setf (get 's 'coordinates) '(0 3)
(get 'a 'coordinates) '(4 6)
(get 'b 'coordinates) '(7 6)
(get 'c 'coordinates) '(11 9)
(get 'd 'coordinates) '(2 0)
(get 'e 'coordinates) '(9 2)
(get 'f 'coordinates) '(11 3))
(setf (get 's 'cost) 0
(get 'a 'cost) 16
(get 'b 'cost) 4
(get 'c 'cost) 10
(get 'd 'cost) 5
(get 'e 'cost) 12
(get 'f 'cost) 14)
这是我修改后的爬山函数:
(defun hill-climb (start finish &optional (queue (list (list start))))
(cond ((endp queue) nil)
((member (first (first queue)) finish)
(reverse (first queue)))
(t (hill-climb start finish (append (sort (extend (first queue))
#'(lambda (p1 p2)
(cheaper p1 p2
finish)))
(rest queue))))))
最后,这里是“成本”和“更便宜”的功能:
(defun cost (path)
(apply '+ (mapcar #'(lambda (x) (get x 'cost)) path)))
(defun cheaper (p1 p2)
(< (cost p1)
(cost p2)))
编辑:对不起,这里是“扩展”:
(defun extend (path)
(print (reverse path))
(mapcar #'(lambda (new-node) (cons new-node path))
(remove-if #'(lambda (neighbor) (member neighbor path))
(get (first path) 'neighbors))))