Autor Beitrag
pagan1900
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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

ausblenden 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;       // Neuen Vektor finden

     for locali:= 1 to m do
      begin
        NotOK:=((a1 = a[locali]) and (b1 = b[locali])) or  // V1 =  V[I] oder
               ((b1 = a[locali]) and (a1 = b[locali]));    // V1 = -V[I]
        if NotOK then break;
            // Wenn NotOK, also der Vektor schon vorhanden ist,
            // dann Abbruch der FOR-Schleife.
      end;


und hier die stelle wo es reinkommen soll:
ausblenden volle Höhe 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:
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); //anzahl der Pfeile wird festgestellt

    //wertelegen(Anf,Ende,Kosten);

    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;
   
  {Eingaben}
    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;
// ** Einzelner Pfeil
          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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 05.06.06 22:46 
Wenn m ungefähr = n*n ist, dann kann es nicht funktionieren.
Versuche es lieber so:
ausblenden 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;
//
// Alle möglichen Vektoren erzeugen
//
  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;
//
// Mischen nach Miller-Yates  
//
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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