如何在带权重图的序言中找到最短路径

时间:2018-11-10 19:08:44

标签: prolog depth-first-search shortest-path uniform-cost-search

我有此代码:

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. 

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

1 个答案:

答案 0 :(得分:1)

我认为您的代码有问题:

  • TDist=TD1+TD2不会计算总和,至少在返回路径时才使用is / 2。

  • 如果图形包含循环,它将循环,但是假设数据实际上是DAG,我们现在就可以忽略。

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

无论如何,可以使用library(aggregate)查找最短路径。例如

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

或者,由于gnu-prolog没有库(聚合),因此请使用setof / 3计算的第一个元素:

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