![]() |
Wie Suche ich in einem möglichst langen weg in einem Graphen
Hi,
Ich habe das Problem, dass ich in einem Graphen nicht einen Knoten finden, sondern möglichst viele Knoten besuchen, ohne einen doppelt zu besuchen, möchte. Also einen möglichst langen weg ohne einen Knoten doppelt zu besuchen und ohne ein festes Ziel. Ich ahb mer schon Tiefensuche, Breitensuche und A*- Suche angesehen, die scheinen aber nciht gegeinet, da sie immer einen Knoten suchen. Pelzi |
Re: Wie Suche ich in einem möglichst langen weg in einem Gra
Zitat:
Ist vielleicht nicht der schönste Weg, gibt bei Graphen eigentlich immer eine ganze Menge Algorithmen (und deren Einsatzgebiet), die sich leicht finden lassen sollten, aber man kann halt schon mit den von Dir genannten Verfahren meist sehr sehr viel erreichen. Gruß Der Unwissende |
Re: Wie Suche ich in einem möglichst langen weg in einem Gra
Hi Pelzi,
mir kommt da noch folgender Algorithmus in den Sinn: Du bestimmtst die konvexe Hülle der Knotenmenge und verbindest dann die einzelnen Knoten im Uhrzeigersinn, wobei du sie gleichzeitig aus der betrachteten Knotenmenge entfernst. Die Verbindung des letzten Knoten mit dem ersten Knoten unterlässt du dann und bildest für die Restmenge wieder die konvexe Hülle. Den letzten Knoten der ersten Hülle verbindest du mit dem nächstgelegenen der zweiten Hülle und so weiter. Bildlich entsteht soetwas wie eine Schnecke. Frohe Weihnachten |
Re: Wie Suche ich in einem möglichst langen weg in einem Gra
Zitat:
|
Re: Wie Suche ich in einem möglichst langen weg in einem Gra
Hast Du denn ein paar weitere Informationen über den Graphen? Wild alles durchprobieren wird Dich eine Menge an Rechenzeit kosten.
Denken wir doch mal an ein rechteckiges Labyrinth. Start links oben, Ende rechts unten. Wenn Du diese Punkte hast, kannst Du ja wieder suchen lassen. Und die Suche wird wichtig sein, damit der Algorithmus seinen Weg bewerten kann: In Deinem Fall je weiter vom Ziel weg, desto besser. Die Information, wie weit es zum Ziel ist, sollte vorhanden sein. Ich hatte da mal was geschrieben, das ließe sich wie schon angeregt abwandeln: ![]() |
Re: Wie Suche ich in einem möglichst langen weg in einem Gra
backtracking
|
Re: Wie Suche ich in einem möglichst langen weg in einem Gra
Zitat:
Delphi-Quellcode:
So wenn nun ein feld besucht wurde, wird nicht nur dieses Feld gelöscht sondern alle Wege, die dieses Feld überqueren würden.
procedure makegraph(var FGraph: TGraph);
var i,j,k,l: Integer; begin for i:=0 to 7 do for j:=0 to 10 do for k:=0 to 7 do for l:=0 to 10 do begin if (j=l) and (i=k) then FGraph[i,j,k,l]:=false else if j=l then FGraph[i,j,k,l]:=true else if i=k then FGraph[i,j,k,l]:=true else if (i+j)=(k+l) then FGraph[i,j,k,l]:=true else FGraph[i,j,k,l]:=false; if feldungueltig(i,j) or feldungueltig(k,l) then FGraph[i,j,k,l]:=false; end; end; Das habe ich so realiesiert:
Delphi-Quellcode:
So wenn ich nun via Backtracking vorgehe, habe ich das Problem, dass ich die Gelöschten Kanten nach einem Schritt nicht mehr wiederherrstellen kann, da ich nciiht weiß ob die Kanten die ich entfernt habe, vorher vorhanden waren oder nciht. Ich müsste also nach jedem Schritt den ganzen Graphen kopieren. Und deswegen ist Backtraking nicht der geeigneteste Algorithmus.
procedure loeschefeld(x,y: Integer);
var i,j,k,l: integer; begin for i:=0 to 7 do for j:=0 to 10 do begin FGraph[y,x,i,j]:=false; if (i=y) or (j=x) or (i+j=x+y) then for k:=0 to 7 do for l:=0 to 10 do begin if ( (i=y) and (i=k) ) and ( ( (j<x) and (x<l) ) or ( (l<x) and (x<j) ) ) then FGraph[i,j,k,l]:=false else if ( (j=x) and (j=l) ) and ( ( (i<y) and (y<k) ) or ( (k<y) and (y<i) ) ) then FGraph[i,j,k,l]:=false else if ( ( (j+i) = (y+x)) and ( (j+i) = (k+l)) ) and ( ( (i<y) and (y<k) ) or ( (k<y) and (y<i) ) ) then FGraph[i,j,k,l]:=false end; end; end; pelzi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz