Hi,
so wie ich das sehe, beschreibst du das TSP (Travelling Salesmen Problem). Bis zu einer Handvoll Punkte ist die optimale d.h. kürzeste Strecke per Bruteforce zu lösen, alles andere würde den Aufwand für eine "Hausarbeit" bei weitem sprengen.
Zitat von Wikipedia....Bei der einfachsten Variante, dem symmetrischen TSP mit Städten, gibt es verschiedene Rundreisen, das sind bei 15 Städten über 43 Milliarden und bei 18 Städten bereits über 177 Billionen. Wie schnell die Rechenzeit mit wachsender Anzahl von Städten wächst, zeigt das folgende Beispiel: hat man einen Rechner, der die Lösung für 30 Städte in einer Stunde berechnet, dann braucht dieser für zwei zusätzliche Städte annähernd die tausendfache Zeit; das sind mehr als 40 Tage....
Der Bruteforce Lösungsansatz:
Berechne die Strecken zwischen allen Punkten.
Addiere die einzelnen Strecken zum Gesamtweg zwischen Anfang und Ende, wenn jeder Punkt nur einmal angefahren wird.
Die kürzeste Strecke ist die Lösung....
Beispiel auf die schnelle...
Spoiler anzeigen
#include <Array.au3>
#include <GDIPlus.au3>
$max = 7 ;maximale Anzahl Punkte
$max_x = 500
$max_y = 500
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hgui = GUICreate("TSP-Brute", $max_x, $max_y)
GUISetState()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hgui)
$hPen = _GDIPlus_PenCreate()
Local $aArray[$max - 1] ;permutationen
For $i = 0 To $max - 2
$aArray[$i] = $i + 1
Next
Local $aNewArray = _ArrayPermute($aArray, ",") ;Using Default Parameters
;_ArrayDisplay($aNewArray, "Array Permuted")
For $i = 1 To $aNewArray[0] ;anfangs- und endpunkt anfügen
$aNewArray[$i] = "0," & $aNewArray[$i] & ",0"
Next
_ArrayDisplay($aNewArray)
[/autoit] [autoit][/autoit] [autoit]Dim $x[$max + 1], $y[$max + 1] ;koordinaten
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To $max ;zufällige koordinaten
$x[$i] = Random(1, $max_x, 1)
$y[$i] = Random(1, $max_y, 1)
Next
$kuerzeste_strecke = 1e22
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To $aNewArray[0] ;alle permutationen durchgehen
$s = StringSplit($aNewArray[$i], ",") ;permutationen aufteilen
;_arraydisplay($s)
$gesamtlaenge = 0
For $c = 2 To $s[0] ;einzelteile
$Strecke_zw_zwei_Punkten = Sqrt(($x[$s[$c - 1]] - $x[$s[$c]]) ^ 2 + ($y[$s[$c - 1]] - $y[$s[$c]]) ^ 2)
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$s[$c - 1]], $y[$s[$c - 1]], $x[$s[$c]], $y[$s[$c]], $hPen)
;~ sleep(100)
$gesamtlaenge = $gesamtlaenge + $Strecke_zw_zwei_Punkten
Next
_GDIPlus_GraphicsClear($hGraphic, 0xFFF0F0F0)
If $kuerzeste_strecke > $gesamtlaenge Then
$kuerzeste_strecke = $gesamtlaenge
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $kuerzeste_strecke = ' & $kuerzeste_strecke & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$kuerzeste_strecke_array = $i
EndIf
Next
MsgBox(0, $aNewArray[$kuerzeste_strecke_array], $kuerzeste_strecke)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit];kürzeste Strecke zeichnen
$hPen = _GDIPlus_PenCreate(0xFFFF00FF, 2)
$s = StringSplit($aNewArray[$kuerzeste_strecke_array], ",") ;permutationen aufteilen
For $c = 2 To $s[0] ;einzelteile
;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $c = ' & $c & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
$Strecke_zw_zwei_Punkten = Sqrt(($x[$s[$c - 1]] - $x[$s[$c]]) ^ 2 + ($y[$s[$c - 1]] - $y[$s[$c]]) ^ 2)
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$s[$c - 1]], $y[$s[$c - 1]], $x[$s[$c]], $y[$s[$c]], $hPen)
; $gesamtlaenge = $gesamtlaenge + $Strecke_zw_zwei_Punkten
Next
While GUIGetMsg() <> -3
WEnd