Dijkstra算法 julia實現

Dijkstra算法 julia實現

定義網絡

N1 = Dict("N5"=>12)
N2 = Dict("N5"=>21)
N3 = Dict("N5"=>12)
N4 = Dict("N5"=>49)
N5 = Dict("N1"=>12,"N2"=>21,"N3"=>12,"N4"=>49,"N6"=>2)
N6 = Dict("N13"=>100,"N12"=>14,"N5"=>2)
N7 = Dict("N12"=>23,"N8"=>9)
N8 = Dict("N12"=>123,"N7"=>9,"N9"=>9,"N13"=>21)
N9 = Dict("N8"=>9,"N12"=>12,"N10"=>23)
N10 = Dict("N9"=>23,"N11"=>23,"N12"=>25)
N11 = Dict("N12"=>9,"N10"=>23)
N12 = Dict("N6"=>14,"N13"=>15,"N14"=>34,"N15"=>7,"N11"=>9,"N10"=>25,"N9"=>12,"N8"=>123,"N7"=>23)
N13 = Dict("N6"=> 100,"N8"=>21,"N14"=>12,"N12"=>15)
N14 = Dict("N13"=>12,"N12"=>34,"N15"=>123)
N15 = Dict("N14"=>123,"N12"=>7)
network_node = Dict("N1"=>N1,"N2"=>N2,"N3"=>N3,"N4"=>N4,"N5"=>N5,"N6"=>N6,"N7"=>N7,"N8"=>N8,"N9"=>N9,"N10"=>N10,"N11"=>N11,"N12"=>N12,"N13"=>N13,"N14"=>N14,"N15"=>N15)

算法實現

function dij(node_name,G)#以哪個結點創造最短路徑表,網絡list
    #定義每個頂點的標籤D[v]並賦值,本節點賦值爲0,其他結點賦值爲無窮
    D_v = Dict()
    for (i,k) in G
        push!(D_v,i => Inf)
    end
    D_v[node_name] = 0
    #定義一個空集合C
    C_name = []
    C_D = []
    #選最短的一個u放進C集合
    while(true)
        min = findmin(D_v)
        push!(C_name,min[2])
        push!(C_D,min[1])
        
        #更新集合u所達到的節點(節點需要在C之外)
        for (name,Dij) in G[min[2]]
            if !(name in C_name)
            D_v[name] = Dij + D_v[min[2]] 
            end
        end
        delete!(D_v,min[2])
        if D_v.count <= 0 
            break
        end
    end
    Dict(zip(C_name, C_D))
end
print(dij("N5",network_node))

可視化網絡

using PyCall
@pyimport networkx as nx
@pyimport matplotlib.pyplot as plt
G = nx.MultiGraph()
for (i,v) in network_node
    G.add_node(i,desc = i)
end
for (i,j) in network_node
    for (h,v) in j
        G.add_edge(i,h,D = v)
    end
end
pos = nx.spring_layout(G)
nx.draw(G, pos)
node_labels = nx.get_node_attributes(G, "desc")
nx.draw_networkx_labels(G, pos, labels=node_labels)
edge_labels = nx.get_edge_attributes(G,"D")
nx.draw_networkx_edge_labels(G, pos, labels=edge_labels)
plt.show()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章