Autor |
Beitrag |
pagan1900
      
Beiträge: 22
|
Verfasst: Mo 05.06.06 12:19
das problem liegt im folgenden code,
die frage ist wie löse ich die endloschleiferrei auf, damit es läuft?
die procedure soll werte generieren a1,b1 und zwar so, dass die konstelation mit den schon abgespeicherten vergleichen wird und somit nur unterschiedliche wertepaare gespeichert werden
ein pfeil besteht aus: Anf->Ende in diesem fall a,b //enthält die vorrangespeicherten werte für Anf und Ende, sind also 2 arrays!
Symptome meines problems:
1. Graphen mit 2 und 3 knoten lassen sich überhauptnicht generieren,
2. Graphen mit 4 knoten funktionieren nur bis zu einem gewissen wiederholungsvorgang
(erneutes aufrufen)
3. 5-8 laufen anscheinend anstandslos
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure a_b_Pfeilnur1mal(a,b:TPfeil;var a1,b1:integer); var locali:word; notOK:boolean; begin notok:=false; repeat repeat a1:=random(n)+1; b1:=random(n)+1; until a1<>b1; for locali:= 1 to m do begin NotOK:=((a1 = a[locali]) and (b1 = b[locali])) or ((b1 = a[locali]) and (a1 = b[locali])); if NotOK then break; end; |
und hier die stelle wo es reinkommen soll:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| procedure TfrmUebung.Button1Click(Sender: TObject); var x1,y1,x2,y2:integer; locali,localj:word; a1,b1:word; px1,px2:word; Gewichtung:string; begin m:=m_bestimmen(min_m,m_max); for locali:= 1 to m do begin a_b_Pfeilnur1mal(Anf,Ende,a1,b1); Anf[locali]:=(a1); Ende[locali]:=(b1); Kosten[locali]:=Kosten_bestimmen; end; for locali:=1 to m do begin px1:=Anf[locali]; px2:=Ende[locali]; Gewichtung:=inttostr(Kosten[locali]); with imgGraph,imgGraph.Canvas do begin Font.Name := 'Arial'; Font.Height := 30; X1 := (Kx[px1]); Y1 := (Ky[px1]); X2 := (Kx[px2]); Y2 := (Ky[px2]); setzeKnoten(Canvas,Kx,Ky,KRadius,Startknoten); Brush.Color := clBlack; ZeichneVerbindungspfeil(Canvas,x1,y1,x2,y2,KRadius,Offset); pfeilbewertung (x1,y1,x2,y2,KRadius,Offset,Gewichtung,Canvas); end; end; end; |
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 05.06.06 22:46
Wenn m ungefähr = n*n ist, dann kann es nicht funktionieren.
Versuche es lieber so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| Procedure CreateUniqueRandomVectors (Var V : Array Of TPoint; aMaxValue : Integer); Var V : Array Of TPoint; n,i,j : Integer; T : TPoint;
Begin n := 0; SetLength (V, aMaxValue*(aMaxValue-1)); For i:=0 to aMaxValue - 1 do For j :=i+1 to aMaxValue - 1 do begin V[n] := Point (i,j); inc (n); End; For I := 0 to n - 1 do begin J := I + Random (n - I); T := V[J]; V[J] := V[I]; V[I] := T; end; end; |
Diese Routine erzeugt ein zufälliges Array von Vektoren, wobei jeder Vektor (i,j) nur einmal vorkommt, ebenso kommt (j,i) nicht vor. Das wolltest du doch, oder?
_________________ Na denn, dann. Bis dann, denn.
|
|
pagan1900 
      
Beiträge: 22
|
Verfasst: Mo 05.06.06 22:54
Nein leider nicht!
folgendes:
Ich soll ein lernprogramm für den dijkstra schreiben und aus vereinfachungsgründen wollte ich den graphen per rendom erstellen
ich mus zahlenwerte generieren und in dem sinne keine x/y werte
die x/y werte hab ich festgelegt und auf die brauche ich nur noch zuückgreifen!
ich benötige eigentlich "nur" zahlen von 1->maximal 8, je nach der anzahl der knoten!
in den arrays soll also nur hinnein Anf (1)//Knoten eins
ende(2)//knoten zwei
usw..
fo
es ist nur wichtig, das:
for laufvar1:=1 to m do
for laufvar2:=1 to m do
begin
repeat
...
until Anf[laufvar1] and ende[laufvar1]<>Anf[laufvar2]and Ende[laufvar2]
end;
ich muss erreichen das die konstelationen sprich array1[1] und Array2[1] mit den anderen
übrigen paaren verglichen wird und somit nur exact einmal vorkommt!
für jeden pfeil benötige ich anfang,ende,und dessen bewertung
das problem war ja das die werte(bzweise der pfeil) für den dijkstra benötigt werden
und wenn ich nämlich mehrmals gleiche pfeil habe mit unter schiedlichen gewichtungen, kann es ja natürlich sein, das der benutzer einen der vorherigen "pfeile" markiert hat, aber der algo mit einer weitaus niedrigeren pfeilbewertung rechnet. Die folge währe natürlich, das die Lösung des benutzers nicht mit der lösung des programms übereinstimmt und bumm ein Fehler!
bsp:
Anf |1|2|3|4|1|
ende |2|3|4|1|2|
kosten |9|3|2|5|8|
und wie du siehst währe dann das problem die sdache mit 1->2 mit 2 unterschidlichen gewichtungen!
und deswegen benötige ich einen algo der mir garantiert, dass jeder mögliche (begrenzt duch die naximale Pfeilanzahl, bestimmt durch di anzahl der knoten) pfeil unterschiedlich ist
|
|
|