Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1188to1192
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

Tipps zum Beenden der Schleife

Tipps zum Beenden der Schleife
alex
Guten Abend,
Ich arbeite zur Zeit am Traveling Salesman Problem, über das ich schon früher ein Thema erstellt habe.
Nachdem ich nun 5 Städte erfolgreich abgeliefert habe, sagte mein Professor mir, dass ich doch mal 10 nehmen sollte.
Ich habe mir nun Gedanken gemacht und bin dabei auf die Website von R.Hirte gestoßen:
http://rhirte.de/vb/travsales.htm
Das habe ich als Innovation genommen, um eine etwas abgeänderte Form über Zufallszahlen zu bekommen - allerdings mit definierten Städten, Herr Hirte nimmt einfach irgendwelche willkürlichen Städtedaten.
Das sieht bisher so aus:
Public Sub Rechnung6St()
Dim n As Integer
Dim a, b, c, d, e, f As Variant
Dim arrX, arrY, arrSt As Range
Dim arrBX, arrBY, arrBSt As Range
Dim ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy As Single
Dim tmp As Double
Dim Zeile As Long
Dim StMax As Integer
Dim str(1000, 1000) As Single
Dim Weg As Single, wegVor As Single
Dim diff As Double
Dim x, y As Integer
Dim StA As Long, StB As Long, StC As Long, StD As Long, StE As Long, StF As Long
a = Me.comSt1
b = Me.comSt2
c = Me.comSt3
d = Me.comSt4
e = Me.comSt5
f = Me.comSt6
[...]
With Worksheets("Daten")
Set arrSt = .Range("B7:B60") 'Große Daten in Arrays packen, um Zugriff zu erleichtern
Set arrX = .Range("D7:D60")
Set arrY = .Range("E7:E60")
End With
[...]
With Worksheets("Daten")
Set arrBSt = .Range("K100:K105") 'Zugriff erleichtern
Set arrBX = .Range("L100:L105")
Set arrBY = .Range("M100:M105")
End With
'Berechne Abstandsmatrix
StMax = 6
For x = 1 To StMax
For y = 1 To StMax
str(x, y) = Sqr((arrBX(x) - arrBX(y)) ^ 2 + (arrBY(x) - arrBY(y)) ^ 2)
Sheets("Matrix").Cells(x, y).Value = str(x, y)
Next y
Next x
wegVor = 100000
(Do)
Do
Randomize
StA = 1
StB = Int(6 * Rnd + 1)
StC = Int(6 * Rnd + 1)
StD = Int(6 * Rnd + 1)
StE = Int(6 * Rnd + 1)
StF = Int(6 * Rnd + 1)
Loop Until (hier steht noch ein langer text, der der schleife sagt, dass die stX-werte sich nie gleichen dürfen, der passt aber wegen der größer / kleiner zeichen nicht ins forum)
Weg = str(StA, StB) + str(StB, StC) + str(StC, StD) + str(StD, StE) + str(StE, StF) + str(StF, StA)
If Weg kleiner als wegVor Then
wegVor = Weg
End If
(Loop Until....)
Das sind die wichtigen Stellen.
Das Do und das Loop Until in Klammern sind die Stellen, wo ich eine weitere Schleife einbauen möchte.
Im optimalfall soll ja "Weg" minimal werden. Ich habe allerdings keine Ahnung, wie ich dem Programm das sage, da es ja keine festen Kombinationen durchgeht, sondern zufällig die Städte abgrast und dann das beste nehmen soll.
In der vorigen version konnte ich ja aussuchen, ob er tmp behalten soll oder ersetzen, aber hier in der Schleife muss ich ihm ja einen festen Wert als Ausgabe setzen, wann er aufhören soll... Da die Städte aber variabel sind, habe ich ja keine festen Werte dafür.
Evtl könnte man die Schleife auch 1000 mal laufen lassen, dann stehen die Chancen gut, den kürzesten Weg gefunden zu haben.
Allerdings hoffe ich, eine gute Alternative zu finden.
Danke fürs Lesen
Alex

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Tipps zum Beenden der Schleife
16.12.2010 21:16:06
alex
Das ist auch der Code von der R.Hirte-Seite. Der baut auf einer Startkombination mit Zufallszahlen auf und versucht dann, die Wege zu verkürzen und geht nicht immer neue Zufallskombinationen durch, daher ist die Schleife zur Optimierung auf mein Problem leider nicht anwendbar.
AW: Tipps zum Beenden der Schleife
16.12.2010 21:44:25
bst
Hi,
hast Du Dir die Beispielsdatei von Beate denn angeschaut?
cu, Bernd
AW: Tipps zum Beenden der Schleife
17.12.2010 08:34:41
Alex
Ich hätte gedacht, dass es eine Möglichkeit gibt, den kürzesten Weg ohne die "ich lasse die Umwege errechnen und verändere so die Strecke"-Option ermitteln zu können.
Quasi eine Messstrecke mit 1000 Wiederholungen aufnehmen und den kürzesten Weg mit der richtigen Reihenfolge stehen lassen.
Soetwas ist allerdings nicht möglich oder gibt es doch eine andere Möglichkeit, das Ergebnis etwas einfacher angeben zu lassen?
Ansonsten muss ich den Code von Beate noch auf mein Projekt anpassen.
Anzeige
AW: Tipps zum Beenden der Schleife
17.12.2010 10:03:33
bst
Hi,
da bin ich überfragt. So wie ich Wikipedia verstehe ist das TSP denn nicht einfach zu lösen.
Frage halt mal Deinen Prof, der weiß das sicherlich.
cu, Bernd

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige