prolog中带宽度优先搜索的返回最短路径
我想在prolog中的双向图中找到从A站到B站的最短路径(如果A连接到B而不是B连接到A),该图在分支上没有权重。问题是这样贴出来的prolog中带宽度优先搜索的返回最短路径,prolog,graph-theory,shortest-path,Prolog,Graph Theory,Shortest Path,我想在prolog中的双向图中找到从A站到B站的最短路径(如果A连接到B而不是B连接到A),该图在分支上没有权重。问题是这样贴出来的 solve(Start,End,Path). 启动启动站。 终点站。 通过最短路线的所有站点的路径列表。图中任意两个直接连接的站点之间的距离相等。 基本事实如下: fact("Staion1","metroline","Station2","metroline"). 地铁线路是直接连接两个楼梯的线路数量。如果第二个和第四个参数相同,则直接连接站点 line(
solve(Start,End,Path).
启动启动站。终点站。
通过最短路线的所有站点的路径列表。图中任意两个直接连接的站点之间的距离相等。 基本事实如下:
fact("Staion1","metroline","Station2","metroline").
地铁线路是直接连接两个楼梯的线路数量。如果第二个和第四个参数相同,则直接连接站点
line("Abbesses","12","Pigalle","12").
line("Abbesses","12","Lamarck Caulaincourt","12").
line("Ale'sia","4","Mouton Duvernet","4").
line("Ale'sia","4","Porte d'Orle'ans","4").
line("Alexandre Dumas","2","Philippe Auguste","2").
line("Alexandre Dumas","2","Avron","2").
line("Alma Marcesu","9","Ie'na","9").
编辑:
我试图解决这个问题,我发现如果使用BFS,它会工作得更快。以下是我写的解决方案:
solve(Start,End,Path):-solve1([Start],End,[Start],Path).
solve1([P|O],End,Visited,[End|?]):-children(P,S),member(End,S),!.
solve1([P|O],End,Visited,Path):-(not(member(P,Visited)),children(P,S),append(O,S,O1),solve1(O1,End,Visited,Path));
(solve1(O,End,Visited,Path)).
?-应该是具有目标节点路径的列表唯一的问题是我不知道如何返回到目标节点的路径。
谢谢,就在前面 您可以使用Dijkstra算法
“s_算法”它引出了一个问题,广度优先算法是否比深度优先算法有任何优势。无论如何,您都可以通过member/2谓词检测循环,因此不存在完整性问题 假设我们有这个图,没有任何循环: 在序言中可以表示为以下事实:
% edge(-Vertex, -Vertex)
edge(a, b). edge(a, c).
edge(a, d). edge(b, c).
edge(c, d). edge(c, e).
edge(d, e).
然后做这个工作:
% path(+Vertex, +Vertex, -Integer)
:- table path(_,_,min).
path(X, X, 0).
path(X, Y, N) :-
edge(X, Z), path(Z, Y, M), N is M+1.
以下是一些运行示例:
?- path(a, e, X).
X = 2
?- path(a, e, 3).
No
您还可以修改代码,以便它检测循环和/或返回路径。对后者有帮助的是使用自定义聚合函数
免责声明:出于实际目的,您不会使用可以归结为Dijkstra算法的东西。您宁愿使用家庭中的东西。告诉我们您是如何开始解决问题的,以及您在哪里遇到了问题。看起来你希望其他人完全为你解决这个问题。。。