June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
80
Task/Maze-solving/Julia/maze-solving.julia
Normal file
80
Task/Maze-solving/Julia/maze-solving.julia
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
"""
|
||||
+ +---+---+
|
||||
| 1 2 3 |
|
||||
+---+ + +
|
||||
| 4 5 | 6
|
||||
+---+---+---+
|
||||
|
||||
julia> const graph = [
|
||||
0 1 0 0 0 0;
|
||||
1 0 1 0 1 0;
|
||||
0 1 0 0 0 1;
|
||||
0 0 0 0 1 0;
|
||||
0 1 0 1 0 0;
|
||||
0 0 1 0 0 0]
|
||||
|
||||
julia> dist, path = dijkstra(graph, 1)
|
||||
(Dict(4=>3,2=>1,3=>2,5=>2,6=>3,1=>0), Dict(4=>5,2=>1,3=>2,5=>2,6=>3,1=>0))
|
||||
|
||||
julia> printpath(path, 6) # Display solution of the maze
|
||||
1 -> 2 -> 3 -> 6
|
||||
|
||||
"""
|
||||
function dijkstra(graph, source::Int=1)
|
||||
# ensure that the adjacency matrix is squared
|
||||
@assert size(graph, 1) == size(graph, 2)
|
||||
inf = typemax(Int64)
|
||||
n = size(graph, 1)
|
||||
|
||||
Q = IntSet(1:n) # Set of unvisited nodes
|
||||
dist = Dict(n => inf for n in Q) # Unknown distance function from source to v
|
||||
prev = Dict(n => 0 for n in Q) # Previous node in optimal path from source
|
||||
dist[source] = 0 # Distance from source to source
|
||||
|
||||
function _minimumdist(nodes) # Find the less distant node among nodes
|
||||
kmin, vmin = nothing, inf
|
||||
for (k, v) in dist
|
||||
if k ∈ nodes && v ≤ vmin
|
||||
kmin, vmin = k, v
|
||||
end
|
||||
end
|
||||
return kmin
|
||||
end
|
||||
# Until all nodes are visited...
|
||||
while !isempty(Q)
|
||||
u = _minimumdist(Q) # Vertex in Q with smallest dist[]
|
||||
pop!(Q, u)
|
||||
if dist[u] == inf break end # All remaining vertices are inaccessible from source
|
||||
for v in 1:n # Each neighbor v of u
|
||||
if graph[u, v] != 0 && v ∈ Q # where v has not yet been visited
|
||||
alt = dist[u] + graph[u, v]
|
||||
if alt < dist[v] # Relax (u, v, a)
|
||||
dist[v] = alt
|
||||
prev[v] = u
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return dist, prev
|
||||
end
|
||||
|
||||
function printpath(prev::Dict, target::Int)
|
||||
path = "$target"
|
||||
while prev[target] != 0
|
||||
target = prev[target]
|
||||
path = "$target -> " * path
|
||||
end
|
||||
println(path)
|
||||
end
|
||||
|
||||
const graph = [
|
||||
0 1 0 0 0 0;
|
||||
1 0 1 0 1 0;
|
||||
0 1 0 0 0 1;
|
||||
0 0 0 0 1 0;
|
||||
0 1 0 1 0 0;
|
||||
0 0 1 0 0 0]
|
||||
|
||||
dist, path = dijkstra(graph)
|
||||
printpath(path, 6)
|
||||
Loading…
Add table
Add a link
Reference in a new issue