我被赋予了在Prolog中编写Dijkstra最短路径的任务。
首先,我不想要源代码或完整实现,因为我正在尝试理解代码(评估的一部分将解释代码)。我看过一些实现here和there,但我真的不知道,它是如何工作的。
到目前为止,我有这个:
edge(1,2,12). %edge(From,To,Cost)
...
edge(1,4,13).
vertex(1,100000,nil,false).%vertex(Id, Weight, Over, Closed).
...
vertex(5,100000,nil,false).
neigh(V1, V2):-edge(V1,V2,_).
open_neigh(V1,V2):-edge(V1,V2,_),vertex(V2,_,_,P),not(P).
nearest_neighbor(From,Who,Cost):-findall(Node,neigh(From, Node),NeighL),
nearest_in_list(From,Who,NeighL,Cost).
n_hood(From,NeighList):-findall(Node, neigh(From,Node), NeighList).
open_n_hood(From,NeighList):-findall(Node, open_neigh(From,Node), NeighList).
nearest_in_list(_,Who,[Who],_).
nearest_in_list(From,Who,[H,K|T],Cost) :-
edge(From,H,C1),
edge(From,K,C2),
C1 =< C2,
Cost is C1,
nearest_in_list(From,Who,[H|T],Cost).
nearest_in_list(From,Who,[H,K|T],Cost) :-
edge(From,H,C1),
edge(From,K,C2),
C1 > C2,
Cost is C2,
nearest_in_list(From,Who,[K|T],Cost).
问题是,我不知道如何更新有关顶点的信息。我尝试过assert / 1并收回/ 1但它不起作用。我得到错误,我无法修改静态过程vertex / 4。
我目前正在使用SWI Prolog,但该程序应该适用于Amzi!也是Prolog,所以我希望尽可能保持与Prolog的基本接近。
感谢。
答案 0 :(得分:1)
如果您确实需要更新值,我建议您使用flag/3
。但是,正如评论中所建议的那样,Prolog程序通常没有通过算法步骤更新的“全局变量”。
相反,我建议您找到一种合适的方法来计算Dijkstra成本。请注意,Dijkstra算法中的初始参数始终是“未访问”节点,即列表([a,b,c,d|...]
)。在每个步骤中,您都可以通过“访问”其中一个节点并更新其成本来更新此列表。我在这里看到一个明确的递归电话!