gpt4 book ai didi

search - Lisp - 爬山

转载 作者:太空宇宙 更新时间:2023-11-03 18:43:51 26 4
gpt4 key购买 nike

好的,我有一个 BFS 的 Lisp 实现,我正试图将其转换为进行爬山搜索。

这是我的 BFS 代码的样子:

; The list of lists is the queue that we pass BFS.  the first entry and 
; every other entry in the queue is a list. BFS uses each of these lists and
; the path to search.

(defun shortest-path (start end net)
(BFS end (list (list start)) net))

;We pass BFS the end node, a queue containing the starting node and the graph
;being searched(net)

(defun BFS (end queue net)
(if (null queue) ;if the queue is empty BFS has not found a path so exit
nil
(expand-queue end (car queue) (cdr queue) net)))

(defun expand-queue (end path queue net)
(let ((node (car path)))
(if (eql node end) ; If the current node is the goal node then flip the path
; and return that as the answer
(reverse path)
; otherwise preform a new BFS search by appending the rest of
; the current queue to the result of the new-paths function
(BFS end (append queue (new-paths path node net)) net))))

; mapcar is called once for each member of the list new-paths is passed
; the results of this are collected into a list
(defun new-paths (path node net)
(mapcar #'(lambda (n) (cons n path))
(cdr (assoc node net))))

现在,我知道我需要扩展看起来最接近目标状态的节点,而不是像我在 BFS 中那样总是扩展左节点。
我使用的图表如下所示:

(a (b 3) (c 1))  
(b (a 3) (d 1))

我有一个转换函数可以使它与上述 BFS 实现一起工作,但现在我需要使用这种图形格式将其转换为爬山。

我只是不确定从哪里开始,并且一直在尝试无济于事。我知道我主要需要更改 expand-queue 函数来扩展最近的节点,但我似乎无法创建一个函数来确定哪个节点最近。

感谢您的帮助!

最佳答案

将内容附加到列表末尾是错误的。这是列表中成本最高的操作。复制整个列表,然后附加另一个列表。您在递归过程中使用它,这意味着它会在您每次扩展节点以创建新路径时完成。

如果将项目放入队列中,则需要查看执行顺序。在广度优先的情况下,在移动到下一个级别之前,访问一个级别中的每个节点。爬山法要求您使用加权函数对“最佳”候选人进行排序。因此,您需要某种函数来计算当前节点和下一个候选节点的数值。然后你需要对候选人进行排序并首先展开“最佳”节点。对于 LIFO(后进先出)队列,这意味着最有前途的节点需要最后推送,以便它最先扩展。请注意,后进先出队列非常适合单链表。 FIFO(先进先出)并非如此。

计算机科学的一个典型思想是数据抽象。如果 LIFO QUEUE 是这样的数据结构,则需要定义 MAKE-LIFO-QUEUE、EMPTY-QUEUE-P 等函数,然后使用这些函数代替 LIST、NULL 和其他函数,它们的目的是数据结构更清晰。这会使您的代码更长,但由于 Lisp 列表是通用的并且可以(滥用)用于各种使用场景,因此仅查看列表操作并不能明确其意图。这对于更复杂的图形算法尤其重要。

关于search - Lisp - 爬山,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5833471/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com