Ameisenstaat - Wie progge ich sowas?



  • 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