在prolog中使用Dijkstra算法查找所有路径

在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算法的作业。 这个算法允许我计算一个图的单一最优路径,但是,我 希望在不修改算法(但使用算法)的情况下,计算使用时间不超过特定给定限制的所有路径。我不知道如何在Prolog中做到这一点

这是我的代码。

     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最好编辑您的问题以包含这些细节。读者很难在评论中找到它们,因此评论不是放置它们的合适位置。