我必须找到最短路径。这给了我所有路径的列表。我如何从这些中选出最小的?
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.
答案 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.
所以基本上,你找到所有的解决方案并挑选最小的解决方案......