在无向图中找到两个顶点之间的最短路径

时间:2018-04-23 16:59:49

标签: prolog

我必须找到最短路径。这给了我所有路径的列表。我如何从这些中选出最小的?

path(X,Y,[X,Y],L) :- edge(X,Y,L).
path(X,Y,[X|W],L) :- edge(X,Z,L1), path(Z,Y,W,L2), L is L1 + L2.

1 个答案:

答案 0 :(得分:0)

从您的程序开始,您可以使用以下代码解决此问题:

path(X,Y,[X,Y],L):- 
    edge(X,Y,L).

path(X,Y,[X|W],L):- 
    edge(X,Z,L1), 
    path(Z,Y,W,L2), 
    L is L1 + L2.

shortestPath(X,X,[X,X],0):- !.
shortestPath(X,Y,MinP,MinD):-
    findall([L,P],path(X,Y,P,L),Set),
    sort(Set,Sorted),
    Sorted = [[MinD,MinP]|_].

?- shortestPath(1,5,Path,Length).
Length = 3.5,
Path = [1, 2, 5]

如果您不想使用sort/2(请注意sort/2删除重复项),您可以这样做:

shortestPath(X,X,[X,X],0):- !.
shortestPath(X,Y,MinP,MinD):-
    findall([L,P],path(X,Y,P,L),Set),
    splitList(Set,LD,LP),
    min_list(LD,MinD),
    nth1(I,LD,MinD),
    nth1(I,LP,MinP).

splitList([],[],[]).
splitList([[L,D]|T],[L|TP],[D|TD]):-
    splitList(T,TP,TD). 

?- shortestPath(1,5,Path,Length).
    Length = 3.5,
    Path = [1, 2, 5]
    false.

所以基本上,你找到所有的解决方案并挑选最小的解决方案......