-         
Seite 7 von 14 ErsteErste ... 56789 ... LetzteLetzte
Ergebnis 61 bis 70 von 133

Thema: GI = Guckis Intelligenz

  1. #61
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.11.2019
    Ort
    Hamburg
    Beiträge
    117
    Anzeige

    Hallo Forum,

    Klatschi entdeckt das Auftreten oder Fehlen von Ereignissen zu autonom gelernten Zeitpunkten. Es kann diese Zeitpunkte an langsame Änderungen anpassen. Das ist schon mal gut.

    Ein brauchbarer Dekoder muss aber noch mehr können! Klatschi müsste von Natur aus auch kombinieren können (obwohl ich das noch nie beobachtet/nachvollzogen hab).

    Zur Erlangung einer vorgegebenen Kombinationsfähigkeit muss es eine Steuerung geben, die mehrere Ereigniszeiten einspeist und den ersten aus deren Kombination resultierenden Feuerimpuls mit einem gewünschten Ausgang verbindet. Der Lernvorgang ist beendet, wenn alle gewünschten Ausgänge verlinkt wurden.

    So sollte ich dann auch x-beliebige Dekodierungen hinbekommen können.

    Das bau ich (ab) heute.

    Viele Grüße

    Wolfgang
    Geändert von Rumgucker (18.11.2019 um 11:43 Uhr)

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

    Dekoder klappt bestens:

    10 -> OUT_0
    01 -> OUT_1
    11 -> OUT_2

    Mikrominimale Erweiterung an der Source. Neue Links werden im "learn"-Mode auf die gewünschte Ausgangszelle gelenkt:

    gi.txt


    Es werden nun genau vier Links angelegt und keinerlei Neuronen belegt. Links mit "FF" am Anfang sind noch leer:

    Klicke auf die Grafik für eine größere Ansicht

Name:	gi_net5.jpg
Hits:	5
Größe:	63,9 KB
ID:	34489

    Das sich ergebende Netzwerk ist anscheinend goldrichtig:

    Klicke auf die Grafik für eine größere Ansicht

Name:	gi_net4.jpg
Hits:	6
Größe:	16,9 KB
ID:	34488

    Der Nutzen aller Links ist noch "00", weil sie halt erst gelernt und noch nicht benutzt wurden.

    So wurde das Programm aufgerufen:

    Code:
      FOREVER {
        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: FOREVER;
        }
        gi_lerne();
        loop++;
      }
    Es wurde also für jedes pattern ein zuzuweisender Ausgangsport festgesetzt.

    Damit sind also Dekoder mit logischen Verknüpfungen realisierbar.

    Ich bin mir noch nicht sicher, ob out_2 wirklich bei "11" kommt oder schon bei einem der beiden Bits. Zu dem Test müsste ich in die RAM-Zellen gucken können, damit ich sehe, wann die feuern. Kann ich aber nicht.

    Da muss ich mir noch was zum Test einfallen lassen. Da kann ich noch ne kleine Leiche im Logik-Keller haben.

    Viele Grüße

    Wolfgang

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

    So würde ich ODER "einlernen" (schreckliches Wort):
    pattern=0x10 learn=AKT_2
    pattern=0x01 learn=AKT_2

    und so UND:
    pattern=0x11 learn=OUT_2

    Ich bin mir aber noch nicht sicher, ob das Klatschi auch so siieht.
    Geändert von Rumgucker (18.11.2019 um 17:20 Uhr)

  3. #63
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.11.2019
    Ort
    Hamburg
    Beiträge
    117
    Moin Forum,

    gestern wurde mir bewusst, dass ich mich mal genauer mit der Frage der "Link"-Neubildung befassen muss.

    Wenn ich die Neubildung zu großzügig erlaube, wuchert das Netz. Ich kann zwischen Stagnation und Wucherung alles einstellen.

    Wuchernde Netze sind unvorhersehbarer und erscheinen intelligenter. Sie scheitern aber schnell bei einfachsten Dekodern, weil ihnen vor lauter Wucherung die Links und Zellen ausgehen.

    Wachstumsgebremste Netze sind ideal für Dekoder iund können sich auch an veränderliche Umwelten anpassen. Sie kommen aber keinesfalls in den Verdacht, intelligent zu sein.

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

    Ich halte es für sinnvoll, das Netz in mehreren Phasen wachsen zu lassen.

    Zuerst mal müssen die Reflexe wachsen. Die kann man auch Dekoder nennen. "Etwas kommt von rechts - reiße das Lenrad nach links" wäre so ein Dekoder, bei dem ich auch vorgeben muss, was das System genau tun soll. Dazu reicht mein gestriger pattern/learn-Mechnismus vom Prinzip her erstmal aus. Bei diesem Vorgang stelle ich die Wucherneigung sehr gering ein, wodurch auch nur wenige Ressourcen an Links und Zellen verbraucht werden.

    Danach könnte ein weiterer Durchlauf stattfinden, in dem ich die Wucher-Bremsen lockere. In den höheren Schichten wird dann abstrahiert und findet Intelligenz statt.

    **************

    Weiterhin muss ich mich mit dem Nützlichkeits-Mechanismus befassen. Meine gestrige Software konnte leider nicht "undieren", weil ich die Nützlichkeit ("Gewichtung") eines Links stets nur erhöht hatte, wenn erer folgreich war.

    Es dauerte nicht lange, bis es nicht mehr zweier Links bedurfte, um eine Zelle zum Feuern zu bewegen (= UND-Funktion) sondern ein einziger der beiden Links ausreichte (= ODER). Der Dekoder mutierte also vom erwünschten UND zum unerwünschten ODER.

    Das sind also die beiden momentanen Baustellen. Schichtenweise Wachstumsstrategie und liebevollere Ausgestaltung der Lernregel.

    Viele Grüße

    Wolfgang

  4. #64
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.116
    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?

  5. #65
    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

  6. #66
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.116
    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 */

  7. #67
    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

  8. #68
    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

  9. #69
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.116
    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 11:22 Uhr) Grund: Fehler im Code repariert

  10. #70
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    4.852
    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 12:46 Uhr) Grund: typo
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

Seite 7 von 14 ErsteErste ... 56789 ... LetzteLetzte

Ä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, 09:50
  2. TV: Künstliche Intelligenz
    Von Günter49 im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 17
    Letzter Beitrag: 29.06.2009, 15:29
  3. Computersystem intelligenz
    Von runner02 im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 11
    Letzter Beitrag: 18.03.2009, 19:43
  4. Künstliche Intelligenz (KI)
    Von Devil im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 2
    Letzter Beitrag: 12.04.2005, 17:18
  5. Intelligenz in Werkzeugen
    Von Frank im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 03.05.2004, 20:36

Stichworte

Berechtigungen

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