سلام و وقت بخیر
من یه کد آماده از سایت rosettacode.org/wiki/User:Klever#Dijkstra_algorithm دارم که نمیتونم توی اکسل اجراش کنم؛کسی میتونه کمکم کنه که چرا اجرا نمیشه؟
هیچ خطایی هم نمیده ولی خروجی هم نداره :|
ممنون
من یه کد آماده از سایت rosettacode.org/wiki/User:Klever#Dijkstra_algorithm دارم که نمیتونم توی اکسل اجراش کنم؛کسی میتونه کمکم کنه که چرا اجرا نمیشه؟
هیچ خطایی هم نمیده ولی خروجی هم نداره :|
ممنون
کد:
'Dijkstra globals Const MaxGraph As Integer = 100 'max. number of nodes in graph Const Infinity = 1E+308 Dim E(1 To MaxGraph, 1 To MaxGraph) As Double 'the edge costs (Infinity if no edge) Dim A(1 To MaxGraph) As Double 'the distances calculated Dim P(1 To MaxGraph) As Integer 'the previous/path array Dim Q(1 To MaxGraph) As Boolean 'the queue Public Sub Dijkstra(n, start) 'simple implementation of Dijkstra's algorithm 'n = number of nodes in graph 'start = index of start node 'init distances A For j = 1 To n A(j) = Infinity Next j A(start) = 0 'init P (path) to "no paths" and Q = set of all nodes For j = 1 To n Q(j) = True P(j) = 0 Next j Do While True 'loop will exit! (see below) 'find node u in Q with smallest distance to start dist = Infinity For i = 1 To n If Q(i) Then If A(i) < dist Then dist = A(i) u = i End If End If Next i If dist = Infinity Then Exit Do 'no more nodes available - done! 'remove u from Q Q(u) = False 'loop over neighbors of u that are in Q For j = 1 To n If Q(j) And E(u, j) <> Infinity Then 'check if path to neighbor j via u is shorter than current estimated distance to j alt = A(u) + E(u, j) If alt < A(j) Then 'yes, replace with new distance and remember "previous" hop on the path A(j) = alt P(j) = u End If End If Next j Loop End Sub Public Function GetPath(source, target) As String 'reconstruct shortest path from source to target 'by working backwards from target using the P(revious) array Dim path As String If P(target) = 0 Then GetPath = "No path" Else path = "" u = target Do While P(u) > 0 path = Format$(u) & " " & path u = P(u) Loop GetPath = Format$(source) & " " & path End If End Function Public Sub DijkstraTest() 'main function to solve Dijkstra's algorithm and return shortest path between 'a node and every other node in a digraph ' define problem: ' number of nodes n = 5 ' reset connection/cost per edge For i = 1 To n For j = 1 To n E(i, j) = Infinity Next j P(i) = 0 Next i ' fill in the edge costs E(1, 2) = 10 E(1, 3) = 50 E(1, 4) = 65 E(2, 3) = 30 E(2, 5) = 4 E(3, 4) = 20 E(3, 5) = 44 E(4, 2) = 70 E(4, 5) = 23 E(5, 1) = 6 'Solve it for every node For v = 1 To n Dijkstra n, v 'Print solution Debug.Print "From", "To", "Cost", "Path" For j = 1 To n If v <> j Then Debug.Print v, j, IIf(A(j) = Infinity, "---", A(j)), GetPath(v, j) Next j Debug.Print Next v End Sub
کامنت