hi,
ich habe mir mal die "Formeln" angesehen, aber die sind mir "zu hoch" ...
grundsätzlich kann man wohl zwischen "berechnen" (1-Baum-Reationlax, Lagrangerelaxation) und "probieren" (Nearest-Neighbor-Heuristik) unterscheiden.
ich habe ja eine "Tabelle" mit den KM Entfernungen.
1.) Als "Mensch" fange ich bei [1][1] an und suche mir den "nächsten" Kunden in der Tabelle.
2.) Danach gehe ich nach [x][1] als Anfang und suche wieder den "nächsten" Kunden wobei
a.) es nicht einer aus der Reihe "davor" sein darf
b.) es "vorwärts" und nicht "rückwärts" gehen darf
3.) wiederhole 2.) bis zum Ende
Nun brauche ich für 2.) aber eine ganze Routine für die Bedingungen a.) und b.)
Ergebnis von 3.) ist Start von 2.)
Code: Alles auswählen
Pseudocode NICHT lauffähig
aTour := {}
nNext := 1
iMax := LEN(aSammel)
FOR i := 1 TO iMax
// suche Ort
nNext := SucheOrt(aSammel,i,aTour,nNext)
// besuchte Orte
AADD(aTour,aSammel[nNext])
NEXT
FUNCTION SucheOrt(aSammel,i,aTour,nNext)
// extrahiere aktuelle Zeile
aClone := ACLONE(aSammel)
aZeile := aClone[i]
// sortiere die KM Entfernungen
ASort( aZeile,,, {|xKM,yKM| xKM[1] < yKM[1] } )
iMax := LEN(aZeile)
FOR i := 1 TO iMax
cOrt := aZeile[i]
// ist es schon in der Tour
nPosi := ASCAN(aTour, {|x| x == cOrt } )
IF nPosi > 0
// ist schon in der Tour
ELSE
// wenn neu ist das der "nächste"
nPosi := ASCAN(aSammel, {|x| x[1] == cOrt },nNext )
IF nPosi > 0
EXIT
ENDIF
ENDIF
NEXT
RETURN nPosi
was ich nun möchte ist "alles" in einem AEVAL(Codeblock) ... das müsste doch gehen
ich weiss im Augenblick nicht wie ich das "Ergebnis" von 3.) als Start von 2.) in "einem" Codeblock zusammen bekomme ... oder rekursiv ?