Graph LISP-广度优先搜索

Graph LISP-广度优先搜索,graph,lisp,breadth-first-search,Graph,Lisp,Breadth First Search,我在别处得到了一个BFS的实现,并做了一些修改,但它的输入有问题。 它需要一个图形,并将其作为“((abc)(bc)(cdc)) 但我的输入是一个加权图。。。我知道这对BFS没什么用,但我会在以后的比赛中使用更重的重量。此输入看起来像 ”( (a(b 3)(c 1)) (b(a3)(d1)) (c(a1)(d2)(e2)) ) 等等 我的代码: (defun shortest-path (start end net) (BFS end (list (list start)) ne

我在别处得到了一个BFS的实现,并做了一些修改,但它的输入有问题。
它需要一个图形,并将其作为“((abc)(bc)(cdc)) 但我的输入是一个加权图。。。我知道这对BFS没什么用,但我会在以后的比赛中使用更重的重量。此输入看起来像
”(
(a(b 3)(c 1))
(b(a3)(d1))
(c(a1)(d2)(e2))
)

等等

我的代码:

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

(defun BFS (end queue net)  
  (if (null queue)  
      nil  
      (expand-queue end (car queue) (cdr queue) net)))

(defun expand-queue (end path queue net)  
  (let ((node (car path)))  
        (if (eql node end)  
        (reverse path)  
        (BFS end
             (append queue  
                     (new-paths path node net))  
             net))))

(defun new-paths (path node net)  
  (mapcar #'(lambda (n)  
              (cons n path))  
          (cdr (assoc node net))))

我只是不确定我最有可能在哪里修改它以接受新样式列表,或者创建一个帮助函数以正确格式化它?

您需要指定表示图形的列表的含义。目前,您只给出了一个示例列表

当图形具有如下语法时:

graph = (node*)

node = (name nextnodename*)

name = SYMBOL

nextnodename = SYMBOL
那么转换函数可能是:

(defun convert-graph (graph)
  (mapcar (lambda (node)
            (destructuring-bind (name . nodes) node
              (cons name (mapcar #'first nodes))))
          graph))
或者,如果您可能需要其他提取功能:

(defun convert-graph (graph &key (key #'first))
  (mapcar (lambda (node)
            (destructuring-bind (name . nodes) node
              (cons name (mapcar key nodes))))
          graph))
例如:

(convert-graph '((a (b 3) (c 1))
                 (b (a 3) (d 1))
                 (c (a 1) (d 2) (e 2)))
               :key #'first)

((A B C) (B A D) (C A D E))

现在您可能需要删除重复的链接。但这取决于图形描述的语法和语义。

这非常有效。这有点超出了我的Lisp技能,所以非常感谢您的帮助。