- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 138

Thema: GI = Guckis Intelligenz

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.147
    Blog-Einträge
    3
    Ich habe gerade mal kurz den Code überflogen.
    Vielleicht könntest Du oben ein

    typedef uns8 int8_t;

    einbauen, dann könnte man alle Typdefinitionen im Code "stdint.h" kompatibel machen, damit sie später auch ohne Mühen auf den Attiny portierbar sind.
    Ich habe mir schon überlegt, das Programm einfach mit GCC auf dem PC laufen zu lassen, dann wäre das Debugging auch viel einfacher. Hast Du Linux?

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.11.2019
    Ort
    Hamburg
    Beiträge
    117
    Hallo stochri,

    warum bauen wir nicht einfach einen Kompatibilitätsheader? Den klinken wir ein oder lassen ihn weg.

    Da kommt der typedef rein. Diese FSR/INDF-Geschichte. Und was sonst noch nötig ist. Und all die Header, die der Arduino braucht. Das ist doch ne 5-Minuten-Sache.

    -------

    Ich könnte auch gleich mit Atmel programmieren. Und natürlich auch unter Linux. Aber das bringt für mich alles Ablenkungen. Da werde ich dann langsamer, weil ich dann mit Tools kämpfen muss, die ich nur äußerst selten verwende. Linux zum Beispiel zuletzt 2007. Ich weiß nicht mal, ob meine Installation noch anständig hochläuft.

    Im Moment weiß ich ja auch ganz genau, wo ich Mist gebaut hab. Die Vergabe neuer "Links" ist unklar. Zur Zeit brauch ich dafür noch nicht mal ein Windows oder nen Compiler oder einen PIC. Wichtiger ist ein Block auf dem Nachttisch und öfter mal ein paar Minuten Ruhe im Büro.

    Die Menschheit kam zigtausend Jahre ohne die GI-KNN aus. Sie wird es auch noch ein paar weitere Tage überstehen. Da bin ich absolut zuversichtlich...

    Viele Grüße

    Wolfgang

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.147
    Blog-Einträge
    3
    Neue Entwicklungstools kosten immer Zeit. Aber manchmal kann sich der Aufwand lohnen und ein Mikrocontroller ist keine gute Debugging-Plattform für Algorithmen.

    Ich hab's jetzt mal mit Eclipse-CDT probiert, damit kann man gut durchs Programm steppen.

    Mein ( Dein )Programm wirft allerdings folgends aus:
    Gucki running
    error, no pattern

    Code:
    #define RUNNING_ON_PC
    
    #define NUMBEROFNEURONS 30
    
    //********************** RUNNIN ON PC ***********************************
    #ifdef RUNNING_ON_PC
    #include <iostream>
    #include <stdint.h>
    using namespace std;
    
    #define FOREVER while(1)
    typedef uint8_t uns8; // stdint.h compatibility
    typedef bool   BOOL;
    #define FALSE  0
    #define TRUE   1
    
    // funktioniert nicht
    static unsigned char* FSR;
    #define INDF (*FSR)
    
    #define LINK_SRC 0
    #define LINK_DST 1
    #define LINK_USE 2
    
    /*
    #define src 0
    #define dst 1
    #define use 2
    */
    #endif
    //************************** RUNNING ON PIC ***************************************
    
    #ifdef PIC
    #include "allpic.h"
    #pragma config = 0b000110000100     // hex-datei: fuses des 12F629
    
    #pragma cdata[0x2100] =            \
      0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,\
      0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,\
      0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,\
      0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,\
      0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,\
      0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,\
      0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,\
      0xFF,0xFF                // eeprom initialisierung
    
    #define EE_ROM                // eeprom nutzen
    #include "pic_mem.h"
    
    #include "timeloop.h"
    
    // LINK-Zugriffe
    #define LINK_RD(a,m)    ee_read((a) + offsetof(struct _link,m))
    #define LINK_WR(a,m,v)    ee_write((a) + offsetof(struct _link,m),v)
    #endif
    
    
    #define OUT_0        0        // GPIO
    #define OUT_1        1        //
    #define OUT_2        2        //
    #define IN_2        3        //
    #define IN_1        4        //
    #define IN_0        5        //
    
    //** alle sensoren, aktoren, triebe und neuronen nach abstraktion gestaffelt ******
    uns8 zellen[30];            // zellen im RAM anlegen
    
    #define FIRE_LIMIT    10        // fire_limit
    
    #define RD_SUM        (INDF & 0x3F)    // ZELL-Zugriffe
    #define WR_SUM(s)    {INDF &= ~0x3F; INDF |= (s);}
    
    #ifdef RUNNING_ON_PIC
    #define RD_FIRE_REQ    (INDF.7)
    #define WR_FIRE_REQ(b)    {INDF.7 = (b);}
    #endif
    
    #ifdef RUNNING_ON_PC
    #define RD_FIRE_REQ    !!(INDF>>7)
    #define WR_FIRE_REQ(b)    {INDF&=~0x80;INDF|=b;} //{INDF.7 = (b);}
    #endif
    
    #define SENS_0        0               // Sensoren
    #define SENS_1        1
    #define SENS_2        2
    #define AKT_0        3               // spezialzellen definieren
    #define AKT_1        4
    #define AKT_2        5
    #define TIMER        6        // Timer-Zelle
    #define HUNGER        7        // Hunger-Zelle
    #define FIRST_NEURON    8        // Beginn des Hirns
    
    //******* verbunden werden zellen mit vielen links (dendriten) *********
    #define NO_LINK        -1
    #define MAX_LINKS    (128 / sizeof(struct _link))    // viele links im EEPROM
    
    struct _link {                // struktur eines EEPROM-links
      uns8 src;                // leerer link: src_zelle == NO_LINK
      uns8 dst;                // verbindet source- mit dest-zelle
      uns8 use;                // nützlichkeit dieses links
    };
    
    //********************** RUNNIN ON PC ***********************************
    #ifdef RUNNING_ON_PC
    
    _link Simulated_EEPROM[NUMBEROFNEURONS];
    
    uns8 LINK_RD(uns8 address, uns8 component)
    {
      uns8 value = 0;
      if (component == LINK_SRC) value = Simulated_EEPROM[address].src;
      if (component == LINK_DST) value = Simulated_EEPROM[address].dst;
      if (component == LINK_USE) value = Simulated_EEPROM[address].use;
      return value;
    }
    
    void LINK_WR(uns8 address, uns8 component, uns8 value)
    {
    
      if (address < NUMBEROFNEURONS)
      {
        if (component == LINK_SRC) Simulated_EEPROM[address].src = value;
        if (component == LINK_DST) Simulated_EEPROM[address].dst = value;
        if (component == LINK_USE) Simulated_EEPROM[address].use = value;
      } else
      {
          cout << "Error: link address out of range " + address << endl;
    //    Serial.print("Error: link address out of range "); Serial.println(address);
    //    delay(100);
      }
    }
    
    #endif
    
    static uns8 rand_link;            // randomize link
    
    static uns8 pattern;
    static uns8 learn;
    
    static void gi_lerne(void)        // die genesis
    {
      uns8 zell_ind = 0, link, free, buf;
      BOOL hit;
      do {                    // Suche feuernde zellen
        FSR = &zellen[zell_ind];        // pointer auf zelle
        /**** sensoren, aktoren und triebe sind besondere zellen *****/
    /*
        switch(zell_ind) {
          case SENS_0: WR_FIRE_REQ(pattern.0); break;
          case SENS_1: WR_FIRE_REQ(pattern.1); break;
          case SENS_2: WR_FIRE_REQ(FALSE); break;
          case AKT_0:  GPIO.OUT_0 = RD_FIRE_REQ; continue;
          case AKT_1:  GPIO.OUT_1 = RD_FIRE_REQ; continue;
          case AKT_2:  GPIO.OUT_2 = RD_FIRE_REQ; continue;
          default: break;
        }
    */
    
        /***** diese zeilen sind der kern des systems *****************/
        if(!RD_FIRE_REQ) continue;        // zelle möchte nicht feuern
        WR_FIRE_REQ(FALSE);            // zell-feuerwunsch wird nun erfüllt
        free = NO_LINK; link = 0; hit = FALSE;    // verfolge die links
        do {                // alle links durchsuchen
          buf = LINK_RD(link,LINK_SRC);        // linkbyte lesen
          if(buf == NO_LINK) free = link;    // leeren link merken
          else if(buf == zell_ind) {    // einen link gefunden
        uns8 hbuf = LINK_RD(link,LINK_USE);    // nuetzlichkeit lesen
        if(hbuf) hit = TRUE;        // nutzlink gefunden
        if(++hbuf > FIRE_LIMIT) hbuf = FIRE_LIMIT;// limitieren
        FSR = zellen + LINK_RD(link,LINK_DST);// pointer auf dst-zelle
        buf = RD_SUM + hbuf;        // zellsumme berechnen
        if(buf > FIRE_LIMIT) buf = FIRE_LIMIT;    // limitieren
        WR_SUM(buf);            // zellsumme speichern
        if((buf == FIRE_LIMIT)&&(!RD_FIRE_REQ)) {// will dst feuern?
          WR_FIRE_REQ(TRUE);        // FIRE_REQ vormerken
          LINK_WR(link,LINK_USE,hbuf);    // nuetzlichkeit inkrementieren
        }
          }
          link += sizeof(struct _link);    // nächsten link adressieren
        } while(link < MAX_LINKS * sizeof(struct _link));
    
        /** wenn kein nützlicher link gefunden und platz ist: erzeuge neuen link **/
        if((!hit)&&(free != NO_LINK)) {
          LINK_WR(free,LINK_SRC,zell_ind);    // link neu erzeugen
          if(learn) buf = learn;        // gewollte verlinkung
          else {                // zufällige verlinkung
        if(++rand_link >= sizeof(zellen)) rand_link = FIRST_NEURON;
        buf = rand_link;
        if((buf == zell_ind)&&(++buf >= sizeof(zellen))) buf = FIRST_NEURON;
          }
          LINK_WR(free,LINK_DST,buf);
          LINK_WR(free,LINK_USE,0);        // ob der link nützlich wird, weiß keiner
        }
      } while(++zell_ind < sizeof(zellen));    // nächste zelle
    }
    
    static void gi_verlerne(void)        // links überarbeiten
    {
      uns8 link = 0, buf;
      do {                    // alle links durchsuchen
        if(LINK_RD(link,LINK_SRC) != NO_LINK) {    // leere links skippen
          buf = LINK_RD(link,LINK_USE);        // nuetzlichkeit lesen
          if(buf) LINK_WR(link,LINK_USE,--buf);    // langsam verlernen
          if(!buf) LINK_WR(link,LINK_SRC,NO_LINK);// link ganz löschen
        }
        link += sizeof(struct _link);    // nächster link
      } while(link < MAX_LINKS * sizeof(struct _link));
    }
    
    #define DELETE        0
    #define REDUCE        1
    #define SLEEP        2
    
    static void gi_zellen(uns8 steuer)    // zell-erregungen überarbeiten
    {                    // DELETE, REDUCE oder SLEEP
      uns8 zell_ind = 0;
      do {                    // Suche zellen
        FSR = zellen + zell_ind;
        if(steuer == DELETE) INDF = 0;    // flags und summe auf einen schlag
        else if(steuer == REDUCE) {if(RD_SUM) WR_SUM(RD_SUM - 1);}
        else if(RD_SUM > FIRE_LIMIT) WR_SUM(FIRE_LIMIT);
      } while(++zell_ind < sizeof(zellen));    // nächste zelle
    }
    
    #define NUMBER_OF_SIMULATION_STEPS 100
    
    int main()
    {
        cout << "Gucki running" << endl;
    
    #ifdef PIC
      RP0 = 1;                // erstmal alle Spezialregister...
      #asm
        DW /*CALL*/ 0x2000 + /*ADRESSE*/ 0x03FF // oscal abholen
      #endasm
      OSCCAL = W;                // und Oszillatorkalibrierung speichern
    
      OPTION = 0;                 // global weak-pullup ein (je 20kOhm)
      WPU = _BV(IN_0) | _BV(IN_1) | _BV(IN_2);
      TRISIO = _BV(IN_0) | _BV(IN_1) | _BV(IN_2);    // eingänge
    
      RP0 = 0;                // normale register und ram
      CMCON = 0x07;                // komparator aus
      timeloop_init();            // timer initialisieren
    #endif
    
      rand_link = FIRST_NEURON;
      gi_zellen(DELETE);            // zellerregungen löschen
    
      uns8 loop = 0;
    
      int steps=0;
      for(steps=0;steps<NUMBER_OF_SIMULATION_STEPS;steps++)
      {
        switch(loop)
        {
          case 0: pattern = 0x01; learn = AKT_0; break;
          case 1: pattern = 0x02; learn = AKT_1; break;
          case 2: pattern = 0x03; learn = AKT_2; break;
          default:
          {
              cout << "error, no pattern" << endl;
          }//FOREVER;
        }
        gi_lerne();
        loop++;
    
    #ifdef WEG
        gi_verlerne();            // links langsam verlernen
    
        if(!++loop) {
          gi_verlerne();            // links langsam verlernen
          gi_zellen(SLEEP);            // schlafen
        }
        else if(!(loop & 0x1F))        // alle 32 durchläufe
          gi_zellen(REDUCE);        // zellerregungen vermindern
    #endif
      }
    
      cout << steps + " simulations steps done" << endl;
      cout << " Gucki stopped" << endl;
        //return 0;
    }
    
    
    /* ENDE */

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.11.2019
    Ort
    Hamburg
    Beiträge
    117
    Hallo stochri,

    die Meldung "error no pattern" verstehe ich nicht. "pattern" ist deklariert und wird benutzt.

    Ah ne... Du scheinst die Switcherei gleich am Anfang von gi-lerne() ausgeklammert zu haben. Die ist aber unverzichtbar.


    Viele Grüße

    Wolfgang

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.11.2019
    Ort
    Hamburg
    Beiträge
    117
    Hallo Forum,

    es sperrt sich in mir alles, die momentane Anpassung des GI-Systems an die Mustererkennung weiterzugehen. Es führt m.E. zur Verblödung des Systems.

    Diese für Dekoder scheinbar so ungünstige Mutation nützlicher Zellverschaltungen vom UND zum ODER ist nicht ganz unnatürlich. Dem pawlowschen Hund reicht irgendwann zum Speichelfluss Glocke ODER Futter.

    Mustererkennung kann man zwar mit einfach strukturierten KNN betreiben. Aber das ist m.E. nicht natürlich. In der Natur ist Mustererekennung ein hochkomplexer Vorgang. Viele Lebewesen beschränken sich darauf, alles für fressbar zu halten, was sie nicht (oder nicht mehr) zur Fortpflanzung gebrauchen können.

    Nein! Ich hab den Pfad der Tugend verlassen. Helmuts: "bau nen Dekoder um zu beweisen, dass GI funktioniert" ist ein Paradoxon. Man müsste sogar andersrum formulieren: "wer einen Dekoder erschaffen hat, muss beweisen, ob sein KNN überhaupt noch was anderes kann".

    Wenn ich neue Wege finden will, muss ich mir zukünftig fest die Ohren zuhalten und komplett alles ignorieren, was mir erzählt wird. Sonst fahr ich das Projekt gegen die Wand des Altbekannten.

    Trotzdem war dieser Ausflug in die Dekoderei hochinteressant. So versteh ich immer besser, wo die KI zur Zeit steht.



    Viele Grüße

    Wolfgang

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.147
    Blog-Einträge
    3
    Hallo Wolfgang,

    im Moment verstehe ich Dein Netz so, dass die Links die Verbindungen zwischen Neuronen sind. Da es nur 42 gibt, müssen wahrscheinlich schwächere Links von Neuronen abgezogen werden, falls ein anderes stärkere Links hat.
    Den Parameter "USE" würde man in klassischen KNN meiner Meinung nach als "Gewichtsfaktoren" (überlicherweise als "weight") abgekürzt, bezeichnen.
    Im Programm waren noch Fehler, die ich erst mal oben im Code korrigiert habe.

    Was mich wundert, ist dass sich nur die Werte 32-35 in der Simulation ändern:
    32 - src:157 dst:32 use:96
    33 - src:0 dst:0 use:0
    34 - src:0 dst:0 use:8
    35 - src:1 dst:3 use:0

    Der Wert 157 für den Link 32 kann wahrscheinlich auch nicht stimmen ( es geht ja nur bis 41 ).

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.11.2019
    Ort
    Hamburg
    Beiträge
    117
    Moin stochri,

    richtig. Links verbinden Neuronen. Schwächere Links können verkümmern mit der Prozedur "gi_verlerne()", die aber bei Dir noch nicht genutzt wurde. Use ist Gewichtung. Den "157"-Fehler kenn ich nicht.

    --------------

    Moin Helmut

    Stattdessen solltest du nur zeigen, dass dein GI überhaupt in der Lage ist, simpelste logische Verknüpfungen darzustellen und zu lernen, welche als Basis der Booleschen Aussagenlogik (Boolesche Algebra) auch gleichzeitig Basis jedes logischen Verhaltens ist und aller wenn-dann-Beziehungen: nämlich UND, ODER und NICHT.
    Dabei werden ganz einfach Input-Muster auf Outputs abgebildet, die für die jew. Verknüpfung entsprechend zu lernen wären ("Lern-Pattern") .
    Das nenne ich "Dekoder bauen". Logische Verknüfungen haben m.E. in der Form der boolschen Algebra im GI-System nichts zu suchen.

    Dekodierung bzw. Mustererkennung gehört nicht auf die erste(n) Zellschichten einer KNN, sondern ist eine sehr hohe Abstrahierung.

    ----

    Zellen kennen kein NOT, XOR und noch nicht mal ein stabiles AND. Sehr wohl aber ein OR. Und noch ein paar andere Funktionen, die es nun wiederrum in der boolschen Algebra nicht gibt.

    Über solche fundamentalen Dinge würde ich mich mit Euch viel lieber unterhalten.

    Aber Helmut kommt aus seiner engen Mustererkennung nicht raus und stochri hat komische Fehler mit GI-Derivaten auf anderen Plattformen.

    Beides bringt mich zur Zeit nicht voran. Ich zieh mich mal ein paar Tage aus dem Forum zurück, bis ich liefern kann.

    Viele Grüße

    Wolfgang
    Geändert von Rumgucker (22.11.2019 um 03:57 Uhr)

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.147
    Blog-Einträge
    3
    Tja, jetzt tut es das:

    Code:
    Gucki running
    Number of Neurons: 30
    Number of Links: 42
    press return
    
    Simulation step number 0
    show state of the links:
    0 - src:255 dst:0 use:0
    1 - src:255 dst:0 use:0
    2 - src:255 dst:0 use:0
    3 - src:255 dst:0 use:0
    4 - src:255 dst:0 use:0
    5 - src:255 dst:0 use:0
    6 - src:255 dst:0 use:0
    7 - src:255 dst:0 use:0
    8 - src:255 dst:0 use:0
    9 - src:255 dst:0 use:0
    10 - src:255 dst:0 use:0
    11 - src:255 dst:0 use:0
    12 - src:255 dst:0 use:0
    13 - src:255 dst:0 use:0
    14 - src:255 dst:0 use:0
    15 - src:255 dst:0 use:0
    16 - src:255 dst:0 use:0
    17 - src:255 dst:0 use:0
    18 - src:255 dst:0 use:0
    19 - src:255 dst:0 use:0
    20 - src:255 dst:0 use:0
    21 - src:255 dst:0 use:0
    22 - src:255 dst:0 use:0
    23 - src:255 dst:0 use:0
    24 - src:255 dst:0 use:0
    25 - src:255 dst:0 use:0
    26 - src:255 dst:0 use:0
    27 - src:255 dst:0 use:0
    28 - src:255 dst:0 use:0
    29 - src:255 dst:0 use:0
    30 - src:255 dst:0 use:0
    31 - src:255 dst:0 use:0
    32 - src:157 dst:32 use:96
    33 - src:0 dst:0 use:0
    34 - src:0 dst:0 use:8
    35 - src:1 dst:3 use:0
    36 - src:255 dst:0 use:0
    37 - src:255 dst:0 use:0
    38 - src:255 dst:0 use:0
    39 - src:255 dst:0 use:0
    40 - src:255 dst:0 use:0
    41 - src:255 dst:0 use:0
    show Neurons
    0 - val:0, fire:0
    1 - val:0, fire:0
    2 - val:0, fire:0
    3 - val:0, fire:0
    4 - val:0, fire:0
    5 - val:0, fire:0
    6 - val:0, fire:0
    7 - val:0, fire:0
    8 - val:0, fire:0
    9 - val:0, fire:0
    10 - val:0, fire:0
    11 - val:0, fire:0
    12 - val:0, fire:0
    13 - val:0, fire:0
    14 - val:0, fire:0
    15 - val:0, fire:0
    16 - val:0, fire:0
    17 - val:0, fire:0
    18 - val:0, fire:0
    19 - val:0, fire:0
    20 - val:0, fire:0
    21 - val:0, fire:0
    22 - val:0, fire:0
    23 - val:0, fire:0
    24 - val:0, fire:0
    25 - val:0, fire:0
    26 - val:0, fire:0
    27 - val:0, fire:0
    28 - val:0, fire:0
    29 - val:0, fire:0
    
    Simulation step number 1
    show state of the links:
    0 - src:255 dst:0 use:0
    1 - src:255 dst:0 use:0
    2 - src:255 dst:0 use:0
    3 - src:255 dst:0 use:0
    4 - src:255 dst:0 use:0
    5 - src:255 dst:0 use:0
    6 - src:255 dst:0 use:0
    7 - src:255 dst:0 use:0
    8 - src:255 dst:0 use:0
    9 - src:255 dst:0 use:0
    10 - src:255 dst:0 use:0
    11 - src:255 dst:0 use:0
    12 - src:255 dst:0 use:0
    13 - src:255 dst:0 use:0
    14 - src:255 dst:0 use:0
    15 - src:255 dst:0 use:0
    16 - src:255 dst:0 use:0
    17 - src:255 dst:0 use:0
    18 - src:255 dst:0 use:0
    19 - src:255 dst:0 use:0
    20 - src:255 dst:0 use:0
    21 - src:255 dst:0 use:0
    22 - src:255 dst:0 use:0
    23 - src:255 dst:0 use:0
    24 - src:255 dst:0 use:0
    25 - src:255 dst:0 use:0
    26 - src:255 dst:0 use:0
    27 - src:255 dst:0 use:0
    28 - src:255 dst:0 use:0
    29 - src:255 dst:0 use:0
    30 - src:255 dst:0 use:0
    31 - src:255 dst:0 use:0
    32 - src:157 dst:32 use:96
    33 - src:0 dst:0 use:0
    34 - src:0 dst:0 use:8
    35 - src:2 dst:4 use:0
    36 - src:255 dst:0 use:0
    37 - src:255 dst:0 use:0
    38 - src:255 dst:0 use:0
    39 - src:255 dst:0 use:0
    40 - src:255 dst:0 use:0
    41 - src:255 dst:0 use:0
    show Neurons
    0 - val:0, fire:0
    1 - val:0, fire:0
    2 - val:0, fire:0
    3 - val:0, fire:0
    4 - val:0, fire:0
    5 - val:0, fire:0
    6 - val:0, fire:0
    7 - val:0, fire:0
    8 - val:0, fire:0
    9 - val:0, fire:0
    10 - val:0, fire:0
    11 - val:0, fire:0
    12 - val:0, fire:0
    13 - val:0, fire:0
    14 - val:0, fire:0
    15 - val:0, fire:0
    16 - val:0, fire:0
    17 - val:0, fire:0
    18 - val:0, fire:0
    19 - val:0, fire:0
    20 - val:0, fire:0
    21 - val:0, fire:0
    22 - val:0, fire:0
    23 - val:0, fire:0
    24 - val:0, fire:0
    25 - val:0, fire:0
    26 - val:0, fire:0
    27 - val:0, fire:0
    28 - val:0, fire:0
    29 - val:0, fire:0
    
    Simulation step number 2
    show state of the links:
    0 - src:255 dst:0 use:0
    1 - src:255 dst:0 use:0
    2 - src:255 dst:0 use:0
    3 - src:255 dst:0 use:0
    4 - src:255 dst:0 use:0
    5 - src:255 dst:0 use:0
    6 - src:255 dst:0 use:0
    7 - src:255 dst:0 use:0
    8 - src:255 dst:0 use:0
    9 - src:255 dst:0 use:0
    10 - src:255 dst:0 use:0
    11 - src:255 dst:0 use:0
    12 - src:255 dst:0 use:0
    13 - src:255 dst:0 use:0
    14 - src:255 dst:0 use:0
    15 - src:255 dst:0 use:0
    16 - src:255 dst:0 use:0
    17 - src:255 dst:0 use:0
    18 - src:255 dst:0 use:0
    19 - src:255 dst:0 use:0
    20 - src:255 dst:0 use:0
    21 - src:255 dst:0 use:0
    22 - src:255 dst:0 use:0
    23 - src:255 dst:0 use:0
    24 - src:255 dst:0 use:0
    25 - src:255 dst:0 use:0
    26 - src:255 dst:0 use:0
    27 - src:255 dst:0 use:0
    28 - src:255 dst:0 use:0
    29 - src:255 dst:0 use:0
    30 - src:255 dst:0 use:0
    31 - src:255 dst:0 use:0
    32 - src:157 dst:32 use:96
    33 - src:0 dst:0 use:0
    34 - src:0 dst:0 use:8
    35 - src:3 dst:5 use:0
    36 - src:255 dst:0 use:0
    37 - src:255 dst:0 use:0
    38 - src:255 dst:0 use:0
    39 - src:255 dst:0 use:0
    40 - src:255 dst:0 use:0
    41 - src:255 dst:0 use:0
    show Neurons
    0 - val:0, fire:0
    1 - val:0, fire:0
    2 - val:0, fire:0
    3 - val:0, fire:0
    4 - val:0, fire:0
    5 - val:0, fire:0
    6 - val:0, fire:0
    7 - val:0, fire:0
    8 - val:0, fire:0
    9 - val:0, fire:0
    10 - val:0, fire:0
    11 - val:0, fire:0
    12 - val:0, fire:0
    13 - val:0, fire:0
    14 - val:0, fire:0
    15 - val:0, fire:0
    16 - val:0, fire:0
    17 - val:0, fire:0
    18 - val:0, fire:0
    19 - val:0, fire:0
    20 - val:0, fire:0
    21 - val:0, fire:0
    22 - val:0, fire:0
    23 - val:0, fire:0
    24 - val:0, fire:0
    25 - val:0, fire:0
    26 - val:0, fire:0
    27 - val:0, fire:0
    28 - val:0, fire:0
    29 - val:0, fire:0
    
    error, no pattern
    Simulation step number 3
    show state of the links:
    0 - src:255 dst:0 use:0
    1 - src:255 dst:0 use:0
    2 - src:255 dst:0 use:0
    3 - src:255 dst:0 use:0
    4 - src:255 dst:0 use:0
    5 - src:255 dst:0 use:0
    6 - src:255 dst:0 use:0
    7 - src:255 dst:0 use:0
    8 - src:255 dst:0 use:0
    9 - src:255 dst:0 use:0
    10 - src:255 dst:0 use:0
    11 - src:255 dst:0 use:0
    12 - src:255 dst:0 use:0
    13 - src:255 dst:0 use:0
    14 - src:255 dst:0 use:0
    15 - src:255 dst:0 use:0
    16 - src:255 dst:0 use:0
    17 - src:255 dst:0 use:0
    18 - src:255 dst:0 use:0
    19 - src:255 dst:0 use:0
    20 - src:255 dst:0 use:0
    21 - src:255 dst:0 use:0
    22 - src:255 dst:0 use:0
    23 - src:255 dst:0 use:0
    24 - src:255 dst:0 use:0
    25 - src:255 dst:0 use:0
    26 - src:255 dst:0 use:0
    27 - src:255 dst:0 use:0
    28 - src:255 dst:0 use:0
    29 - src:255 dst:0 use:0
    30 - src:255 dst:0 use:0
    31 - src:255 dst:0 use:0
    32 - src:157 dst:32 use:96
    33 - src:0 dst:0 use:0
    34 - src:0 dst:0 use:8
    35 - src:3 dst:5 use:0
    36 - src:255 dst:0 use:0
    37 - src:255 dst:0 use:0
    38 - src:255 dst:0 use:0
    39 - src:255 dst:0 use:0
    40 - src:255 dst:0 use:0
    41 - src:255 dst:0 use:0
    show Neurons
    0 - val:0, fire:0
    1 - val:0, fire:0
    2 - val:0, fire:0
    3 - val:0, fire:0
    4 - val:0, fire:0
    5 - val:0, fire:0
    6 - val:0, fire:0
    7 - val:0, fire:0
    8 - val:0, fire:0
    9 - val:0, fire:0
    10 - val:0, fire:0
    11 - val:0, fire:0
    12 - val:0, fire:0
    13 - val:0, fire:0
    14 - val:0, fire:0
    15 - val:0, fire:0
    16 - val:0, fire:0
    17 - val:0, fire:0
    18 - val:0, fire:0
    19 - val:0, fire:0
    20 - val:0, fire:0
    21 - val:0, fire:0
    22 - val:0, fire:0
    23 - val:0, fire:0
    24 - val:0, fire:0
    25 - val:0, fire:0
    26 - val:0, fire:0
    27 - val:0, fire:0
    28 - val:0, fire:0
    29 - val:0, fire:0
    
    error, no pattern
    Simulation step number 4
    show state of the links:
    0 - src:255 dst:0 use:0
    1 - src:255 dst:0 use:0
    2 - src:255 dst:0 use:0
    3 - src:255 dst:0 use:0
    4 - src:255 dst:0 use:0
    5 - src:255 dst:0 use:0
    6 - src:255 dst:0 use:0
    7 - src:255 dst:0 use:0
    8 - src:255 dst:0 use:0
    9 - src:255 dst:0 use:0
    10 - src:255 dst:0 use:0
    11 - src:255 dst:0 use:0
    12 - src:255 dst:0 use:0
    13 - src:255 dst:0 use:0
    14 - src:255 dst:0 use:0
    15 - src:255 dst:0 use:0
    16 - src:255 dst:0 use:0
    17 - src:255 dst:0 use:0
    18 - src:255 dst:0 use:0
    19 - src:255 dst:0 use:0
    20 - src:255 dst:0 use:0
    21 - src:255 dst:0 use:0
    22 - src:255 dst:0 use:0
    23 - src:255 dst:0 use:0
    24 - src:255 dst:0 use:0
    25 - src:255 dst:0 use:0
    26 - src:255 dst:0 use:0
    27 - src:255 dst:0 use:0
    28 - src:255 dst:0 use:0
    29 - src:255 dst:0 use:0
    30 - src:255 dst:0 use:0
    31 - src:255 dst:0 use:0
    32 - src:157 dst:32 use:96
    33 - src:0 dst:0 use:0
    34 - src:0 dst:0 use:8
    35 - src:3 dst:5 use:0
    36 - src:255 dst:0 use:0
    37 - src:255 dst:0 use:0
    38 - src:255 dst:0 use:0
    39 - src:255 dst:0 use:0
    40 - src:255 dst:0 use:0
    41 - src:255 dst:0 use:0
    show Neurons
    0 - val:0, fire:0
    1 - val:0, fire:0
    2 - val:0, fire:0
    3 - val:0, fire:0
    4 - val:0, fire:0
    5 - val:0, fire:0
    6 - val:0, fire:0
    7 - val:0, fire:0
    8 - val:0, fire:0
    9 - val:0, fire:0
    10 - val:0, fire:0
    11 - val:0, fire:0
    12 - val:0, fire:0
    13 - val:0, fire:0
    14 - val:0, fire:0
    15 - val:0, fire:0
    16 - val:0, fire:0
    17 - val:0, fire:0
    18 - val:0, fire:0
    19 - val:0, fire:0
    20 - val:0, fire:0
    21 - val:0, fire:0
    22 - val:0, fire:0
    23 - val:0, fire:0
    24 - val:0, fire:0
    25 - val:0, fire:0
    26 - val:0, fire:0
    27 - val:0, fire:0
    28 - val:0, fire:0
    29 - val:0, fire:0
    
    error, no pattern
    Simulation step number 5
    show state of the links:
    0 - src:255 dst:0 use:0
    1 - src:255 dst:0 use:0
    2 - src:255 dst:0 use:0
    3 - src:255 dst:0 use:0
    4 - src:255 dst:0 use:0
    5 - src:255 dst:0 use:0
    6 - src:255 dst:0 use:0
    7 - src:255 dst:0 use:0
    8 - src:255 dst:0 use:0
    9 - src:255 dst:0 use:0
    10 - src:255 dst:0 use:0
    11 - src:255 dst:0 use:0
    12 - src:255 dst:0 use:0
    13 - src:255 dst:0 use:0
    14 - src:255 dst:0 use:0
    15 - src:255 dst:0 use:0
    16 - src:255 dst:0 use:0
    17 - src:255 dst:0 use:0
    18 - src:255 dst:0 use:0
    19 - src:255 dst:0 use:0
    20 - src:255 dst:0 use:0
    21 - src:255 dst:0 use:0
    22 - src:255 dst:0 use:0
    23 - src:255 dst:0 use:0
    24 - src:255 dst:0 use:0
    25 - src:255 dst:0 use:0
    26 - src:255 dst:0 use:0
    27 - src:255 dst:0 use:0
    28 - src:255 dst:0 use:0
    29 - src:255 dst:0 use:0
    30 - src:255 dst:0 use:0
    31 - src:255 dst:0 use:0
    32 - src:157 dst:32 use:96
    33 - src:0 dst:0 use:0
    34 - src:0 dst:0 use:8
    35 - src:3 dst:5 use:0
    36 - src:255 dst:0 use:0
    37 - src:255 dst:0 use:0
    38 - src:255 dst:0 use:0
    39 - src:255 dst:0 use:0
    40 - src:255 dst:0 use:0
    41 - src:255 dst:0 use:0
    show Neurons
    0 - val:0, fire:0
    1 - val:0, fire:0
    2 - val:0, fire:0
    3 - val:0, fire:0
    4 - val:0, fire:0
    5 - val:0, fire:0
    6 - val:0, fire:0
    7 - val:0, fire:0
    8 - val:0, fire:0
    9 - val:0, fire:0
    10 - val:0, fire:0
    11 - val:0, fire:0
    12 - val:0, fire:0
    13 - val:0, fire:0
    14 - val:0, fire:0
    15 - val:0, fire:0
    16 - val:0, fire:0
    17 - val:0, fire:0
    18 - val:0, fire:0
    19 - val:0, fire:0
    20 - val:0, fire:0
    21 - val:0, fire:0
    22 - val:0, fire:0
    23 - val:0, fire:0
    24 - val:0, fire:0
    25 - val:0, fire:0
    26 - val:0, fire:0
    27 - val:0, fire:0
    28 - val:0, fire:0
    29 - val:0, fire:0
    
    error, no pattern
    Simulation step number 6
    show state of the links:
    0 - src:255 dst:0 use:0
    1 - src:255 dst:0 use:0
    2 - src:255 dst:0 use:0
    3 - src:255 dst:0 use:0
    4 - src:255 dst:0 use:0
    5 - src:255 dst:0 use:0
    6 - src:255 dst:0 use:0
    7 - src:255 dst:0 use:0
    8 - src:255 dst:0 use:0
    9 - src:255 dst:0 use:0
    10 - src:255 dst:0 use:0
    11 - src:255 dst:0 use:0
    12 - src:255 dst:0 use:0
    13 - src:255 dst:0 use:0
    14 - src:255 dst:0 use:0
    15 - src:255 dst:0 use:0
    16 - src:255 dst:0 use:0
    17 - src:255 dst:0 use:0
    18 - src:255 dst:0 use:0
    19 - src:255 dst:0 use:0
    20 - src:255 dst:0 use:0
    21 - src:255 dst:0 use:0
    22 - src:255 dst:0 use:0
    23 - src:255 dst:0 use:0
    24 - src:255 dst:0 use:0
    25 - src:255 dst:0 use:0
    26 - src:255 dst:0 use:0
    27 - src:255 dst:0 use:0
    28 - src:255 dst:0 use:0
    29 - src:255 dst:0 use:0
    30 - src:255 dst:0 use:0
    31 - src:255 dst:0 use:0
    32 - src:157 dst:32 use:96
    33 - src:0 dst:0 use:0
    34 - src:0 dst:0 use:8
    35 - src:3 dst:5 use:0
    36 - src:255 dst:0 use:0
    37 - src:255 dst:0 use:0
    38 - src:255 dst:0 use:0
    39 - src:255 dst:0 use:0
    40 - src:255 dst:0 use:0
    41 - src:255 dst:0 use:0
    show Neurons
    0 - val:0, fire:0
    1 - val:0, fire:0
    2 - val:0, fire:0
    3 - val:0, fire:0
    4 - val:0, fire:0
    5 - val:0, fire:0
    6 - val:0, fire:0
    7 - val:0, fire:0
    8 - val:0, fire:0
    9 - val:0, fire:0
    10 - val:0, fire:0
    11 - val:0, fire:0
    12 - val:0, fire:0
    13 - val:0, fire:0
    14 - val:0, fire:0
    15 - val:0, fire:0
    16 - val:0, fire:0
    17 - val:0, fire:0
    18 - val:0, fire:0
    19 - val:0, fire:0
    20 - val:0, fire:0
    21 - val:0, fire:0
    22 - val:0, fire:0
    23 - val:0, fire:0
    24 - val:0, fire:0
    25 - val:0, fire:0
    26 - val:0, fire:0
    27 - val:0, fire:0
    28 - val:0, fire:0
    29 - val:0, fire:0
    
    error, no pattern
    Simulation step number 7
    show state of the links:
    0 - src:255 dst:0 use:0
    1 - src:255 dst:0 use:0
    2 - src:255 dst:0 use:0
    3 - src:255 dst:0 use:0
    4 - src:255 dst:0 use:0
    5 - src:255 dst:0 use:0
    6 - src:255 dst:0 use:0
    7 - src:255 dst:0 use:0
    8 - src:255 dst:0 use:0
    9 - src:255 dst:0 use:0
    10 - src:255 dst:0 use:0
    11 - src:255 dst:0 use:0
    12 - src:255 dst:0 use:0
    13 - src:255 dst:0 use:0
    14 - src:255 dst:0 use:0
    15 - src:255 dst:0 use:0
    16 - src:255 dst:0 use:0
    17 - src:255 dst:0 use:0
    18 - src:255 dst:0 use:0
    19 - src:255 dst:0 use:0
    20 - src:255 dst:0 use:0
    21 - src:255 dst:0 use:0
    22 - src:255 dst:0 use:0
    23 - src:255 dst:0 use:0
    24 - src:255 dst:0 use:0
    25 - src:255 dst:0 use:0
    26 - src:255 dst:0 use:0
    27 - src:255 dst:0 use:0
    28 - src:255 dst:0 use:0
    29 - src:255 dst:0 use:0
    30 - src:255 dst:0 use:0
    31 - src:255 dst:0 use:0
    32 - src:157 dst:32 use:96
    33 - src:0 dst:0 use:0
    34 - src:0 dst:0 use:8
    35 - src:3 dst:5 use:0
    36 - src:255 dst:0 use:0
    37 - src:255 dst:0 use:0
    38 - src:255 dst:0 use:0
    39 - src:255 dst:0 use:0
    40 - src:255 dst:0 use:0
    41 - src:255 dst:0 use:0
    show Neurons
    0 - val:0, fire:0
    1 - val:0, fire:0
    2 - val:0, fire:0
    3 - val:0, fire:0
    4 - val:0, fire:0
    5 - val:0, fire:0
    6 - val:0, fire:0
    7 - val:0, fire:0
    8 - val:0, fire:0
    9 - val:0, fire:0
    10 - val:0, fire:0
    11 - val:0, fire:0
    12 - val:0, fire:0
    13 - val:0, fire:0
    14 - val:0, fire:0
    15 - val:0, fire:0
    16 - val:0, fire:0
    17 - val:0, fire:0
    18 - val:0, fire:0
    19 - val:0, fire:0
    20 - val:0, fire:0
    21 - val:0, fire:0
    22 - val:0, fire:0
    23 - val:0, fire:0
    24 - val:0, fire:0
    25 - val:0, fire:0
    26 - val:0, fire:0
    27 - val:0, fire:0
    28 - val:0, fire:0
    29 - val:0, fire:0
    
    error, no pattern
    Simulation step number 8
    show state of the links:
    0 - src:255 dst:0 use:0
    1 - src:255 dst:0 use:0
    2 - src:255 dst:0 use:0
    3 - src:255 dst:0 use:0
    4 - src:255 dst:0 use:0
    5 - src:255 dst:0 use:0
    6 - src:255 dst:0 use:0
    7 - src:255 dst:0 use:0
    8 - src:255 dst:0 use:0
    9 - src:255 dst:0 use:0
    10 - src:255 dst:0 use:0
    11 - src:255 dst:0 use:0
    12 - src:255 dst:0 use:0
    13 - src:255 dst:0 use:0
    14 - src:255 dst:0 use:0
    15 - src:255 dst:0 use:0
    16 - src:255 dst:0 use:0
    17 - src:255 dst:0 use:0
    18 - src:255 dst:0 use:0
    19 - src:255 dst:0 use:0
    20 - src:255 dst:0 use:0
    21 - src:255 dst:0 use:0
    22 - src:255 dst:0 use:0
    23 - src:255 dst:0 use:0
    24 - src:255 dst:0 use:0
    25 - src:255 dst:0 use:0
    26 - src:255 dst:0 use:0
    27 - src:255 dst:0 use:0
    28 - src:255 dst:0 use:0
    29 - src:255 dst:0 use:0
    30 - src:255 dst:0 use:0
    31 - src:255 dst:0 use:0
    32 - src:157 dst:32 use:96
    33 - src:0 dst:0 use:0
    34 - src:0 dst:0 use:8
    35 - src:3 dst:5 use:0
    36 - src:255 dst:0 use:0
    37 - src:255 dst:0 use:0
    38 - src:255 dst:0 use:0
    39 - src:255 dst:0 use:0
    40 - src:255 dst:0 use:0
    41 - src:255 dst:0 use:0
    show Neurons
    0 - val:0, fire:0
    1 - val:0, fire:0
    2 - val:0, fire:0
    3 - val:0, fire:0
    4 - val:0, fire:0
    5 - val:0, fire:0
    6 - val:0, fire:0
    7 - val:0, fire:0
    8 - val:0, fire:0
    9 - val:0, fire:0
    10 - val:0, fire:0
    11 - val:0, fire:0
    12 - val:0, fire:0
    13 - val:0, fire:0
    14 - val:0, fire:0
    15 - val:0, fire:0
    16 - val:0, fire:0
    17 - val:0, fire:0
    18 - val:0, fire:0
    19 - val:0, fire:0
    20 - val:0, fire:0
    21 - val:0, fire:0
    22 - val:0, fire:0
    23 - val:0, fire:0
    24 - val:0, fire:0
    25 - val:0, fire:0
    26 - val:0, fire:0
    27 - val:0, fire:0
    28 - val:0, fire:0
    29 - val:0, fire:0
    
    error, no pattern
    Simulation step number 9
    show state of the links:
    0 - src:255 dst:0 use:0
    1 - src:255 dst:0 use:0
    2 - src:255 dst:0 use:0
    3 - src:255 dst:0 use:0
    4 - src:255 dst:0 use:0
    5 - src:255 dst:0 use:0
    6 - src:255 dst:0 use:0
    7 - src:255 dst:0 use:0
    8 - src:255 dst:0 use:0
    9 - src:255 dst:0 use:0
    10 - src:255 dst:0 use:0
    11 - src:255 dst:0 use:0
    12 - src:255 dst:0 use:0
    13 - src:255 dst:0 use:0
    14 - src:255 dst:0 use:0
    15 - src:255 dst:0 use:0
    16 - src:255 dst:0 use:0
    17 - src:255 dst:0 use:0
    18 - src:255 dst:0 use:0
    19 - src:255 dst:0 use:0
    20 - src:255 dst:0 use:0
    21 - src:255 dst:0 use:0
    22 - src:255 dst:0 use:0
    23 - src:255 dst:0 use:0
    24 - src:255 dst:0 use:0
    25 - src:255 dst:0 use:0
    26 - src:255 dst:0 use:0
    27 - src:255 dst:0 use:0
    28 - src:255 dst:0 use:0
    29 - src:255 dst:0 use:0
    30 - src:255 dst:0 use:0
    31 - src:255 dst:0 use:0
    32 - src:157 dst:32 use:96
    33 - src:0 dst:0 use:0
    34 - src:0 dst:0 use:8
    35 - src:3 dst:5 use:0
    36 - src:255 dst:0 use:0
    37 - src:255 dst:0 use:0
    38 - src:255 dst:0 use:0
    39 - src:255 dst:0 use:0
    40 - src:255 dst:0 use:0
    41 - src:255 dst:0 use:0
    show Neurons
    0 - val:0, fire:0
    1 - val:0, fire:0
    2 - val:0, fire:0
    3 - val:0, fire:0
    4 - val:0, fire:0
    5 - val:0, fire:0
    6 - val:0, fire:0
    7 - val:0, fire:0
    8 - val:0, fire:0
    9 - val:0, fire:0
    10 - val:0, fire:0
    11 - val:0, fire:0
    12 - val:0, fire:0
    13 - val:0, fire:0
    14 - val:0, fire:0
    15 - val:0, fire:0
    16 - val:0, fire:0
    17 - val:0, fire:0
    18 - val:0, fire:0
    19 - val:0, fire:0
    20 - val:0, fire:0
    21 - val:0, fire:0
    22 - val:0, fire:0
    23 - val:0, fire:0
    24 - val:0, fire:0
    25 - val:0, fire:0
    26 - val:0, fire:0
    27 - val:0, fire:0
    28 - val:0, fire:0
    29 - val:0, fire:0
    
    
    simulations steps done: 10
     Gucki stopped
    Code:
    #define RUNNING_ON_PC
    
    #define NUMBEROFNEURONS 30
    
    //********************** RUNNING ON PC ***********************************
    #ifdef RUNNING_ON_PC
    #include <iostream>
    #include <stdint.h>
    #include <stdio.h>
    using namespace std;
    
    #define FOREVER while(1)
    typedef uint8_t uns8; // stdint.h compatibility
    typedef bool   BOOL;
    #define FALSE  0
    #define TRUE   1
    
    // funktioniert nicht
    static unsigned char* FSR;
    #define INDF (*FSR)
    
    #define LINK_SRC 0
    #define LINK_DST 1
    #define LINK_USE 2
    
    #endif
    //************************** RUNNING ON PIC ***************************************
    
    #ifdef RUNNING_ON_PIC
    #include "allpic.h"
    #pragma config = 0b000110000100     // hex-datei: fuses des 12F629
    
    #pragma cdata[0x2100] =            \
      0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,\
      0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,\
      0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,\
      0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,\
      0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,\
      0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,\
      0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,0xFF,0,0,\
      0xFF,0xFF                // eeprom initialisierung
    
    #define EE_ROM                // eeprom nutzen
    #include "pic_mem.h"
    
    #include "timeloop.h"
    
    // LINK-Zugriffe
    #define LINK_RD(a,m)    ee_read((a) + offsetof(struct _link,m))
    #define LINK_WR(a,m,v)    ee_write((a) + offsetof(struct _link,m),v)
    #endif
    
    
    #define OUT_0        0        // GPIO
    #define OUT_1        1        //
    #define OUT_2        2        //
    #define IN_2        3        //
    #define IN_1        4        //
    #define IN_0        5        //
    
    //** alle sensoren, aktoren, triebe und neuronen nach abstraktion gestaffelt ******
    uns8 zellen[NUMBEROFNEURONS];            // zellen im RAM anlegen
    
    // cells are bit coded
    // b7        b6 b5 b4 b3 b2 b1 b0
    // FIRE_REQ  ( cell potential   )
    
    #define FIRE_LIMIT    10        // fire_limit
    
    #define RD_SUM        (INDF & 0x3F)    // ZELL-Zugriffe
    #define WR_SUM(s)    {INDF &= ~0x3F; INDF |= (s);}
    
    #ifdef RUNNING_ON_PIC
    #define RD_FIRE_REQ    (INDF.7)
    #define WR_FIRE_REQ(b)    {INDF.7 = (b);}
    #endif
    
    #ifdef RUNNING_ON_PC
    #define RD_FIRE_REQ    !!(INDF&0x80)
    #define WR_FIRE_REQ(b)    {INDF&=~0x80;INDF|=b<<7;} //{INDF.7 = (b);}
    #endif
    
    #define SENS_0        0               // Sensoren
    #define SENS_1        1
    #define SENS_2        2
    #define AKT_0        3               // spezialzellen definieren
    #define AKT_1        4
    #define AKT_2        5
    #define TIMER        6        // Timer-Zelle
    #define HUNGER        7        // Hunger-Zelle
    #define FIRST_NEURON    8        // Beginn des Hirns
    
    //******* verbunden werden zellen mit vielen links (dendriten) *********
    #define NO_LINK        -1
    #define MAX_LINKS    (128 / sizeof(struct _link))    // viele links im EEPROM
    
    struct _link {                // struktur eines EEPROM-links
      uns8 src;                // leerer link: src_zelle == NO_LINK
      uns8 dst;                // verbindet source- mit dest-zelle
      uns8 use;                // nützlichkeit dieses links
    };
    
    //********************** RUNNIN ON PC ***********************************
    #ifdef RUNNING_ON_PC
    
    _link Simulated_EEPROM[NUMBEROFNEURONS];
    
    void initEEPROM()
    {
        for(int n=0;n<MAX_LINKS    ;n++)
        {
            int address=n;
    
            Simulated_EEPROM[address].src=0xFF;
            Simulated_EEPROM[address].dst=0;
            Simulated_EEPROM[address].use=0;
        }
    }
    
    uns8 LINK_RD(uns8 address, uns8 component)
    {
      uns8 value = 0;
      if (component == LINK_SRC) value = Simulated_EEPROM[address].src;
      if (component == LINK_DST) value = Simulated_EEPROM[address].dst;
      if (component == LINK_USE) value = Simulated_EEPROM[address].use;
      return value;
    }
    
    void LINK_WR(uns8 address, uns8 component, uns8 value)
    {
    
      if (address < NUMBEROFNEURONS)
      {
        if (component == LINK_SRC) Simulated_EEPROM[address].src = value;
        if (component == LINK_DST) Simulated_EEPROM[address].dst = value;
        if (component == LINK_USE) Simulated_EEPROM[address].use = value;
      } else
      {
          printf("Error: link address out of range, address:%d\n ",address);
      }
    }
    
    void showAktor(int aktorId,bool bit)
    {
        /*
        printf("%d:",aktorId);
        if(bit) printf("ON ");
        else printf("OFF ");
        */
    }
    
    void showLinks(uint8_t adr)
    {
        int src=Simulated_EEPROM[adr].src;
        int dst=Simulated_EEPROM[adr].dst;
        int use=Simulated_EEPROM[adr].use;
        printf("%d - src:%d dst:%d use:%d\n",adr,src,dst,use);
    }
    
    void showNeurons()
    {
        for(int n=0;n<NUMBEROFNEURONS;n++)
        {
            int neuronNumber=n;
            int potential=zellen[n]&0x3F;
            int fireRequest=(zellen[n]&0x80)>>7;
            printf("%d - val:%d, fire:%d\n",neuronNumber,potential,fireRequest);
        }
    }
    
    void showAll()
    {
      puts("show state of the links:");
      for (uint16_t n = 0; n < MAX_LINKS; n++)
      {
        showLinks(n);
      }
      puts("show Neurons");
      showNeurons();
      puts("");
    }
    #endif
    
    static uns8 rand_link;            // randomize link
    
    static uns8 pattern;
    static uns8 learn;
    
    static void gi_lerne(void)        // die genesis
    {
      uns8 zell_ind = sizeof(zellen), link, free, buf;
      BOOL hit;
      do {                    // Suche feuernde zellen
        //FSR = &zellen[zell_ind];        // pointer auf zelle
        //FSR = zellen + zell_ind;
        FSR = zellen + --zell_ind;        // pointer auf zelle
        /**** sensoren, aktoren und triebe sind besondere zellen *****/
    #ifdef RUNNING_ON_PIC
        switch(zell_ind) {
          case SENS_0: WR_FIRE_REQ(pattern.0); break;
          case SENS_1: WR_FIRE_REQ(pattern.1); break;
          case SENS_2: WR_FIRE_REQ(FALSE); break;
          case AKT_0:  GPIO.OUT_0 = RD_FIRE_REQ; continue;
          case AKT_1:  GPIO.OUT_1 = RD_FIRE_REQ; continue;
          case AKT_2:  GPIO.OUT_2 = RD_FIRE_REQ; continue;
          default: break;
        }
    #endif
    
    #ifdef RUNNING_ON_PC
        switch(zell_ind) {
          case SENS_0: WR_FIRE_REQ(pattern&1); break;
          case SENS_1: WR_FIRE_REQ((pattern>>1)&1); break;
          case SENS_2: WR_FIRE_REQ(FALSE); break;
          case AKT_0:  showAktor(0,RD_FIRE_REQ); continue;
          case AKT_1:  showAktor(1,RD_FIRE_REQ); continue;
          case AKT_2:  showAktor(2,RD_FIRE_REQ); continue;
          default: break;
        }
    #endif
    
        /***** diese zeilen sind der kern des systems *****************/
        if(!RD_FIRE_REQ) continue;        // zelle möchte nicht feuern
        WR_FIRE_REQ(FALSE);            // zell-feuerwunsch wird nun erfüllt
        free = NO_LINK; link = 0; hit = FALSE;    // verfolge die links
        do {                // alle links durchsuchen
          buf = LINK_RD(link,LINK_SRC);        // linkbyte lesen
          if(buf == NO_LINK) free = link;    // leeren link merken
          else if(buf == zell_ind) {    // einen link gefunden
        uns8 hbuf = LINK_RD(link,LINK_USE);    // nuetzlichkeit lesen
        if(hbuf) hit = TRUE;        // nutzlink gefunden
        if(++hbuf > FIRE_LIMIT) hbuf = FIRE_LIMIT;// limitieren
        FSR = zellen + LINK_RD(link,LINK_DST);// pointer auf dst-zelle
        buf = RD_SUM + hbuf;        // zellsumme berechnen
        if(buf > FIRE_LIMIT) buf = FIRE_LIMIT;    // limitieren
        WR_SUM(buf);            // zellsumme speichern
        if((buf == FIRE_LIMIT)&&(!RD_FIRE_REQ)) {// will dst feuern?
          WR_FIRE_REQ(TRUE);        // FIRE_REQ vormerken
          LINK_WR(link,LINK_USE,hbuf);    // nuetzlichkeit inkrementieren
        }
          }
          link += sizeof(struct _link);    // nächsten link adressieren
        } while(link < MAX_LINKS * sizeof(struct _link));
    
        /** wenn kein nützlicher link gefunden und platz ist: erzeuge neuen link **/
        if((!hit)&&(free != NO_LINK)) {
          LINK_WR(free,LINK_SRC,zell_ind);    // link neu erzeugen
          if(learn) buf = learn;        // gewollte verlinkung
          else {                // zufällige verlinkung
        if(++rand_link >= sizeof(zellen)) rand_link = FIRST_NEURON;
        buf = rand_link;
        if((buf == zell_ind)&&(++buf >= sizeof(zellen))) buf = FIRST_NEURON;
          }
          LINK_WR(free,LINK_DST,buf);
          LINK_WR(free,LINK_USE,0);        // ob der link nützlich wird, weiß keiner
        }
      } while(++zell_ind < sizeof(zellen));    // nächste zelle
    }
    
    static void gi_verlerne(void)        // links überarbeiten
    {
      uns8 link = 0, buf;
      do {                    // alle links durchsuchen
        if(LINK_RD(link,LINK_SRC) != NO_LINK) {    // leere links skippen
          buf = LINK_RD(link,LINK_USE);        // nuetzlichkeit lesen
          if(buf) LINK_WR(link,LINK_USE,--buf);    // langsam verlernen
          if(!buf) LINK_WR(link,LINK_SRC,NO_LINK);// link ganz löschen
        }
        link += sizeof(struct _link);    // nächster link
      } while(link < MAX_LINKS * sizeof(struct _link));
    }
    
    #define DELETE        0
    #define REDUCE        1
    #define SLEEP        2
    
    static void gi_zellen(uns8 steuer)    // zell-erregungen überarbeiten
    {                    // DELETE, REDUCE oder SLEEP
      uns8 zell_ind = sizeof(zellen);
      do {                    // Suche zellen
        FSR = zellen + --zell_ind;
        if(steuer == DELETE) INDF = 0;    // flags und summe auf einen schlag
        else if(steuer == REDUCE) {if(RD_SUM) WR_SUM(RD_SUM - 1);}
        else if(RD_SUM > FIRE_LIMIT) WR_SUM(FIRE_LIMIT);
      } while(zell_ind);            // nächste zelle
    }
    
    #define NUMBER_OF_SIMULATION_STEPS 10
    
    int main()
    {
    #ifdef RUNNING_ON_PC
        printf("Gucki running\n" );
        initEEPROM();
        printf("Number of Neurons: %d\n",NUMBEROFNEURONS);
        printf("Number of Links: %d\n",(int)MAX_LINKS);
        puts("press return");
        getchar();
    #endif
    
    #ifdef RUNNING_ON_PIC
      RP0 = 1;                // erstmal alle Spezialregister...
      #asm
        DW /*CALL*/ 0x2000 + /*ADRESSE*/ 0x03FF // oscal abholen
      #endasm
      OSCCAL = W;                // und Oszillatorkalibrierung speichern
    
      OPTION = 0;                 // global weak-pullup ein (je 20kOhm)
      WPU = _BV(IN_0) | _BV(IN_1) | _BV(IN_2);
      TRISIO = _BV(IN_0) | _BV(IN_1) | _BV(IN_2);    // eingänge
    
      RP0 = 0;                // normale register und ram
      CMCON = 0x07;                // komparator aus
      timeloop_init();            // timer initialisieren
    #endif
    
      rand_link = FIRST_NEURON;
      gi_zellen(DELETE);            // zellerregungen löschen
    
      uns8 loop = 0;
    
      int steps=0;
      for(steps=0;steps<NUMBER_OF_SIMULATION_STEPS;steps++)
      {
        switch(loop)
        {
          case 0: pattern = 0x01; learn = AKT_0; break;
          case 1: pattern = 0x02; learn = AKT_1; break;
          case 2: pattern = 0x03; learn = AKT_2; break;
          default:
          {
            #ifdef RUNNING_ON_PC
              printf("error, no pattern\n");
                  #endif
    
          }//FOREVER;
        }
        gi_lerne();
    #ifdef RUNNING_ON_PC
        printf("Simulation step number %d\n",steps);
        showAll();
    #endif
        loop++;
    
    #ifdef WEG
        gi_verlerne();            // links langsam verlernen
    
        if(!++loop) {
          gi_verlerne();            // links langsam verlernen
          gi_zellen(SLEEP);            // schlafen
        }
        else if(!(loop & 0x1F))        // alle 32 durchläufe
          gi_zellen(REDUCE);        // zellerregungen vermindern
    #endif
      }
    #ifdef RUNNING_ON_PC
      printf("\nsimulations steps done: %d\n",steps);
      printf(" Gucki stopped\n");
    #endif
    
        //return 0;
    }
    
    
    /* ENDE */
    Wenn Du Linux hast, kannst Du die Datein mit

    GCC Gucki.cpp

    und dann laufen lassen.

    Ansonsten gäbe es noch die Möglichkeit, Cygwin auf Windows zu installieren, da ist der GCC auch drinn.

    - - - Aktualisiert - - -

    So richtig ist mir nicht klar, was die Variable "pattern" genau macht. Kannst Du was dazu sagen?
    Geändert von stochri (21.11.2019 um 10:22 Uhr) Grund: Fehler im Code repariert

  9. #9
    HaWe
    Gast
    Helmuts: "bau nen Dekoder um zu beweisen, dass GI funktioniert" ist ein Paradoxon.
    ich habe nie gesagt, du sollest einen Dekoder bauen - das war deine eigene Idee, weil du ja gar nicht wusstest oder zeigen konntest, was dein GI intern überhaupt macht
    MIR war das völlig egal - wichtig waren nur inputs und zugehörige Outputs.

    Stattdessen solltest du nur zeigen, dass dein GI überhaupt in der Lage ist, simpelste logische Verknüpfungen darzustellen und zu lernen, welche als Basis der Booleschen Aussagenlogik (Boolesche Algebra) auch gleichzeitig Basis jedes logischen Verhaltens ist und aller wenn-dann-Beziehungen: nämlich UND, ODER und NICHT.
    Dabei werden ganz einfach Input-Muster auf Outputs abgebildet, die für die jew. Verknüpfung entsprechend zu lernen wären ("Lern-Pattern") .

    Ein intelligentes System muss einfach gezielt mindestens lernen können, dass bei 2 unabhängigen Eingängen
    a) ein Ausgang nur true ist, wenn beide zugeordnete Eingänge gleichzeitig true sind (UND)
    b) ein Ausgang nur true ist, wenn mindestens einer der beiden zugeordneten Eingänge true ist (ODER)
    c) ein Ausgang nur true ist, wenn der zugeordnete Eingang false ist - und umgekehrt (NICHT).
    (Dabei war jetzt noch nicht einmal die XOR Verkrnüpfung dabei.)

    Und das muss selbstverständlich auch tatsächlich experimentell nachweisbar sein: das ist kein Paradox, sondern zwingende Vorraussetzung.
    Sonst lernt das System nicht reproduzierbar Gezieltes und Nachprüfbares, sondern macht nur irgendetwas unachvollziehbar Nebulöses.
    Geändert von HaWe (21.11.2019 um 11:46 Uhr) Grund: typo

Ähnliche Themen

  1. Nupic: Auf dem Weg zu maschineller Intelligenz
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 05.06.2013, 08:50
  2. TV: Künstliche Intelligenz
    Von Günter49 im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 17
    Letzter Beitrag: 29.06.2009, 14:29
  3. Computersystem intelligenz
    Von runner02 im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 11
    Letzter Beitrag: 18.03.2009, 18:43
  4. Künstliche Intelligenz (KI)
    Von Devil im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 2
    Letzter Beitrag: 12.04.2005, 16:18
  5. Intelligenz in Werkzeugen
    Von Frank im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 03.05.2004, 19:36

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test