Usual shortest path
In this first tutorial, we will use the basic_shortest_path
method to solve the usual shortest path problem (no constraints and linear cost) :
\[\min_{P\in \mathcal{P_{od}}} \sum_{a\in P} c_a\]
This example is mainly for tutorial purposes. You will achieve better performance by using directly one of the shortest paths algorithms from Graphs.jl or implementing your own Dijkstra/dynamic programming algorithm.
Let's import the package, and fix the seed for reproducibility.
using ConstrainedShortestPaths
using Random
Random.seed!(67)
include("utils.jl"); # imports random_acyclic_digraph
We wreate a random acyclic directed graph
nb_vertices = 50
g = random_acyclic_digraph(nb_vertices)
{50, 535} directed simple Int64 graph
The adjacency matrix is triangular
adjacency_matrix(g)
50×50 SparseArrays.SparseMatrixCSC{Int64, Int64} with 535 stored entries:
⎡⠈⠲⣓⢼⡝⠷⡍⢼⠔⠩⣄⠹⡁⣚⠸⡺⠡⢋⠱⠒⡆⡄⡟⣔⢁⎤
⎢⠀⠀⠈⠢⡆⢊⢦⣒⣊⡅⣗⡣⡑⡂⠘⡅⡡⢉⢄⣎⣖⠞⠜⡟⠾⎥
⎢⠀⠀⠀⠀⠈⠺⣸⣅⣈⠒⠂⠄⡠⣕⢏⢰⡋⠮⠘⠂⠌⠈⣑⠒⠊⎥
⎢⠀⠀⠀⠀⠀⠀⠈⠪⡉⣰⢅⡭⠿⠉⡎⠗⣂⠴⡋⣠⡜⢝⠓⠹⡪⎥
⎢⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⡰⢈⢄⠂⡘⡑⢎⢃⠗⠋⡄⠐⢏⠠⡟⎥
⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠪⡩⠸⣎⡮⡉⡠⠀⡠⡉⠤⢑⢒⡳⎥
⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠢⣱⡔⠔⣸⢡⠲⣍⡱⢜⠔⠦⎥
⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠢⣈⠝⠐⢅⡈⠍⠶⡍⣚⎥
⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⡤⡤⢠⢗⡟⣂⣃⎥
⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠪⣁⣨⠐⢸⠁⎥
⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣊⣕⡐⎥
⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠲⣉⎥
⎣⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⎦
Create a cost matrix with random values
using SparseArrays
distance_list = [rand() * 20 - 5 for _ in 1:ne(g)]
I = [src(e) for e in edges(g)]
J = [dst(e) for e in edges(g)]
cost_matrix = sparse(I, J, distance_list);
Compute the shortest path
p_star, c_star = basic_shortest_path(g, 1, nb_vertices, cost_matrix)
@info "Solution found" c_star p_star'
┌ Info: Solution found
│ c_star = -30.89060568174394
│ p_star' =
│ 1×17 adjoint(::Vector{Int64}) with eltype Int64:
└ 1 5 6 9 10 11 14 15 23 26 27 36 42 43 47 48 50
We can check that we obtain the same results with the dynamic programming algorithm from Graphs.jl
p = enumerate_paths(bellman_ford_shortest_paths(g, 1, cost_matrix), nb_vertices)
c = sum(cost_matrix[p[i], p[i + 1]] for i in eachindex(p[1:(end - 1)]))
@info "Bellman" c p'
┌ Info: Bellman
│ c = -30.89060568174394
│ p' =
│ 1×17 adjoint(::Vector{Int64}) with eltype Int64:
└ 1 5 6 9 10 11 14 15 23 26 27 36 42 43 47 48 50
This page was generated using Literate.jl.