Graph lisp中的邻接矩阵/Floyd/Warshall

Graph lisp中的邻接矩阵/Floyd/Warshall,graph,matrix,lisp,clisp,floyd-warshall,Graph,Matrix,Lisp,Clisp,Floyd Warshall,显然,我的老师认为,即使我们没有时间学习东西(也没有足够的例子),我们也应该继续学习,所以我现在需要知道如何在clisp中制作Floyd Warshall和Warshall的算法 正如我对prolog所做的那样,我的问题是从图中生成邻接矩阵,在这种情况下,它将是一个列表列表,例如: ((A B) (A C) (A D) (B C) (C D)) 这将产生: ((0 1 1 1) (1 0 1 9) (1 1 0 1) (1 9 1 0)) 我有这个: (defun floyd(graph)

显然,我的老师认为,即使我们没有时间学习东西(也没有足够的例子),我们也应该继续学习,所以我现在需要知道如何在clisp中制作Floyd Warshall和Warshall的算法

正如我对prolog所做的那样,我的问题是从图中生成邻接矩阵,在这种情况下,它将是一个列表列表,例如:

((A B) (A C) (A D) (B C) (C D))
这将产生:

((0 1 1 1) (1 0 1 9) (1 1 0 1) (1 9 1 0))
我有这个:

(defun floyd(graph)
    (setf l (length graph)) 
    (setf mat (matrix l graph))
)

(defun matrix(l graph)
    (setf matrix (make-array (list l l)))
    (dotimes (i l)
        (dotimes (j l)
            (if (= i j)
                (setf (aref matrix i j) 0)
                (setf (aref matrix i j) ???)
            )
        )
    )
    matrix
)
非常感谢您的帮助


另外,还有点离题:如果我能解决我自己的问题,我是否应该回答自己的问题以获得答案?

我将Wikipedia伪代码转换为带有类型声明的公共Lisp。 返回类型声明是非标准的,我使用了SBCL。 我想这不会运行,但它可能会让您了解Lisp代码应该是什么样子

(defparameter *n* 5)
(defparameter *path*
  (make-array (list *n* *n*)
          :element-type '(unsigned-byte 64)))


(defun floyd-warshall (path)
  (declare (type (simple-array (unsigned-byte 64) 2) path)
       (values (simple-array (unsigned-byte 64) 2) &optional))
  (destructuring-bind (y x) (array-dimensions path)
    (unless (= y x)
      (break "I expect a square matrix, not ~ax~a." x y))
    (macrolet ((p (j i)
         `(aref path ,j ,i)))
      (dotimes (k x)
    (dotimes (i x)
      (dotimes (j x)
        (setf (p j i)
          (min (p j i) (+ (p k i)
                  (p j k)))))))))
  path)
注1: 如果你有一个三维体积图像,你应该有这样的索引 (aref vol k j i)其中k索引z、j y和i为x方向。那样 在SBCL和所有其他实现中,片在内存中是连续的

注2:
macrolet可以节省大量的输入。还可以在这个漂亮的库中查看使用阵列的实现:git://github.com/nikodemus/raylisp.git/objects/box.lisp

如果您以3分或以上的分数回答自己的问题,则会出现问题。我想以此作为一个提示,说明自己是否可以用一个解决方案来回答。作为更惯用代码的开始,对于
l
mat
matrix
,使用而不是
setf
。CLISP是一种实现,这种语言称为Common Lisp或short CL。您还需要声明变量设置任意的未定义变量不是一个好主意。也不要在一行上用单圆括号来格式化代码。作为一个预热练习,考虑编写一个函数返回图中的节点,例如g <代码>(a bcd)。。如果你用副作用而不是依赖副作用来解决问题,你的老师会对你的才华留下更深刻的印象。看看你是否可以取消使用
SETF