如何使用加权图在序言中找到最短路径

How to find shortest path in prolog with weighted graph

我有这个代码:

link(a,b,4). 
link(a,c,2). 
link(b,g,5). 
link(c,g,6). 
link(c,d,5). 
link(d,g,3). 

path(S,D,TDist):- 
    link(S,D,TDist). 
path(S,D,TDist):- 
    link(S,X,TD1), path(X,D,TD2), TDist=TD1+TD2. 

这将遵循深度优先搜索策略,但结果是它会给我所有路径,并且不会显示哪条路径最短。是否仍然可以使用该策略并找到最短路径?如果不是,使用什么搜索策略?以及如何实现它。

我认为你的代码有问题:

  • TDist=TD1+TD2 不计算总和,使用 is/2 代替,至少在返回路径时是这样。

  • 如果图中有环会循环,但假设数据实际上是DAG,我们现在可以忽略。

  • 我们不能说实际路径是什么,只能说它的值。

总之,library(aggregate)可以用来求最短路径。例如

?- aggregate(min(D), path(a,g,D), D).
D = 8.

或者,由于 gnu-prolog 没有 library(aggregate),取由 setof/3 计算的第一个元素:

?- setof(D, path(a,g,D), [Min|Rest]).
Min = 8,
Rest = [9, 10].