【问题标题】:PROLOG: Graph path with minimum connectionsPROLOG:具有最少连接的图形路径
【发布时间】:2023-01-23 18:12:03
【问题描述】:

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

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).

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

有人可以帮帮我吗?

【问题讨论】:

    标签: prolog graph-theory


    【解决方案1】:

    如果通过最小连接数你的意思是最短路径,快速解决办法是确定总和不计算重量,而是计算长度。但是,有更好的方法可以找到没有 findall/3 的最短路径。

    无论如何,您会很容易找到大量示例最短路径.

    【讨论】:

    • 解决了我的问题谢谢
    猜你喜欢
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多