Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1772to1776
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Dijkstra Code Anpassung

Dijkstra Code Anpassung
05.08.2020 21:53:05
Jan
Hallo sehr geehrtes Forum.
Ich schreibe hier, da ich noch realtiv neu im Programmieren in VBA bin, mir Beiträge dieses Forums aber immer sehr weitergeholfen haben. Sehr viele kompetente Menschen hier :-)
Nun zu meinem Problem:
Ich möchte gerne den Dijkstra-Algorithmus anwenden, um die kürzesten Pfade in einem Netzwerk zu finden. Das hat soweit auch gut geklappt, da ich folgenden Code von https://rosettacode.org/wiki/User:Klever
angepasst und verwendet habe:

'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)  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  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

Problem ist nur: ich habe eine sich verändernde Liste an Pfaden, die in einem Arbeitsblatt abgespeichert sind. Also ziemlich genau die Informationen, die gegen Ende des dargestellten Codes manuell eingegeben werden sollen (z.B. E(1,2)=10).
Ich habe es schon probiert, dass ich E mit Zellbezügen gefüllt habe (ala E(Sheet.Range, Sheet.Range)=Sheet.Range). Das funktioniert ebenfalls, aber es wird bei über 1000 Pfaden ein sehr langer Code und ab ca. 265 Einträgen sagt mir Excel, dass die Sub zu lang ist.
Meine Frage also: Kann ich die Pfade mit den Kosten auf eine bessere Art aus den Zellen auslesen und dem Algorithmus zur Verfügung stellen?
ich würde mich sehr über Antworten freuen und ich hoffe ich konnte mein Problem gut darstellen :-)
Viele Grüße,
Jan

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dijkstra Code Anpassung
05.08.2020 22:31:17
onur
DEIN CODE, besser dia ganze Datei, wäre wichtig gewesen, und nicht der Code, den du gefunden und angepasst hast.
AW: Dijkstra Code Anpassung
05.08.2020 22:53:44
onur
Trage die Werte in die Tabelle ein, dann kannst du sie in einem Rutsch einlesen.
Guckst du hier:
https://www.herber.de/bbs/user/139489.xlsm
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige