Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#12

Re: Hilfe bei einer Simulation

  Alt 1. Jan 2009, 16:15
In dieser Methode kannst du dich schon mal recht lange aufhalten:

Delphi-Quellcode:
procedure Bewegen(var Objekt: TLebensform);
var i: integer;
begin
  repeat
    case random(3) of
    0: Objekt.ix := Objekt.ix - 1;
    1: Objekt.ix := Objekt.ix;
    2: Objekt.ix := Objekt.ix + 1;
    end;
  until Objekt.ix > 1;

  repeat
    case random(3) of
    0: Objekt.iy := Objekt.iy - 1;
    1: Objekt.iy := Objekt.iy;
    2: Objekt.iy := Objekt.iy + 1;
    end;
  until Objekt.iy > 1;
end;
Nehmen wir mal an, ix ist am Anfang 1 (passiert dann, wenn der Elternteil auf 2 sitzt) und der erste Aufruf von Random(3) gibt 0 zurück, dann kann es recht lange dauern, bis ix > 1 wird. Wenn das Ganze erstmal ins Negative abdriftet, brauchst du schon eine ganze Menge 2er Ergebnisse um über 1 zu kommen, denn jede 0 zieht dich wieder zurück. Da du eh nur Werte > 1 akzeptierst, kannst due das Ganze auch direkt nach unten begrenzen anstatt das dem Zufallsgenerator zu überlassen.

Delphi-Quellcode:
procedure Bewegen(var Objekt: TLebensform);
begin
  case random(3) of
    0: Objekt.ix := Objekt.ix - 1;
    1: Objekt.ix := Objekt.ix;
    2: Objekt.ix := Objekt.ix + 1;
  end;
  if Object.ix < 2 then Object.ix := 2;

  case random(3) of
    0: Objekt.iy := Objekt.iy - 1;
    1: Objekt.iy := Objekt.iy;
    2: Objekt.iy := Objekt.iy + 1;
  end;
  if Object.iy < 2 then Object.iy := 2;
end;
Nebenbei, was ist eigentlich mit den oberen Schranken?

Ein weiterer Geschwindigkeitsvorteil läßt sich herausholen, wenn du die Sequenz

Delphi-Quellcode:
              SetLength(LebenTemp,Length(Lebensform1));
              for iIndex := 0 to Length(LebenTemp)-1 do
                begin
                  LebenTemp[iIndex].ix := Lebensform1[iIndex].ix;
                  LebenTemp[iIndex].iy := Lebensform1[iIndex].iy;
                  LebenTemp[iIndex].iNahrung := Lebensform1[iIndex].iNahrung;
                  LebenTemp[iIndex].iWasser := Lebensform1[iIndex].iWasser;
                  LebenTemp[iIndex].iSchwanger := Lebensform1[iIndex].iSchwanger;
                  LebenTemp[iIndex].bFortpflanzen := Lebensform1[iIndex].bFortpflanzen;
                end;
              SetLength(Lebensform1, Length(LebenTemp)+8);
              for iIndex := 0 to Length(LebenTemp)-1 do
                begin
                  Lebensform1[iIndex].ix := LebenTemp[iIndex].ix;
                  Lebensform1[iIndex].iy := LebenTemp[iIndex].iy;
                  Lebensform1[iIndex].iNahrung := LebenTemp[iIndex].iNahrung;
                  Lebensform1[iIndex].iWasser := LebenTemp[iIndex].iWasser;
                  Lebensform1[iIndex].iSchwanger := LebenTemp[iIndex].iSchwanger;
                  Lebensform1[iIndex].bFortpflanzen := LebenTemp[iIndex].bFortpflanzen;
                end;
              iIndez := 0;
durch folgendes ersetzt:

Delphi-Quellcode:
              
              iIndez := Length(Lebensform1);
              SetLength(Lebensform1, iIndez + 8);

Allerdings wird dir das Ganze irgendwann auch nichts mehr nützen, da bei entsprechend vielen Lebensformen der Berechnungsuafwand halt immer größer wird und auch mehr Zeit beansprucht. In dem Fall muss das Simulationsintervall Wohl oder Übel erhöht werden.
Uwe Raabe
  Mit Zitat antworten Zitat