Array von Klassen



  • Hallo

    @ Braunstein : aber dafür must du dann ggf. durch hunderter gelöschter Instanzen iterieren. Ist eben abzuwägen, ob mehr iteriert oder gelöscht/erstellt wird.

    bis bald
    akari



  • Ich denke mal, dass löschen und neu erstellen ziemlich langsam ist. Es müssten schon sehr viele Iterationen werden um da langsamer zu werden. Die endgültige Wahrheit darüber kann aber nur ein Versuch bringen.



  • es würde ja ein einfaches Überschreiben der Klassenmembervariablen genügen. Im Sinne von:
    Ist Organismus 500 gestorben, dann wird Klassen-Array[500] frei, z.B. über ein flag gekennzeichnet - und dann aussortiert. Die Nummer 500 wird auf einen Stack geschrieben.
    Nun wird ein Organismus (in derselben Runde oder später) geboren. Diesem wird jetzt vom Stack die erste Nummer geholt, 500 in diesem Fall, und alle Klassenmembervariablen dieser Klasse mit entsprechenden Werten neu gesetzt.
    vielleicht nicht sehr elegant 😕

    So hatte ich mir das gedacht. Keine Ahnung wie schnell das geht. Bei 1000 Klasseninstanzen kann Geschwindigkeit aber ein nicht zu vernachlässigbarer Faktor sein ;).

    Bra.



  • Da du doch eigentlich immer alle Elemente testen mußt (tote und lebende) macht es doch eigentlich keinen Sinn hier das Array ständig zu verändern.



  • wenn du ein array fester größe verwendest, kann es schon sinnvoll sein, die indizes der gelöschten auf nem stack vorzuhalten. andererseits könntest du aber auch eine linkedlist verwenden, die toten einfach rauslöschen und die neuen ans ende klatschen.

    bei nur 1000 instanzen wird das ganze idr aber noch fix genug sein, als dass man selbst bei größten verrenkungen nen unterschied merkt.



  • Wie Braunstein schon angedeutet hat, macht es bei einer Art "Game Of Life", das heißt einem zellulären Automaten, keinen Sinn, Organismen aus dem Array zu löschen, weil jeder Organismus samt bestimmten Nachbarn gecheckt werden muss, um zu entscheiden, ob er überlebt, stirbt, zum Leben erwacht, oder sonst was mit ihm passiert.



  • gestorbene Organismen haben keinerlei Funktion mehr, insbes. auf das Überleben der Anderen. Auch eine Reinkarnation ist nicht geplant. Sie im Array zu belasen würde doch heissen, eine Menge Schrott zu verwalten. Ich würde Sie daher schon gerne löschen.
    Vielleicht ist aber ein Sortieralgorithmus angebracht, der alle toten Organismen löscht und anschließend die Lücken "zusammenschiebt", damit ein neuer Organismus die Nummer: lebende Organismen + 1 zugewiesen bekommen kann.
    Auf jeden Fall hilft es sich vor dem programmieren darüber Gedanken zu machen. 😉
    Erst einmal vielen Dank bis hierher!
    Bra.



  • Hallo

    Vielleicht ist aber ein Sortieralgorithmus angebracht, der alle toten Organismen löscht und anschließend die Lücken "zusammenschiebt", damit ein neuer Organismus die Nummer: lebende Organismen + 1 zugewiesen bekommen kann.

    was fast automatisch schonmal std::vector macht.
    Sprich du must nur mit erase ein oder mehrere Elemente löschen.

    bis bald
    akari



  • hi

    also die frage stellt sich, ob Deine organismen beweglich sind oder nicht.
    falls nicht, wie im original game of life, genügt ein statischer 2D array von ein/aus objekten, selbst mit nem weiteren zustand "halbtot" lässt sich das noch ohne viel speicher realisieren. sowas hab ich schonmal gemacht, aber mit delphi. (graphisch mit zustandsbuttons dargestellt, die auch gleich zum setzten der startbedingungen fungierten). die zelle wird aktiviert(=1), wenn eine neuer organismus an der stelle entsteht und deaktiviert (=0) wenn er wieder stirbt. dabei setzt Du nur eine variable, was sicher schneller geht, als container zu füllen.
    ganz andere probleme stellen sich bei beweglichen organismen. versuch seit ner weile eine komplexe evolutionssimulation zu machen. mit räuber-beute beziehungen und nährstoffkreisläufen. dabei stellt sich mir auch die frage, wie ich eine container class 'population' für organismen gleicher art am effektivsten aufsetze.
    hab schon überlegt mit eindeutigen IDs zu arbeiten..aber bin noch nicht soweit.
    wenn Du ne lösung findest würds mich auch interessiern..
    ( mein einzelner chloroplast photosynthetisiert schon fröhlich und den einsamen mytochonder freuts, dass er zückerchen schlecken darf 🤡 )



  • 1310,
    klingt wirklich interressant was du da entwickelst.

    Das original "Game of Life" hatte ich übrigens damals unter der win32api schon programmiert und wollte dieses Projekt nun nochmal unter .net aufziehen um die gesamte Entwicklungsumgebung der VC++2005 EE kennenzulernen (schon gewöhnungsbedürftig, wenn man 6 Jahre keinen Code geschrieben hat und damals eher c denn c++ programmiert und die MFC sowieso gemieden hat...)

    Langfristiges Ziel soll schon eine Art "Zellularautomat" sein, der schrittweise um verschiedene Funktionen/Eigenschaften ergänzt wird. Bin - wie gesagt- zur Zeit erst in der Planung. Bewegung gehört natürlich zur Grundausstattung der Organismen.

    Viele Grüsse,
    Bra.



  • hab mir als test mal nen rudel hasen gebastelt. dabei hielt ich zwar immer die anzahl statisch, hab sie vor dem start festgelegt. wobei hinzufügen ja kein problem ist. hatte es als array ausgelegt und bin einfach per for schlaufe durch alle durch und hab ne hase::move() methode ausgeführt.
    lustig wenn man einem hasen sagt: "geh auf den nächstgelegenen nachbar zu, bis der abstand zu deinen drei nächsten nachbarn gleich ist. aber wenn dir einer zu nah kommt, schubs ihn weg."
    mit derart simplen regeln hat ich völlig unvorhersehbares "schwärmverhalten", wobei es ja eher rotten sind bei hasen 🙄
    sass stunden davor und hab nur zugeschaut. vom eigentlichen ziel beute-räuber bin ich total abgekommen. für füchse hats damals nicht gereicht..

    übrigens hat mich m.crithon's 'prey' ins "schwärmen" gebracht.


Anmelden zum Antworten