Ameisenstaat - Wie progge ich sowas?



  • Hi Leute,

    jaja.. das "alte" Thema:
    Ameisen 😃

    Worum es mir aber geht:
    Ich mache mir nun schon seid einigen Monaten/Jahren Gedanken, wie ich nun sowas wie ne MiniKi oder einen autodidaktischen Roboter coden könnte. Aber scheinbar denke ich wohl viel zu komplex dafür 🙄
    Also dacht ich mir: Mache ich es wie die Wissenschaft und nehme mir die Natur als Vorbild.. ein Ameisenstaat!

    Mein erstes Ziel: (nebenbei mal erstmal C++ lernen *lol)
    Ne ernsthaft. Ich code zwar schon seid Jahren in Basic und ASM. Hab mit Delphi einige Minigames versucht, aber von C++ noch net so die Ahnung. Aber drum hab ich mir dieses Projekt ausgesucht, um 1. die Sprache zu lernen und 2. ein neues Ziel zu haben. Demotivieren lasse ich mich bei Rückschlägen nicht. Dafür hab ich schon zu viele solcher (negativ-) Erfahrungen gemacht 😉

    Also... Lange Rede, kurzer Sinn...
    Ich möchte ein Prog schreiben das
    1. eine Welt generiert in der ich verschiedene Objekte mit verschiedenen Eigenschaften platzieren kann
    (Nahrung -> Energie, Baustoff; Stein -> Wall; Halme/Pflanze -> Baustoff, Nahrung; Wasser -> Hinderniss, Gefahr;usw, usw....)
    2. Kreaturen erschafft, die ohne wirkliche Erfahrung ihre Umgebung erforschen können;
    Den Weg, den sie zurücklegen markieren (Pheromone).
    Objekte, die sie finden, untersuchen und versuchen heraus zu bekommen, was sie damit anstellen können...
    3. Die Kreaturen (Ameisen) in einer eigenen Skriptsprache handeln;
    -> es soll EINE Basisaktion geben: Überlebe!
    Ansonsten sollen sie sozusagen ihre Sinne und Körper selbst entdecken und die Erfahrungen in einer Datei speichern.
    Diese Erfahrungen werden dann (nach Erfolgsprinzip) an die nächste Generation weitergegeben werden.

    ... Puh.
    Ich glaube das reicht erstmal für den Anfang 😃
    Ideen hab ich noch massenweise dazu. Allerdings wäre das sicherlich viel zu viel für den Anfang..
    Nun werd ich mich erstmal wieder an meinen Compiler schmeissen und versuchen den Worldgenerator zu entwickeln 🕶 ...oder so...

    Falls einer von Euch gute Coding ideen hat oder schon Erfahrungen zu dem Thema hat, bin ich für alles offen.
    Ich möchte Euch nur bitten mich mit solch tollen Kommentaren wie " 😮 He, das ist doch viel zu schwer für den Anfang. Progge erstmal was Kleineres." zu verschonen.
    Ob es zu schwer ist, werde ich noch früh genug merken 😉 Und "Kleine Projekte" hab ich schon megabyteweise hinter mir 😉

    Soderle... nu is aber gut..
    Euer
    Shaddy



  • ich kann was zum worldgenerator sagen:
    benutz intern ein array bzw vector, in dem du dann eine struct speicherst,zuerst die "äußerlichen" daten, aber auch die daten die die ameise braucht,also obs ne gefahr ist, obs ein energielieferant ist etc.desweiteren speicherst du auf den feldern selber die pheromone.

    zu2: soll der algorithmus zur bewegung fest implementiert werden, oder sollen die richtige strategien auch abgespeichert werden?



  • Dank dir für deine schnelle Antwort 🙂

    Also für die Worldmap hab ich erstmal eine Klasse erstellt und auf ein mehrfach dimensioniertes "map" array gelegt.
    In der Klasse sind zunächst die Eigenschaften des Feldes deklariert:
    int underground -> Grass, Stein, Erde, usw
    int object -> Pflanze, Insekt, Nahrung, usw
    int toUse -> Energie, Baumaterial, usw
    bool enemy -> true, false
    double pherom -> Pheromonwert
    (Bin am überlegen, ob das Pheromon Ameisenpezifisch sein soll. Also ob die map sich "merkt" WELCHE Ameise das Pheromon abgelegt hat)

    Zudem gibt es eine Klasse "ant" in der x,y pos der Ameise deklariert ist, die Energie (in %), der Pheromonabgabepegel, aktuelle Aufgabe, Objekt usw...

    Noch nicht viel, aber für mich schon ne Menge 😃
    Weiteres kommt dann morgen 🙂 Das Bett ruft so langsam...

    Shaddy



  • Hallo,

    http://www.cis.upenn.edu/proj/plclub/contest/ants.html

    Aufgabe des icfp 2004: http://www.cis.upenn.edu/proj/plclub/contest/

    Da kannst du dir en bissle was abschauen.

    mfg
    v R



  • virtuell Realisticer schrieb:

    Hallo,

    http://www.cis.upenn.edu/proj/plclub/contest/ants.html

    Aufgabe des icfp 2004: http://www.cis.upenn.edu/proj/plclub/contest/

    Da kannst du dir en bissle was abschauen.

    mfg
    v R

    He super Site 😉
    Habe zwar schonmal was von dem Contest gehört, in aber noch nie auf der Site gewesen .
    Kann man das Simulationsprogramm auch in C++ kriegen? Wenn nicht, dann muss ich mir das Ding wohl proggen 😃
    (Zwar hab ich noch keine Ahnung, wie ich das in C++ umsetze, aber ich werd das schon hinkriegen)
    Vielleicht hat ja jemand noch ne Idee 💡 , wie ich die Funktionen in C umschreiben kann ?! *grübel*grübel* 🙄

    Nun fehlt mir ja eigentlich nur noch ne Site auf der ich Infos finde, wie ich den Ameisen beibringen kann, das sie ihre Aktionen selbst rausfinden und wie sie sich mutierend vermehren (Ihre Erfahrungen also an die nächste Generation weitergeben) 🕶

    Shaddy



  • Shaddy schrieb:

    Kann man das Simulationsprogramm auch in C++ kriegen? Wenn nicht, dann muss ich mir das Ding wohl proggen 😃

    zum contest gibts ne mailingliste. die leutchen da sind ganz nett und etliche haben ihre lösungen auf ihre homepage gestellt, soweit ich weiß, zum teil auch mit simulatorcode. aber bestimmt gibt dir auch jeder seinen simulatorcode, wenn du danach fragst. aber erstaunlich wenige haben überhaupt c++ verwenet.
    die mailingliste ist aber ausgestorben, wie es scheint.
    es gibt jetzt auch ne inofizielle weiterführung, wo einer den wettbewerb weiterleben läßt. deine ameisen können sich also ganz offiziell inoffiziell mit anderen messen. und vor allem nehme ich an, daß auch da leute ansprechbar sind.
    aber wozu? den simulator bauen dauert ja nur drei tage. 😃

    (Zwar hab ich noch keine Ahnung, wie ich das in C++ umsetze, aber ich werd das schon hinkriegen)

    halte dich sehr dich am original, dann geht es leicht von der hand. der versuch, das alles anders zu machen, "weil man es in c++ anders macht", bringt nix.

    Vielleicht hat ja jemand noch ne Idee 💡 , wie ich die Funktionen in C umschreiben kann ?! *grübel*grübel* 🙄

    poste einfach eine, und jemand hier macht sie zu C.

    Nun fehlt mir ja eigentlich nur noch ne Site auf der ich Infos finde, wie ich den Ameisen beibringen kann, das sie ihre Aktionen selbst rausfinden und wie sie sich mutierend vermehren (Ihre Erfahrungen also an die nächste Generation weitergeben) 🕶

    hier haben wir ein problem.
    seiten gibts zwar viele, aber die ganzen GAs sind an den ameisen kläglich gescheitert.
    willst du mit genetischen algorithmen üben, dann nimm dir erstmal ein dankbares problem. auf keinen fall die ameisen. ich hab da auch nen tag dran verschwendet. und einige andere auch.
    jetzt hab ich ganz vergessen, wie diese andere aufgabe war, wo GAs voll geil waren. wenn mir's einfällt, poste ich hier.

    edit: es war http://www.gridwars.com/
    wenn man da mit GAs anfängt, hat man im handumdrehen starke bots und putzt schon einige von den mitgelieferten weg.



  • ich hab zwar gehörtk dass die gas bei den ameisen nich ganz so der bringer waren, aber dass sie ganz nutzlos waren 😮

    woran lags denn?



  • hmmmm...könnte sein da GA's in ihrer Ausführung doch recht langsam sind, es ziemlich viele States des Hirnes der Ameisen gibt (max. 9999), dass Problem sehr dynamisch ist. Man könnte zuerst auf den GA gekommen sein, da jede Ameise das selbe "Hirn" hat und man sowas wie eine Supereinheit ranzüchten könnte. Die dann immer geklont wird.
    Naja jedenfalls, glaube ich bei dem Problem ging es eher um das "Ameisenhafte" Zusammenspiel von den Individuuen. Und nicht darum die Megamonstereinheit ranzuzüchten.

    Volkard
    ********
    Mal so eine Frage hat eigentlich jmd das "natürliche biologische Verhalten" versucht zu reproduzieren, wenn ja wie weit ist er damit gekommen?

    bye

    tt



  • otze schrieb:

    ich hab zwar gehörtk dass die gas bei den ameisen nich ganz so der bringer waren, aber dass sie ganz nutzlos waren 😮
    woran lags denn?

    an der sprache. ich fang lieber andersrum an, warum bei gridwars GAs ein bringer sind.
    dort kann man mit wenigen befehlen die daten um sich rum sammeln, sagen wir erstmal nur leer/freund/freind in allen richgtungen. und dann manct man ne tabelle, wo für jede mögliche umgebung eine aktion steht und fertig.
    die tabelle ist lieb. kreuzen und mutieren sind naheliegend. und vor allem: kleine änderungen im genom bringen kleine änderungen im verhalten und große bringen große. dadurch kann sich der optimierer herantasten.
    es wurde also gar nicht versucht, das ganze programm automatisch wachsen zu lassen, sondern nur eine steuerungstabelle, das programm besteht dann aus dieser tabelle und nem kleinen interpreter.
    bei den ameisen hat man keine variablen! wie soll man da die umgebung in eine variable packen und als tabellenindex nehmen? den optimierer auf den code anzusetzen, bringt keinen sichtbaren fortschritt. es würde einach viel zu lange dauern und nen viel zu riesigen gen-pool verlangen, daß das klappen könnte.
    und dann sind die strategischen möglichkeiten bei den ameisen ja auch recht fein. es dauert kaum aufwand per hand zu schreiben:

    1:  lauf zufällig rum, //ein flip, zwei move
    2:   siehste futter, nimm es, //ein sense, ein pick
    3:   siehste eigenes hügel, lass es fallen //ein sense, ein drop
    4:   siehste feindlichen hügel bleib stehen //ein sense
    

    mit 1-3 wird futter gesammelt. mit 4 wird der feindliche hügel umstellt, wodurch der fein verliert, weil bald sein hügel lückenlos umstellt ist und er kein futter mehr reinkriegt.
    mit den 6 chemischen markern haben viele hantiert und sich zum beispiel die richtung gemerkt, aus der man kam, um nen schnellen rückweg zu schaffen. ich hab mir mit 4 bits im Z16 den abstand zum heim gemerkt, um per ameisischem dyjkstra-algo sogar auf kürzestem weg heimzufinden. und einen marker als ameisenstraße zu benutzen, der sagt, wohin man vom heim aus laufen muss, um futter zu finden, naja, ist offensichtlich.
    für solche algos braucht man vergleiche. ohne variablen zu haben, eht das wohl nur über dicke entscheidungsbäume. will ich nen zustand mit nur 4 bits mit nem anderen zustand gleicher größe vergleichen, braucht mein baim 255 programmzellen. (die zu erzeugen baut man sich ein kleines c++-prog.) bis der GA die korrket ausgewürfelt hat, dauert's ja ewiglich. und bevor der vergleich korrekt ist, rennen die ameisen nicht zielerchtet heim, sondern oft im kreis, was man als durchaus hinderliches verhalten werten darf. also kommt der GA nicht so einfach drauf.



  • Marc++us hat in seinem Buch ein Gras, Schaf, Wolf - Beispiel.



  • volkard schrieb:

    aber wozu? den simulator bauen dauert ja nur drei tage. 😃

    Öhm... wenn man C++ kann sicherlich 😃

    volkard schrieb:

    halte dich sehr dich am original, dann geht es leicht von der hand. der versuch, das alles anders zu machen, "weil man es in c++ anders macht", bringt nix.

    Wenn ich nur mal wüßte wie das Orginalprogramm aussieht 😕

    volkard schrieb:

    poste einfach eine, und jemand hier macht sie zu C.

    So wie ich das gelesen habe (auf der Site) sind die Funktionen lediglig in einem PseudoCode geschrieben ?!
    Zumindest ist mir bisher z.b. ein "type pos = (int,int)" noch nicht untergekommen.. oder hab ich da nur was vergessen?!?
    Aber ich probiere mal weiter mit meinem C++ Buch und sage den Fehlermeldungen des Compilers den Kampf an 😃 😃 😃

    Shaddy



  • Shaddy schrieb:

    volkard schrieb:

    halte dich sehr dich am original, dann geht es leicht von der hand. der versuch, das alles anders zu machen, "weil man es in c++ anders macht", bringt nix.

    Wenn ich nur mal wüßte wie das Orginalprogramm aussieht 😕

    na, der code, der auf der aufgabenstellung ist. dieser pseudocode.

    volkard schrieb:

    poste einfach eine, und jemand hier macht sie zu C.

    So wie ich das gelesen habe (auf der Site) sind die Funktionen lediglig in einem PseudoCode geschrieben ?!
    Zumindest ist mir bisher z.b. ein "type pos = (int,int)" noch nicht untergekommen.. oder hab ich da nur was vergessen?!?

    hast vieleicht vergessen, daß das in c++
    struct pos{
    int x;
    int y;
    };
    heißen könnte.



  • Na dann sag doch gleich, das dieser PseudoCode das Orginal ist *lol*

    😮 ein Struktur coder 😃
    Ne ich eiß ja schon, wie ich sowas einfaches wie die "type" Zeilen umsetze..
    bei
    if even(y) then..
    hört es allerdings schon wieder auf *kopfkratz*

    Naja ich schreib erstmal eben die Laderoutine für die .ant Dateien weiter...

    Shaddy
    , der stolz auf sich ist, das er in so kurzer Zeit schon recht gute Fortschritte in diesem C++ Jungle macht 😉



  • Shaddy schrieb:

    if even(y) then..

    bool even(int i){
       //gibt an, ob eine zahl eine gerade zahl ist
       if(i%2==0)//wenn i gerade ist
          return true;
       else
          return false;
    }
    


  • Shaddy schrieb:

    der stolz auf sich ist, das er in so kurzer Zeit schon recht gute Fortschritte in diesem C++ Jungle macht 😉

    lol.
    hast eigentlich keine chance. die aufgabe ist viel zu schwer, um sie zu meistern, wenn man nicht recht sicher in c++ ist.
    aber naja, ich sehe im fortgang der arbeiten nix, was dir den stil versauen würde, und wenn du es tatsächlich schaffen solltest, daß dein simulator das ausgibt, was er ausgeben soll, dann haste ganz schön was vollbracht.



  • Naja... "learning by doing" 😃

    Ich weiß, das ich mir ein ziemlich großes Ziel gesteckt habe, aber das ist der (für mich) einfachste Weg die Sprache zu lernen.
    Und solange ich solch nette Leute wie hier habe, die mir mit Rat und Tat zur Seite stehen, werde ich auch sicher weiter kommen 😉

    Shaddy
    PS: Danke dir für deine Codeübersetzungen @volkard 🙂



  • volkard schrieb:

    Shaddy schrieb:

    if even(y) then..

    bool even(int i){
       //gibt an, ob eine zahl eine gerade zahl ist
       if(i%2==0)//wenn i gerade ist
          return true;
       else
          return false;
    }
    

    schlecht volkard.

    bool even(int i)
    {
       return i % 2 == 0;
    }
    


  • hm.. also wenn ich ehrlich bin finde ich volkards Code zum reinen Verstehen erstmal besser !?!
    Soweit ich die Klamotte mit Funktionen und Rückgabewerten verstanden habe, sollte die verkürzte Fassung allerdings das selbe bewirken... ?!
    Nun gut.. ich arbeite dran 🙂

    Shaddy

    PS: apropos arbeite .. 🙂
    Da wäre noch ne Verständnisfrage:

    Im Pseudocode wird in einigen Funktionen der Wert "pos" zurückgegeben.
    Wenn ich das ganze unter C++ mache und z.b. eine Struktur POS erstelle, kann ich diese Struktur ja leider net zurück geben.
    Muss ich nun die Werte der Struktur (int x, int y) als Referenz oder Zeiger innerhalb der neuen Funktion behandeln/bearbeiten?
    Z.b. bei "funktion adjacent_cell(p:pos, d:dir):pos ="



  • Soweit so gut...
    Die Laderoutinen funxen soweit, die Step's werden ausgeführt... das ganze Programm sieht bisher sehr positiv aus.
    Was mir noch ein wenig Kopfzerbrechen macht ist immer noch dieses:

    Shaddy schrieb:

    Da wäre noch ne Verständnisfrage:

    Im Pseudocode wird in einigen Funktionen der Wert "pos" zurückgegeben.
    Wenn ich das ganze unter C++ mache und z.b. eine Struktur POS erstelle, kann ich diese Struktur ja leider net zurück geben.
    Muss ich nun die Werte der Struktur (int x, int y) als Referenz oder Zeiger innerhalb der neuen Funktion behandeln/bearbeiten?
    Z.b. bei "funktion adjacent_cell(p:pos, d:dir):pos ="

    Sprich: Ich hab mir nun eine struct POS { int psx; int psy;}p; erstellt...
    Die Funktion adjacent_cell(POS p;int dir;) soll mir nun POS zurückgeben. C++ meint aber das eine Struktur net als INT zurückgegeben werden kann (was ich ja auch als logisch sehe :D)
    Wie kann ich denn nun die psx und psy aus der Funktion sinnvoll zurückgeben, sodass ich z.b. in "newpos" den Rückgabewert POS von adjacent_cell kriege *grübel*
    Wenn ich also am Anfang eine Funktion "pos = find_ant(id)" mit Rückgabe POS einsetze, um diesen POS (also p.psx, p.psy) in einer Variable zu speichern... hm.. ne geht natürlich wieder nicht.
    Gibts da ne Möglichkeit?
    (ich glaub nu is mindestens jeder 2te genauso verwirrt wie ich grade 🙂 )

    Shaddy



  • wär dies even nich noch schneller?

    bool even(int i)
    {
       return !(i % 2);
    }
    

Anmelden zum Antworten