I’ve been trying for a while now to implement a Dijkstra shortest path algorithm in JIProlog. There are a few implementations available online, such as here and here, but they all return the path as a list of nodes. This is problematic for my implementation, because I’m technically using a multigraph, where vertices can be connected by multiple edges. Therefore, I need an algorithm that returns a list of edges rather than a list of nodes.
I’ve been trying to adjust the first implementation I mentioned to track edges, but I get lost in the dijkstra_l/3 rule. Could someone help me? Thanks!
I answered some time ago to a similar question, with an implementation.
Alas, that code doesn’t work with the lastes SWI-Prlog, I’ve debugged and found that ord_memberchk (used for efficiency) has changed behaviour. I’ve replaced with memberchk and now is working…
I would suggest to use the output of the algorithm with a simple post processing pass that recovers the edges from nodes, selecting the smaller value. I’ve implemented as it dijkstra_edges/3
test(3) shows the implementation, I’ve added some edge with higher values to verify, the output shows that these are correctly discarded: