Autor Beitrag
Fiete
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 601
Erhaltene Danke: 339

W7
Delphi 6 pro
BeitragVerfasst: Di 13.11.12 15:46 
Das Problem des Handlungsreisenden (auch Rundreiseproblem) ist ein kombinatorisches Optimierungsproblem des Operations Research und der theoretischen Informatik. Die Aufgabe besteht darin, eine Reihenfolge für den Besuch mehrerer Orte so zu wählen, dass die gesamte Reisestrecke des Handlungsreisenden nach der Rückkehr zum Ausgangsort möglichst kurz(kostengünstig) ist.
Die Begriffe „Ort“ und „Entfernung“ sind nicht wörtlich zu nehmen, vielmehr repräsentieren die Orte beispielsweise zu besuchende Kunden, Bohrlöcher oder DNA-Teilstränge, während Entfernung für Reisezeit, Kosten oder den Grad der Übereinstimmung zweier DNA-Stränge steht.

Das Programm ermittelt die Rundreise nach drei Verfahren:
1) Müller - Merbach, Heuristik
2) Permutationen, alle Möglichkeiten werden gerechnet(N<13 bzw N<14 bei Symmetrie)
3) Minimumsuche, der nächst gelegene Ort wird gesucht (immer schnell, selten gut)
Die Kostenmatrix kann (un-)symmetrisch sein, es gibt zwei Beispiele, der Rang der Matrix ist auf 100 beschränkt.
Viel Spaß beim Testen
Fiete
Einloggen, um Attachments anzusehen!
_________________
Fietes Gesetz: use your brain (THINK)
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Fr 16.11.12 18:09 
Hallo,

Regeln habe ich rausgeworfen, TRichEdit habe ich wohl nicht.
Mir schmierte das Programm unter Lazarus ab natürlich ohne Fehlermeldung(, und tschüß ), wenn ich am SpinEdit die Matrix vergrößerte, aber ich habe es dann doch zügig gefunden. Es ist ja nur eine kleine Sache, Ausgabe wurde zu früh aufgerufen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
 procedure TRRP.SpinEditNChange(Sender: TObject);
  var K,Z,S:Integer;
  begin
   if SpinEditN.Text='' then
      SpinEditN.Text:='3';
   N:=SpinEditN.Value;
   SetLength(Tabelle,N+1,N+1);
   for Z:=1 to N do
    for S:=1 to N do Tabelle[Z,S]:=0;
//Ausgabe;
   FeldA.ColCount:=N+1;
   FeldA.RowCount:=N+1;
   // Hernach ist es besser..
   Ausgabe;
   for K:=1 to N do
    begin
     FeldA.Cells[K,0]:='        '+IntToStr(K);
     FeldA.Cells[0,K]:='  '+IntToStr(K);
     FeldA.ColWidths[0]:=30;
    end;
  end;

An Beispiel 2 sieht man, das Permutation etwas günstigere Werte erzeugt.
Müller - Merbach 2810€/ Permutation 2500€ und nur immer den kürzesten 3000€
Dummerweise ergab sich bei einer Zufallsmatrix 10x10 Das Müller-Merbach schlechter als Minimum-suche war.
Da Minimumsuche so sehr schnell ist, könnte man das ja auch rechnen und dann auswählen.

Gruß Horst

Für diesen Beitrag haben gedankt: Fiete
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 17.11.12 11:48 
Hallo zusammen,

ich weiß nicht, ob ihr wisst, daß man die Minimumsuche rekursiv so erweitern kann, daß sie bei "Tiefe = N" alle Möglichkeiten durchsucht - d.h. man hätte einen weiteren Parameter: Tiefe (Depth).
Ich habe dazu mal meinen C++ Code (für den Borland Builder) angehangen (TSP ruft dann intern TSP_Depth auf).
Einloggen, um Attachments anzusehen!
Fiete Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 601
Erhaltene Danke: 339

W7
Delphi 6 pro
BeitragVerfasst: So 18.11.12 15:16 
Moin Th69,
ganz verstehe ich den Quelltext nicht, kenne mich mit c++ nicht aus.
Kannst Du den Teil in Delphi kodieren?
Wann sollen alle Möglichkeiten durchgerechnet werden?
Welche Laufzeiten ergeben sich dann für große N?
Gruß Fiete

_________________
Fietes Gesetz: use your brain (THINK)
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: So 18.11.12 16:10 
Hallo,

noch ene kleine Anmerkung zur Suche durch Permutation.
Ich halte hier eine lexikalische Permutation für angebracht, wobei man immer den um (index+1) mod MaxIndex nehmen muss.
Ich muss ja beispielsweise nicht die letzten 5 Spalten 5! mal testen, wenn bis dorthin schon die minimalen Kosten schon überschritten sind.
Ich gebe zu das sind nur minimale Verbesserungen, die bei 70x70 Matritzen mit 69! > 1e99 Möglichkeiten, auch nichts mehr bringen.

Gruß Horst