在prolog中使用Dijkstra算法查找所有路径
我有一个使用Dijkstra算法的作业。 这个算法允许我计算一个图的单一最优路径,但是,我 希望在不修改算法(但使用算法)的情况下,计算使用时间不超过特定给定限制的所有路径。我不知道如何在Prolog中做到这一点 这是我的代码。在prolog中使用Dijkstra算法查找所有路径,prolog,dijkstra,Prolog,Dijkstra,我有一个使用Dijkstra算法的作业。 这个算法允许我计算一个图的单一最优路径,但是,我 希望在不修改算法(但使用算法)的情况下,计算使用时间不超过特定给定限制的所有路径。我不知道如何在Prolog中做到这一点 这是我的代码。 dijkstra([Time-[To|RPath] |_], To, [To|RPath], Time) :- !. dijkstra(Visited, To, RPath, Time) :- best_candidate(Visit
dijkstra([Time-[To|RPath] |_], To, [To|RPath], Time) :- !.
dijkstra(Visited, To, RPath, Time) :-
best_candidate(Visited, BestCandidate),
dijkstra([BestCandidate|Visited], To, RPath, Time).
best_candidate(VisitedPaths, BestCandidate) :-
findall(
P,
( member(Len-[State1|Path], VisitedPaths),
arc(State1, State2, Time),
\+ is_visited(VisitedPaths, State2),
NewTime is Len + Time,
P = NewTime-[State2,State1|Path]
),
Candidates
),
minimum(Candidates, BestCandidate).
% ex: minimum([0-[3,2], 4-[1]], M). ----> M = 0-[3, 2].
minimum(List, Min) :-
keysort(List, [Min|_]).
%member(Chemin,List).
is_visited(VisitedPaths, State) :-
memberchk(_-[State|_], VisitedPaths).
这是我的主要谓词
shortest_path(From, To, Path, Time) :-
dijkstra([0-[From]], To, RPath, Time),
reverse(RPath, Path).
我已经试过了
findall(Path,shortest_path(From, To, Path, Time),PathList).
member(X,PathList).
但是X多次给我相同的路径。。不确定发生了什么(算法确实有效,图形/边的实现也是如此。)你能发布你的输入数据吗,例如图形?
最短路径(状态(位置(1,1),房间1,无),状态(位置(1,2),房间1,项目),路径,时间)。
像这样吗@Damianodamianoa并且它返回我:Item=nothing,
Path=[状态(pos(1,1),room1,nothing),状态(pos(1,2),room1,nothing)],Time=1。
例如,我还想要路径:Path=[状态(pos(pos(1,1),room1,nothing),状态(pos(2,1),room1,nothing)],状态(pos(pos(2,2),room1,nothing),状态(pos,2),room1,nothing)]
例如,在2x2的方形房间中,pos(行、列)
@Hazel最好编辑您的问题以包含这些细节。读者很难在评论中找到它们,因此评论不是放置它们的合适位置。您可以发布您的输入数据,例如图表吗?最短路径(state(pos(1,1),room1,nothing),state(pos(1,2),room1,Item),path,Time)。
像这样吗@Damianodamianoa并且它返回我:Item=nothing,
Path=[状态(pos(1,1),room1,nothing),状态(pos(1,2),room1,nothing)],Time=1。
例如,我还想要路径:Path=[状态(pos(pos(1,1),room1,nothing),状态(pos(2,1),room1,nothing)],状态(pos(pos(2,2),room1,nothing),状态(pos,2),room1,nothing)]
例如,在2x2的方形房间中,pos(行、列)
@Hazel最好编辑您的问题以包含这些细节。读者很难在评论中找到它们,因此评论不是放置它们的合适位置。