弗洛伊德和沃沙尔';Prolog中的s算法

弗洛伊德和沃沙尔';Prolog中的s算法,prolog,floyd-warshall,Prolog,Floyd Warshall,我想用Prolog编程这个算法,首先我需要从一系列图中创建一个矩阵。我以前做过这件事(在你们中的一些人的帮助下),但现在我不知道如何将它存储在列表列表中(我认为这是prolog中最好的方法)。我想我可以从那里继续(在每个算法中使用三重for循环)。程序的逻辑对我来说并不困难,但如何处理数据却不难。抱歉打扰您,提前谢谢 我的矩阵生成器: graph(a,b). graph(a,a). graph(b,c). graph(b,d). graph(c,d). graph(a,e). graph(e,f

我想用Prolog编程这个算法,首先我需要从一系列图中创建一个矩阵。我以前做过这件事(在你们中的一些人的帮助下),但现在我不知道如何将它存储在列表列表中(我认为这是prolog中最好的方法)。我想我可以从那里继续(在每个算法中使用三重for循环)。程序的逻辑对我来说并不困难,但如何处理数据却不难。抱歉打扰您,提前谢谢

我的矩阵生成器:

graph(a,b).
graph(a,a).
graph(b,c).
graph(b,d).
graph(c,d).
graph(a,e).
graph(e,f).

matrix :- allnodes(X),printmatrix(X).

node(X) :- graph(X,_).
node(X) :- graph(_,X).
allnodes(Nodes) :- setof(X, node(X), Nodes).

printedge(X,Y) :-    graph(Y,X), write('1 ').
printedge(X,Y) :- \+ graph(Y,X), write('0 ').

printmatrix(List):- member(Y, List),nl,member(X, List),printedge(X,Y),fail.
上一个问题涉及图形邻接矩阵的视觉显示(逐行)。这里我们讨论如何实现/表示邻接矩阵作为Prolog项。特别是,我们将采用上面显示的allnodes/1谓词作为获取所有节点列表的方法

Prolog缺少任何本机“矩阵”数据类型,因此这里采用的方法是使用列表列表来表示邻接矩阵。条目按0和1中的“行”组织,表示对应于行的节点与对应于列的节点的邻接

查看您的示例图表/2事实,我发现您包含了一条自边(从a到a)。我不确定你想要的是有向图还是无向图,所以我假设有向图是有向图,并注意如果没有无向图的意思,在什么地方需要做一些小的修改

这里有一个“设计模式”,通过对列表中的每个项目应用规则来定义列表。在这里,我们用一种方法构造“矩阵”的每一行,并且(以此为规则)构造整个列表列表

/* construct adjacency matrix for directed graph (allow self-edges) */
adjacency(AdjM) :-
    allnodes(L),
    adjMatrix(L,L,AdjM).

adjMatrix([ ],_,[ ]).
adjMatrix([H|T],L,[Row|Rows]) :-
    row_AdjM(H,L,Row),
    adjMatrix(T,L,Rows).

row_AdjM(_,[ ],[ ]).
row_AdjM(X,[Y|Ys],[C|Cs]) :-
    (   graph(X,Y)
     -> C = 1
     ;  C = 0
    ),
    row_AdjM(X,Ys,Cs).

如果是无向图,那么对
graph(X,Y)
的调用应该替换为另一个
(graph(X,Y);graph(Y,X))
,它允许在任意方向上考虑边。

您想要的似乎是图的另一个方向。我之所以提到这一点,是因为在图形表示中经常使用另一个矩阵,称为关联矩阵。邻接矩阵显示两个节点何时共享一条边,而关联矩阵显示哪些节点与哪些边相交。简单图的邻接矩阵是对称的,对角线上只有零(节点本身不相邻)。我可以帮你,但我不确定这对实现Floyd-Warshall有多重要。邻接矩阵正是我需要的;_;;!