locked
Statische Variablen in der Ameisen-Klasse (Spoiler ?!)

    Frage

  • Hi,

    ich hoffe ich verrate den anderen nicht zu viel, aber ich muss mal was fragen.

    Also es gibt ja da diese statischen Variablen. Es steht nirgends, dass deren Nutzung verboten ist, also schließe ich daraus, sie sind erlaubt. Nun hab ich aber ein Problem: Wenn ein Spiel zu Ende ist, und ich will ein zweites simulieren, dann hab ich in den statischen Variablen immernoch die alten Werte und meine Ameisen machen falsche Aktionen!

    Es gibt 4 Lösungsmöglichkeiten aus meiner Sicht:
    • irgendeine Art Ereignis, dass das Spiel neu beginnt.
    • Die statischen Variablen alle wieder null'en zu Beginn durch die Simulation (Nicht die beste Möglichkeit, da die Variable ursprünglich vielleicht nicht null war!)
    • statische Variablen komplett über Reflection o.ä. verbieten
    • Programm jedes mal ausmachen und neu öffnen
    Ich finde die dritte Option ist definitiv die schlechteste, würde sie doch sicherlich alle Völker zerlegen, die momentan auf der Rangliste vom Marco stehen.
    Freitag, 10. November 2006 16:35

Alle Antworten

  • Hey Fabse,

    Mist! Du hasts bemerkt ;-) Mit statischen Variablen ist es leider noch möglich interameisiäre Kommunikation zu betreiben. Das ist natürlich nicht Sinn der Sache. Geplant war die Verwendung per Reflection zu unterbinden.

    Tschö
    Tom
    Montag, 13. November 2006 13:32
  • also meine sicht der dinge: macht es nicht!
    Montag, 13. November 2006 13:53
  • Naja, wir haben lange drüber nachgedacht. Aber welchen Sinn haben Markierungen und Erkunderameisen denn noch wenn du problemlos Informationen zwischen Ameisen hin und her schieben kannst? Wir waren uns noch nicht mal sicher ob wir private Variablen zulassen sollen die ja dann ein Gedächtnis der Ameise darstellen...
    Montag, 13. November 2006 15:52
  • aber ist dann wirklich noch viel mehr drin, als im demo-volk? ich finde es mit static-vars schöner
    Montag, 13. November 2006 16:09
  • hallo tom,
    dazu hätte ich einen vorschlag: man könnte doch so den jungen programmieren die KI in zwei stufen beibringen.
    Stufe 1: Erkunder und Markierung
    Stufe2: Ameise hat ein Gedächnis//als komplexeres System

    Zumal Intelligenz gibt ja an, wie lernfähig ein Wesen ist. Man lernt indem man informationen erhält und speichert(merkt) oder indem man etwas ausprobiert und sich dieses ergebnis merkt. demnach würde streichen von privaten variablen die Intelligenz eher einschränken als fördern. viele spiele merken sich auch die spielweise von dem user und reagiert dann entsprechend darauf. es wäre also eher eine weiterentwicklung als ein hindernis.
    is jetzt eher meine meinung dazu
    Montag, 13. November 2006 16:09
  • Dazu muss ich sagen, dass private member auf jedenfall weiterhin erlaubt sein sollten!
    Mit den static geschichten ist das so eine Sache. Ich gebe dann hier mal zu, dass mein Volk wohl nur auf Platz 2 ist, da ich mit einem Singleton Container arbeite, der im Prinzip wie ein schwarzes Brett für alle meine Ameisen fungiert. Findet eine Ameise einen Zuckerhaufen, legt es die Koordinaten auf das schwarze Brett und alle anderen Zuckersammler Ameisen müssen nicht mehr suchen.

    Von daher finde ich schon, dass static ruhig verboten werden sollte. Jedoch das eigene gedächtnise einer ameise (also private members) auf keinen fall!

    marco

    Montag, 13. November 2006 16:41
  • Hallo zusammen,

    nun muss ich auch mal meinen Senf dazugeben.

    Ich bin der Meinung, dass weder statische variablen noch private members verwendet werden dürfen. Und  das hat einen ganz einfachen - aber m.E. genauso zwingenden - Grund:

    Wir programmieren hier ja Ameisen. Und die haben (soweit ich das als Nicht-Biologe sagen kann) kein Gedächtnis. Und erstrecht haben sie kein "kollektives Gedächtnis"... was ja durch statische Variablen abgebildet würde.

    BTW: Meine Ameisen sind auf der Highscore ja auch nicht völlig schlecht platziert. Und ich habe keinerlei Variablen verwendet.

    Wenn wir (ggf. zusätzlich) mit Gedächtnis und/oder über Markierungen hinausgehende Kommunikation verwenden wollen (was dann wohl Markierungen komplett überflüssig macht), dann sollte das IMHO in einem abgespaltenen Projekt passieren, in dem z.B. kleine Roboter programmiert werden (wobei man dann auch fast einfach zu http://www.project-hoshimi.com/ wechseln kann ;-)).

    Wo ich nun sowieso gerade schreibe, hätte ich da aber noch eine andere Anregung zur Erweiterung der Möglichkeiten:
    Ich fände es cool, wenn man verschiedene Typen von Markierungen sprühen könnte (oder wenn man der Marikierung zumindest ansehen könnte, welcher Ameisen-Typ sie gesprüht hat). Das würde die kollektive Intelligenz des Volkes nochmal ziemlich ankurbeln ... denke ich zumindest.
    Und ich finde das (im Gegensastz zum oben diskutierten Gedächtnis) auch legitim,
    im wirklichen Leben können Ameisen nämlich auch verschiedene Düfte absondern (und einige sogar akustisch "nach Hilfe rufen" ... zumindest wenn da in wikipedia kein Mist steht :-D).

    So, dann hoffe ich jetzt mal, dass ich mich nicht gleich mit meinem ersten Posting hier total unbeliebt gemacht habe und wünsche allen beteiligten weiterhin viel Spaß beim Ameisen modden!

    Viele Grüße,
    Holger
    Montag, 13. November 2006 18:47
  • ok, meine ameisen verwenden auch keine zusätzlichen variablen und war (hab gerade die HighScore gesehen und bin vom glauben abgefallen) bis heutze mittag zumindest damit auf platz 1. das ich keine zusätzlichen variablen (mit außnahme derer, welche im tutorial beschrieben sind zur markierung) hat bei mir den grund,das ich zwar eine idee habe, aber mir der ansatz zur umsetzung fehlt.
    aber um auf Holger zurück zu kommen:

    wir sollten uns entscheiden in welche Richtung sich die Ameisen entwickeln sollen. Sollen sie entweder mehr wie das biologische Original wirken oder springen sie eine(oder auch mehrerer) Evolutionsstufe(n) höher?

    Bei der ersten Möglichkeit würde das heißen, das sämtliche Möglichkeiten, die ein Gedächtnis simmulieren, für denn Wettbewerb untereinander oder zwischen den Völkern (wenn wir es mal so nennen wollen) nicht erlaubt sind, können aber für eigene lokale spiele ja angewendet werden.

    Bei der zweiten Möglichkeit erschaffen wir eine Evolution der Ameisen, welche dem heutigen biologischen Original weit vorraus ist. Diese haben dann halt ein Gedächtnis etc. Das wäre dann so in der Art "AntMe Future"...

    Im augenblick bin ich gerade ziemlich erstaunt, was man alles raus holen kann und was für riesige möglichkeiten es hier gibt.

    //in eigener Sache: @Marco, gibt es eine möglichkeit, das ich mal in deinen Quellcode reinschnuppern kann? mich interessiert die sache mit dem koordinaten abspeichern

    PS: fast vergessen, Vielleicht sollten wir einen Extra-Thread für die Diskussion in welche Richtung sich AntMe entwickeln kann/soll erstellen. ist besser für die Übersicht und die Entwickler haben alles auf einem Blick in einem Thread


    MfG
    Thomas Rabe
    Montag, 13. November 2006 19:27
  • Also ein kollektives Gedächtnis sollte wohl selbverständlich NICHT enthalten sein. Dadurch wird dieser ganze Markierungs-Firlefanz ja überflüssig und es geht eine ganze Menge an Variationsmöglichkeiten flöten.

    Was das Gedächtnis angeht habe wir weniger Bedenken. Wenn sich eine Ameise was merken kann beschränkt sich das nur auf das was sie selber herausgefunden hat - das bringt auch einiges an Spannung und Taktik mit. Das wird wohl auch drin bleiben.

    Über Markierungen haben wir uns auch lange, lange Gedanken gemacht. Die Uridee hat mehrere "Farben" vorgesehen die man nach eigenem Ermessen für alles mögliche Verwenden kann.
    In zweiter Entwicklungsstufe haben wir uns für die taktisch kompiziertere Variante entschieden: Nur eine Markierung um dem Programmierer die Entscheidung zu lassen wofür diese Markierung eingesetzt werden kann. So musste man sich für einen Einsatzzweck entscheiden. Bei dieser Lösung gab es in der Markierung eine Variable "Richtung" die einen Winkel enthalten sollte in die die Markierung zeigt. Leute die auf der GamesConvention waren haben mit diesem Typ Markierung gearbeitet.
    Der aktuellste Markierungstyp hat nun keine Richtung mehr sondern einen Int als Variable in dem der Programmierer speichern kann was er möchte. In meinem Volk habe ich dadurch 2 verschiedene Markierungstypen erzeugt: Werte zwischen 0 und 360 sind Winkel der Markierung 1, Werte zwischen 1000 und 1360 sind Winkel des Typs 2. Die Information die eine Markierung enthalten kann ist also wieder etwas flexibler und frei verwendbar.
    @Holger: Ich denke damit erledigt sich dein Wunsch nach verschiedenen Markierungen?

    Frohes proggen weiterhin
    der Tom
    Montag, 13. November 2006 20:07
  • Definitiv sollten selbstverständlich in einem Wettbewerb die static geschichten raus.
    Hab damit aber einfach rum probiert, a) weil es geht ;-) und b) weil ich wissen wollte, wieviel mehr meine ameisen quasi gleich programmiert raus holen, einmal mit und eben einmal ohne.

    Ich erlaube einfach mal einen Blick in meine Implementierung. Um nicht alles zu verraten, habe ich die Modifikationen alle auf 0 gesetzt und die Anzahl der Typen frei gelassen.
    Download hier:
    http://mwiedemeyer.de/AntMe/MarcosVolk3.zip

    Natürlich nicht nachmachen, weil solche statischen sachen=böse!

    marco

    Montag, 13. November 2006 20:25
  •  Tom Wendel Schrieb:
    Also ein kollektives Gedächtnis sollte wohl selbverständlich NICHT enthalten sein. Dadurch wird dieser ganze Markierungs-Firlefanz ja überflüssig [...]

    Mein Reden ;-)

     Tom Wendel Schrieb:

    Was das Gedächtnis angeht habe wir weniger Bedenken. Wenn sich eine Ameise was merken kann beschränkt sich das nur auf das was sie selber herausgefunden hat - das bringt auch einiges an Spannung und Taktik mit. Das wird wohl auch drin bleiben.

    Verdammt, dann muss ich mir jetzt also doch Gedanken darüber machen, was sich meine Fiecher merken sollen. Als ob ich sonst nichts zu tun hätte ;-)

     Tom Wendel Schrieb:

    @Holger: Ich denke damit erledigt sich dein Wunsch nach verschiedenen Markierungen?

    Vielen Ddank für den Tipp! Ich hatte schon überlegt, gerade und ungereade Winkel zu verwenden (was natürlich dann eine Unschärfe in der Navigation verursacht - k.A., ob das funktioniert hätte) weil ich irgendwie auf dem Trip war, die Information sei nunmal ein Winkel und könne halt nicht > 360 sein ... manchmal bin ich echt doof...
    Ok, damit hat sich mein Markierungs-Problem dann jedenfalls erledigt.

    Viele grüße,
    Holger


    Montag, 13. November 2006 20:50
  • in anderen computerspielen muss auch immer zwischen realismus und spielspaß abgewägt werden.

    ich finde static vars lassen viel coolere wirklichere künstliche intelligenzen zu. die ameisen sterben viel zu schnell, und die markierungen verschwinden auch viel zu schnell, als das man wirklich gute sachen damit hinbekommen könnte. das beispiel-ameisen volk hat schon vielleicht 70-80% des möglichen.

    bei ki denke ich jetzt z.b. an neuronale netze, und die brauchen halt ihre zeit zum lernen. wenn die ameise aber bei ersten fehler stirbt, dann beginnt das lernen erneut. sinnlos.


    die alternative, die ich sehe, sind abgespaltete ligen: bei robocode gibt es neben "alles-erlaubt" auch z.b. micro- und nano-bots, die die code-size begrenzen. Warum sollten wir also nicht auch getrennte liegen für static und non-static implementationen machen? meine ameisen (zur zeit auf rang 1 in marcos liste *g*) nutzen übrigens (wer hat es anders erwartet) ein kollektives wissen der welt.

    um übrigens mal noch einen anderen aspekt rein zu bringen: ich muss euch zuerst mal loben, auch ohne eine einzige berechnung mit sinus oder cosinus hab ich das ganze erreicht (vergleich robocode: die ersten 2 tage ausschließlich "low-level" math zum zielgerichteten bewegen des tanks). nun finde ich aber sind die möglichkeiten gerade für ameisen, die die gegend erkunden sollen zu gering. man hat keine möglichkeit, koordinaten des baus zu erhalten, noch spielfeldgröße, quantifizierte werte für die sichtweite usw. das einzige ist da wirklich, die ameisen mit hilfe des zufalls zu bewegen. methoden wie gehe zu x/y oder selber koordinaten anlegen sollten möglich sein.

    Wer mein Völkchen mal sehen will: http://blog.fabse.net/2006/11/14/mein-ameisenvolk-auf-platz-1/

    Mir ist noch ein Gedanke gekommen: Ist die Intention eigentlich, die meisten Punkte zu holen (mit Rangliste und so) ? oder ist das Ziel, eine möglichst getreue Simulation von realen Ameisen dazubieten?!
    Montag, 13. November 2006 22:55
  • Hallo Alle,

    Ich war die letzte Woche in Barcelona auf der Microsoft TechEd und habe daher den Anfang der Diskussion hier verpasst. Ich freue mich, daß hier so sehr diskutiert wird und will als Entwickler der Spiellogik natürlich auch zu dem Thema beitragen.

    Ursprünglich wollte ich keinerlei selbstdefinierte Variablen haben (sowohl statische als auch nicht-statische) und zwar aus dem Grund um das Ganze einfach zu halten. Die Zielgruppe auf der Games Convention waren etwa die zehn bis vierzehnjährigen. Tom dagegen wollte immer ein Gedächtnis haben... Ich formuliere das um: er wollte schon immer ein Gedächtnis für die Ameisen haben . Ich habe ihn dann immer ein wenig gebremst, weil ich ersteinmal die einfachen Sachen zu Ende programmieren wollte. Aber auf lange Sicht hat Tom recht behalten. Der Grund warum wir das bisher nicht genauer definiert haben, liegt einfach daran, daß die Zeit dazu gefehlt hat.

    Mein Vorschlag für die Problematik was erlaubt ist und nicht sind verschiedene Regelsätze. Die einfachen Spielregeln würden dann keinerlei selbstdefinierte Variablen zulassen, die Ameisen könnten damit nur über die Ereignisse gesteuert werden. Diser Regelsatz wäre dann für Einsteiger geeignet, die noch keine Erfahrung im Programmieren und Entwickeln von Algorithmen haben. Die mittleren Spielregeln würden ein Gedächtnis in Form von nicht-statischen Variablen zulassen und die schwierigen Regeln auch ein kollektives Gedächtnis (dazu könnte man dann eine Visualisierung mit Roboter Ameisen machen). Die Punkte würden dann natürlich in getrennte Ranglisten eingetragen werden.

    Viele Grüße,
    Wolfgang

    Dienstag, 14. November 2006 12:44
  • so habe ich mir das auch gedacht und gemeint mit dem stufenweise heranführen an die KI-Programmierung (siehe obigen post).
    ich denke mal, das so die Anfänger in diesem Bereich (wo ich hinzuzähle), einen ansporn haben, sich weiter mit dem Thema zu beschäftigen. und das Projekt wird dadurch auch langlebiger.

    MfG
    Thomas Rabe
    Dienstag, 14. November 2006 12:51
  • Hallo Alle,

    Ich bereite gerade das nächste Release vor und möchte hier kurz die aktuellen Überlegungen zum Thema Gedächtnis der Ameisen loswerden.

    Eine der Eigenschaften von .NET die ich persönlich nicht mag, ist die "Interpretation" von privaten Mitgliedern (d.h. Variablen, Eigenschaften, Methoden, ...). Nehmen wir eine Klasse mit einigen privaten Mitgliedern und erzeugen wir zwei Instanzen a und b dieser Klasse. Innerhalb von Instanz a kann natürlich auf die privaten Mitglieder zugegriffen werden. Wenn a einen Verweis auf b hat, kann in a aber auch auf die privaten Mitglieder von b zugegriffen werden.

    Im Fall der Ameisen bedeutet das folgendes: wenn eine Ameise in einem entsprechenden Ereignis eine oder mehrere andere Ameisen des eigenen Volkes sieht und Verweise darauf bekommt, kann sie die Steuerung über diese Ameisen übernehmen. Somit haben wir dann wieder ein kollektives Gedächtnis und das ganze Konzept mit unabhängigen Ameisen mit eigener Intelligenz wird ausgehebelt.

    Wenn ich den Ameisen also ein Gedächtnis geben will, das wirklich privat ist, muß ich tricksen. Warscheinlich werde ich eine AmeiseInfo Struktur übergeben die nur ausgewählte Informationen enthält. So verhindere ich auch, daß ein Spieler sich die Verweise auf alle getroffenen Ameisen merkt und auch dann mit ihnen kommuniziert, wenn sie schon nicht mehr in Reichweite sind.

    Soviel erstmal dazu.

    Mittwoch, 17. Januar 2007 17:39