AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Hilfe bei einer Simulation

Ein Thema von BAMatze · begonnen am 1. Jan 2009 · letzter Beitrag vom 3. Jan 2009
Antwort Antwort
Seite 2 von 2     12   
ConstantGardener

Registriert seit: 24. Jan 2006
Ort: Halberstadt
375 Beiträge
 
Delphi 10.4 Sydney
 
#11

Re: Hilfe bei einer Simulation

  Alt 1. Jan 2009, 14:56
Hallo BamMatze,

ich hab mir die Quellen jetzt nicht so genau angeschaut aber mir fehlt noch ein TreeView1.Items.BeginUpdate bzw. TreeView1.Items.EndUpdate vor bzw. nach dem aktualisieren des Treeview. Das sollte das aktualisieren des Baums signifikant beschleunigen.


cu cg
Andreas Schachtner
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

Re: Hilfe bei einer Simulation

  Alt 1. Jan 2009, 15: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
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Hilfe bei einer Simulation

  Alt 1. Jan 2009, 23:05
Dein größtes Problem sind die dynamischen Arrays. Dort muss das Array immer komplett umkopiert werden, wenn sich die Größe ändert. Dies ist erforderlich, damit die Elemente garantiert hintereinander liegen und man so indiziert darauf zugreifen kann.
Dieser direkte Indexzugriff ist für das Programmieren ja ganz angenehm, aber hier führt es eben zu den erwähnten Nachteilen.
Bau dir verkette Listen, damit wirst du auf jeden Fall glücklicher. Trotzdem wird dir auch ein Speicherproblem entgegen treten. Deine Struktur wächst immens, das solltest du ebenfalls bedenken.
Die Verwendung von Threads klingt ja ganz interessant, allerdings sollte man in einer Anwendung niemals mehr als 15 Threads benutzen. Das ist natürlich nur ein Richtwert, bei dir wird das dann aber eher >1000 Threads und das wird Windows nicht lange mitmachen.

Also du siehst, dieses Problem kann man nur mit einer adäquaten Datenstruktur lösen. Und diese muss gut durchdacht sein.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: Hilfe bei einer Simulation

  Alt 2. Jan 2009, 23:38
Schade das du dich nicht mehr gemeldet hast. Ich habe mich mal dran versucht und das ganze ein bischen umgebaut. Hoffe ich habe nicht zu viel von der urspünglichen Funktionalität rausgenommen.
Angehängte Dateien
Dateityp: zip lebenssimulation_913.zip (201,2 KB, 15x aufgerufen)
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Hilfe bei einer Simulation

  Alt 3. Jan 2009, 07:50
Hallo Omata,

schaue mir jetz mal an, was du mir geschickt hast, hab gestern um die Zeit schon im Bett gelegen, konnte mich also nicht mehr melden . Aber danke schon mal für deine Hilfe.
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#16

Re: Hilfe bei einer Simulation

  Alt 3. Jan 2009, 08:01
@Omata super Ding das.

Genau so hab ich mir das vorgestellt. Hab gerade nur mal laufen lasse, bis 50000 Lebensformen existiert haben und in der Rechnerperformence war über haupt nichts auszusetzen. Muss zwar jetzt erstmal deinen Quellcode analysieren, um zu verstehen, wie du die Effektivietät mehr als verfünfzig facht hast, aber noch mal ein großes Danke.

BAMatze
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz