AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TSP: Nearest-Neighbour-Method

Ein Thema von fkerber · begonnen am 29. Dez 2005 · letzter Beitrag vom 29. Dez 2005
Antwort Antwort
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#1

TSP: Nearest-Neighbour-Method

  Alt 29. Dez 2005, 16:40
Hi!
Nachdem ich jetzt den Text geschrieben habe, ist mir mal aufgefallen, wie lang er geworden ist. Deswegen also schonmal vorab danke fürs Lesen.

Momentan bin ich dabei, mehrere Lösungswege zu implementieren, um das Travelling-Salesman-Problem (Problem des Handlungsreisenden) zu lösen. Als einen einfachen Lösungsansatz gibt es da die Nearest-Neighbour-Method (Nächster-Nachbar-Methode). Ausgehend von der Startstadt wird immer die nächste noch nicht besuchte Stadt angefahren.

Leider habe ich keine Implementierungen gefunden und habe es dann jetzt selbst gemacht (eigentlich ja auch Sinn der Übung )
Funktionieren tut das Ganze eigentlich recht gut, aber ich frage mich jetzt, wie gut der Algorithmus ist. Deswegen versuche ich mal, ihn hier zu erläutern und vielleicht kann ja jemand Verbesserungsvorschläge unterbreiten.

Delphi-Quellcode:
  cities: array of TPoint;
  distances: array of array of extended;
In cities werden die X/Y-Koordinaten der Städte gespeichert (Das ganze ist dynamisch, da der User per Klick auf ein Image die Städte einfügen kann). distances enthält jeweils die Entfernung zu den anderen Städten. Es ist also folglich ein zweidimensionales Array mit folgendem Aufbau:
distances[0][0]=Abstand der Stadt 0 zu sich selbst (=0)
distances[0][1]=Abstand der Stadt 0 zur Stadt 1
distances[1][1]=Abstand der Stadt 1 zu sich selbst (=0)
distances[i][j]=Abstand der Stadt i zur Stadt j


Dabei wird distances so gefüllt:
Delphi-Quellcode:
var i,j: integer;
begin
for i:=0 to length(cities)-1 do
 begin
  setlength(distances[i],0);
  for j:=0 to length(cities)-1 do
   begin
     setlength(distances[i], length(distances[i])+1);
     distances[i][j]:=sqrt(sqr(cities[i].X-cities[j].X) + sqr(cities[i].y-cities[j].y));
   end;
 end;
end;
Kernstück der ganzen Sache ist ja jetzt das Finden der jeweils nächsten Stadt. Also übergebe ich meiner Funktion distances[i], wobei i die Nummer der Stadt ist, in der ich mich befinde und von der aus, ich die nächstgelegene Stadt suche.
Die Funktion sieht folgendermaßen aus:

Delphi-Quellcode:
function Find_Min(Arr: array of extended): Integer; //liefert Index auf nächste Stadt
var
  i, m: Integer;
begin
  m:=0;
  while ((arr[m]=0) and (m < high(arr))) do inc(m);
  for i:=1 to High(Arr) do
    if ((Arr[i]< Arr[m]) and (arr[i]>0)) then m:=i;
  if arr[m]=0 then m:=0;
  Result:=m;
end;
Wie ihr seht, werden die Städte, mit Entfernung 0 übergangen (while-Schleife). Das soll so sein, da ich einfach die Entfernung zu bereits besuchten Städten auf 0 setze. Sollte die Entfernung zu allen Städten 0 betragen, dann wird als nächste Stadt die Anfangsstadt zurückgegeben.
Nachdem also die jeweils nächste Stadt gefunden wurde, werden die Entfernungen aller Städte zur gefundenen auf 0 gesetzt:
Delphi-Quellcode:
 for j:=0 to length(distances)-1 do
  distances[j][mindistcity]:=0; //mindistcity = Index auf nächste Stadt
Ihr seht, es sind also ein paar Schleifen drin und deswegen habe ich das Gefühl, das das Ganze, sagen wir mal "suboptimal" ist
Vielleicht habt ihr Verbesserungsvorschläge...

Ciao und Danke
Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von dahead
dahead

Registriert seit: 16. Mai 2005
620 Beiträge
 
#2

Re: TSP: Nearest-Neighbour-Method

  Alt 29. Dez 2005, 17:38
mhh, was mir auffällt ist, dass du Setlength innerhalb von zwei Schleifen ausführst. Um das zu verhindern, solltest du Setlength anfangs _vor_ jeder Schleife ausführen.

was den restlichen code angeht: keine ahnung wie ich das angehen würde, kann dir daher diesbezüglich keine (optimierungs-)tipps geben.

wie ist denn die geschwindigkeit?
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#3

Re: TSP: Nearest-Neighbour-Method

  Alt 29. Dez 2005, 18:34
Hi!

Stimmt, das ist schonmal ein Argument.
Ich weiß ja, wie weit die Schleife geht, danke.


Ciao Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: TSP: Nearest-Neighbour-Method

  Alt 29. Dez 2005, 19:07
Hallo Frederic,

von der Distanzmatrix musst du nur das obere Dreieck speichern:

Delphi-Quellcode:
function GetDistances(ap: TPointDynArray): TDistDynArray;
var
  iRow, iCol: integer;
begin
  SetLength(Result, Pred(Length(ap)));
  for iRow := Low(ap) to Pred(High(ap)) do
  begin
    SetLength(Result[iRow], Pred(High(ap) - iRow));
    for iCol := Low(Result[iRow]) to High(Result[iRow]) do
      Result[iRow, iCol] := Distance(ap[iRow], ap[Succ(iRow + iCol)]);
  end;
end;
Reduziert die Einträge von n**2 auf (n/2)(n-2).

Grüße vom marabu
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: TSP: Nearest-Neighbour-Method

  Alt 29. Dez 2005, 19:33
Hier eine Lösung, die genetische Programmierung verwendet. Echt geil!
http://www.torry.net/quicksearchd.ph...ling&Title=Yes
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#6

Re: TSP: Nearest-Neighbour-Method

  Alt 29. Dez 2005, 19:42
in der ct war in diesem jahr ein anderer netter algo. dieser hatte sich etwas von ameisen abgeschaut.
dieser algo war auch sehr effektiv.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#7

Re: TSP: Nearest-Neighbour-Method

  Alt 29. Dez 2005, 23:19
Hi!

@marabu:
Danke. Klingt logisch, den Code schau ich mir morgen an. Vielen Dank.

@alzamair:
Danke, werd ich mir auch mal anschauen

@generic:
Genau den zu implementieren ist das eigentliche Ziel der Arbeit. Es soll dabei dann aufgezeigt werden, dass er effektiver ist, als der Nearest-Neighbour. Deswegen zunächst diese Implementierung.


Ciao Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz