Ameisenstaat - Wie progge ich sowas?



  • 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);
    }
    


  • otze schrieb:

    wär dies even nich noch schneller?

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

    nein. der compiler macht aus allen gennnaten versionen den selben assembler-code.
    konvertierung nach bool, ! oder if(...) return true; else rteturn false; sind für ihn gleich.
    kannst versuchen, zu gucken, ob er mal wo nicht gescheit opütimiert und mit tiefen bohrungen in seinen eingeweiden was machen.

    bool even(int i)
    {
       return i&1;//fast gut. aber die konvertierung anch bool wird 
       //ihm if... doch einpflanzen
    }
    

    mal gucken

    bool even(int i)
    {
       int x=i&1;
       __assume(x==false || x==true);
       return x;
    }
    //ja, daraus wird ein fisch! aber der compiler wirds vermutlich 
    //doch ncht raffen. 
    //also inline-assembler!
    

    und doch gilt es zu bezweifeln, daß man mit assembler hier nen takt rausholen kann. ich glaub's nicht.



  • mit andren worten: jeder versuch,in c++ sowas zu optimieren scheitert, da der compiler es eh besser machen würde,sodass der einzige erreichte effekt eigentlich nur das unlesbarmachen des eigenen codes wär?



  • otze schrieb:

    mit andren worten: jeder versuch,in c++ sowas zu optimieren scheitert, da der compiler es eh besser machen würde,sodass der einzige erreichte effekt eigentlich nur das unlesbarmachen des eigenen codes wär?

    jo!
    99.5% der vorgeblichen beschleunigungen, die ich so lese, sind bloß unlesbarmachungen.



  • hm..
    kann mir vielleicht mal einer diese randomint(n) coden?
    irgendwie bleibt mein .ant script immer an einer Flip Zeile hängen....

    Falls nicht alle das Prinzip kennen...
    randomint soll einen Int wert zurückgeben, der nach folgendem Prinzip ermittelt wird:
    S0 = seed 12345

    Si+1 = Si*22 695 477 + 1 (<- hab die Zahlen zwecks Lesbarkeit mit leerzeichen getrennt)
    Xi = (S~i + 4~ div 65536) mod 16384

    jeder ite Aufruf von randomint ergibt
    result = Xi mod n

    Soweit klar? Ich hoffe es zumindest 😃
    Wäre nett, wenn mir da einer mal eine Beispielfunktion erstellen könnte. Irgendwie steh ich heute auf der Leitung...

    Shaddy



  • S0 = seed 12345
    Si+1 = Si*22 695 477 + 1 (<- hab die Zahlen zwecks Lesbarkeit mit leerzeichen getrennt)
    Xi = (S~i + 4~ div 65536) mod 16384
    jeder ite Aufruf von randomint ergibt
    result = Xi mod n

    die beschreibung ist auch absichtlich verkompliziert. jeder hat da gestrauchelt. und einige sind bis in den dritten tag rein nicht auf ne schnelle version gekommen.
    im prinzip geht ein

    //ungetestet
    unsigned int rand(){
       static unsigned int s=12345;
       s=s*22695477+1;
       return s/65536%16384;
    }
    unsigned int randomint(int n){
       return rand()%n;
    }
    

    der witz ist, daß auf normalen c++-maschinen in s=s*22695477+1 der überlauf nur etwas völlig irrelevantes bewirkt, beim nachträglichen / und % würden die total vielen stellen am anfang eh wegfliegen.
    evtl ist die folge noch ein wenig verschoben, glaube dreimal rand() am anfang aufrufen könnte das noch helen.



  • hi volkard,

    danke erstmal für die randomint 😃
    Dann war ich scheinbar doch net zu blöd, denn im Prinzip hab ich die gleich Funktion gehabt (ausser, das ich kein unsigned benutzt habe 🙂 )
    Wie du schon vermutet hast, muss man rand() (ich hab es mal in random() umbenannt) einfach vorher 3x aufrufen. Danach stimmt die Folge allerdings.

    Irgendwas ist aber an meiner Simulation dennoch net ok *grübel*
    Ich komme bei 200 Durchläufen immer wieder an einen Punkt bei dem er eine Flip zeile mit Blickrichtung 5 und verweis auf State 68 immer und immer wiederholt.. (Ich probiere erstmal mit nur 1 Ameise)
    Werde mal eben die sample.ant (mit der ich meine Sim teste) durchgehen.....

    [EDIT:] hm.. eigentlich sollte er in State 68 ein Unmark 2 0 auführen. Doch er macht einfach net weiter. Also auf zur Suche nach dem Fehlerteufel 😃

    Shaddy



  • Oh man bin ich bräsig *lol*
    Ein kleiner Tippfehler und schon funxt da was net mehr 🙄
    Natürlich habe ich beim Unmark die Falsche Statenummer zurückgegeben... so wurde der Unmark wieder und wieder ausgeführt.. klar, das das script dann net weiter ausgeführt werden konnte.
    Naja. Nun gehts wieder 🙂

    Shaddy



  • Ist es nicht egal, wie schnell even ist? Es geht ums Prinzip und nicht um
    Optimierung.

    mfg
    v R



  • virtuell Realisticer schrieb:

    Ist es nicht egal, wie schnell even ist? Es geht ums Prinzip und nicht um Optimierung.

    eigentlich schon. in diesem speziellen programm dürfte man aber nicht

    //ungetestet
    bool even(int x){
       if(x<0)
          return even(-x);
       if(x>=2)
          return even(x-2);
       return 1-x;
    }
    

    bauen. die funktion even ist eine, die wirklich ganz, ganz oft aufgerufen wird. macht man sie halb so schnell, wird das ganze prog vermutlich recht genau halb so schnell.

    aber ist schon richtig, es ist praktisch egal, wie schnell even() ist. schneller als die normale verion kriegt man es eh nicht. und selbst wenn man 10% rauskitzeln könnte, würde das so viel mühe machen, daß man leichter das ganze design ein wenig abwandelt und gar kein even() mehr braucht. ich hab bei meinem simulator in jedem feld sechs zeiger auf die nachbarfelder gespeichert, um die koordinatenberechnungen (wo even drin benutzt wird) in den inneren schleifen loszuwerden. aber erst, nachdem alles korrekt funktionierte, hab ich mich getraut, sowas zu machen.
    der simulator sollte recht flott am ende sein, weil so ein durchlauf gerne 30 sekunden braucht, und für jede änderung am ameisencode dann 30 sekunden warten zu müsen, bis man sieht, wie stark die ameise ist, nervt ein wenig.



  • Hej,
    solltest du dir nicht erstmal genaustens klar machen wie Ameisen in echt 'funktionieren'?
    Wie sie z.B. nach neuen Nahrungsquellen suchen, fressen sie nur was sie wirklich kennen oder probieren sie auch neue Dinge?
    Wie viel muss ne Ameise in echt so fressen und wie lange lebt sie ueberhaupt?
    Wann greifen Ameisen an und wer koordiniert Angriff. Manche 'groessere' Ameisen fressen sogar Kleintiere wie Maeuse...
    Und gibt es z.b. eine Art Architekt, der bestimmt wie der Bau aussieht? oder wissen das die Bauarbeiterameisen alle selber?
    Gibt es auch sone Art 'Streit' unter Ameisen aus dem selben Bau?

    Wenn du diese grundlegende Dinge weisst, kannst du erst richtig anfangen zu programmieren, oder weisste das sogar schon alles 😕

    Auf jedenfall klingt das Projekt interessant 😃
    ByeBye, Viking69


Anmelden zum Antworten