PROLOG:用最小连接绘制路径



我想知道如何获得具有最小连接的路径,而不是具有最小连接值和的路径。我的知识是:

edge (vertex1, vertex2, value).

谓词应该返回连接的路径和数量。

我有这个谓词,但它计算的路径是连接之间的最小值,而不是连接本身的数量。

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]|_].
%

有什么想法吗?

编辑

我在代码中做了一些更改,但不知道为什么不起作用

path(X,Y,[X,Y],L):- 
edge(X,Y,L),
L is 1.
path(X,Y,[X|W],L):- 
edge(X,Z,L1), 
path(Z,Y,W,L2), 
L is L2 + 1.
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]|_].
%

我的知识库是

edge(1,2,10).
edge(1,3,1).
edge(3,2,1).

我想要这个最短路径(1,2,X,Y(。给我直接路径1->2,但我仍然得到1->3->2.

有人能帮帮我吗?

如果最小连接是指最短路径,那么快速解决方法是固定总和,而不是计算重量,而是计算长度。但是,有更好的方法可以在没有findall/3的情况下找到最短路径。

在任何情况下,您都很容易找到最短路径的大量示例。

最新更新