Liebe Community,
ich sitze momentan vor einem kleinen Problem, da ich mich wenig mit VBA bzw. programmierung im Allgemeinen auskenne aber einen 2-opt Algorithmus im Rahmen eines TSP anwenden muss. Auf meiner Suche im Internet hat ich folgenden Code gefunden, welche für ein symmetrisches TSP geschreiben wurde. Leider verstehe ich nicht, was ich mach muss um dieses Code auf ein asymmetrisches TSP umzuschreiben und wie ich meine "Daten" implementieren kann. Es wäre nett, wenn ihr mir helfen könntet. Folgend der Code und meine Distanzmatrix:
0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 0 30,3 24,7 23,8 23,3 27,3 22,5 22,7 24 24,8 25 30,1 27,2 24,2
1 30,8 0 1,2 1,9 3,1 3,3 4 4,3 4,5 5,3 4,5 1,3 2,4 5,9
2 25 1,8 0 1,1 2,1 2,7 3,6 3,9 4,1 4,9 4,8 1,6 2,6 5,5
3 23,7 2,2 0,8 0 1,2 1,9 2,6 2,9 3,1 4,2 4 2,3 2,3 4,7
4 22,8 3,4 2,2 1,4 0 1 1,7 2 2,1 3,6 3,4 2,9 2,6 4,1
5 23,7 3,6 2,2 1,8 0,9 0 1,4 1,7 1,9 3 2,9 2,8 2,1 3,6
6 22,5 4,9 3,8 3 2,4 2,1 0 1,1 1,6 4,9 4,8 4,7 3,9 3,8
7 22,8 6,2 5,1 4,2 3,7 3,5 1,1 0 1,2 3,3 3,1 6,3 5,3 2,6
8 24 5,2 4,1 3,3 2,6 2 1,5 1,6 0 3,9 3,8 4,5 3,7 3,4
9 24,4 5,3 5 4,2 3,4 2,5 3,5 3,4 2,3 0 0,21 4,4 2,4 1,6
10 24,2 5,5 5 4,2 3,6 2,3 3,3 3,2 2,1 1,2 0 4,6 2,5 1,9
11 30,3 2,5 2,5 2,3 2,5 2,7 3,4 3,8 3,9 4,7 4 0 1,9 5,3
12 29,4 3,5 3,1 2,9 3,1 4,3 4 5,5 4,4 3 2,3 2,4 0 3,8
13 25 5,9 5,9 4,9 4 3 4,1 3 2,9 0,6 0,85 5 3 0
Sub ZweiOptAlgo()
Dim i As Byte
Dim j As Byte
Dim n As Integer
Dim lzaehler As Byte
Dim m As Byte
'Entfernungsmatrix einlesen
For j = 1 To 11
For i = 1 To 11
mEntfernungsmatrix(i, j) = Cells(1 + i, 1 + j)
'Cells(i + 12, 1 + j) = mZeitenmatrix(i, j) --> nur zum Überprüfen
Next
Next
'Startlösung einlesen
n = Range("n3").CurrentRegion.Rows.Count
ReDim mStartloesung(n + 1) As Integer
For lzaehler = 1 To n
mStartloesung(lzaehler) = Cells(2 + lzaehler, 14)
Next
mStartloesung(n + 1) = 1
' Start des Algorithmus
Zeilenmarke:
For i = 1 To (n - 2)
For j = i + 2 To n
If (mEntfernungsmatrix(mStartloesung(i), mStartloesung(i + 1)) + mEntfernungsmatrix(mStartloesung(j), mStartloesung(j + 1))) > (mEntfernungsmatrix(mStartloesung(i), mStartloesung(j)) + mEntfernungsmatrix(mStartloesung(i + 1), mStartloesung(j + 1))) Then
ReDim mNeueLoesung(n + 1)
For lzaehler = 1 To (n + 1)
mNeueLoesung(lzaehler) = mStartloesung(lzaehler)
Next
m = j - i
For lzaehler = 1 To m
mNeueLoesung(i + lzaehler) = mStartloesung(j - (lzaehler - 1))
Next
For lzaehler = 1 To (n + 1)
mStartloesung(lzaehler) = mNeueLoesung(lzaehler)
Next
Exit For
Exit For
GoTo Zeilenmarke
End If
Next
Next
For lzaehler = 2 To (n)
Cells(20 + lzaehler, 17) = mStartloesung(lzaehler)
Next
End Sub
Vielen Dank!
|