- fchao-Sinus-Wechselrichter AliExpress         
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.156
    Blog-Einträge
    3
    Wie gesagt: noch Kleinkram dran zu machen.
    Ähäm, naja ... Ich hab's mal im Rahmen der Möglichkeiten für einen Arduino-Uno "Arduinofiziert".
    Es lebt tatsächlich, aber im wesentlichen von den Softwarefehlern.

    Code:
    /*
      #include "allpic.h"
      #pragma config = 0b000110000100  // hex-datei: fuses des 12F629
      #define EE_ROM      // eeprom nutzen
      #include "pic_mem.h"
      #include "timeloop.h"   // timer-routinen
    */
    
    // PIC C-Compiler compatibility
    
    typedef int8_t uns8; // stdint compatibility
    typedef bool   BOOL;
    #define FALSE  false
    #define TRUE   false
    
    /*
      #define IN_0    0 // GPIO-Eingänge
      #define IN_1    1 //
      #define IN_2    2 //
      #define IN_3    3 //
      #define OUT_0   4 // GPIO-Ausgänge
      #define OUT_1   5 //
    */
    
    //** alle sensoren, aktoren, triebe und neuronen nach abstraktion gestaffelt ******
    #define NUMBEROFNEURONS 30
    uns8 zellen[NUMBEROFNEURONS];    // zellen im RAM anlegen
    
    #define FIRE_REQ      7 // fire_req bit in der zelle
    #define FIRE_LIMIT    10  // fire_limit
    
    #define SENS_0        0 // spezialzellen definieren
    #define SENS_1        1 // Sensoren
    #define SENS_2        2
    #define SENS_3        3
    #define TIMER         4 // Timer-Zelle
    #define HUNGER        5 // Hunger-Zelle
    #define FIRST_NEURON  6 // davor nur read-only-zellen
    #define AKT_0         (sizeof(zellen) - 2)
    #define AKT_1         (sizeof(zellen) - 1)
    
    //******* verbunden werden zellen mit vielen links (dendriten) *********
    #define NO_LINK   -1
    //#define MAX_LINKS (128 / sizeof(struct _link))// viele links im EEPROM
    #define MAX_LINKS 32
    
    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
    };
    
    #define LINK_SRC 0
    #define LINK_DST 1
    #define LINK_USE 2
    /*
    uint8_t src;
    uint8_t dst;
    uint8_t use;
    */
    // LINK-Zugriffe im PIC
    // #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)
    _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
      {
        Serial.print("Error: link address out of range "); Serial.println(address);
        delay(100);
      }
    }
    
    static uns8 rand_link = 0;  // randomize link
    
    /*
      void gpio_out(uint8_t pin)
      {
    
      }
    */
    
    uint16_t FSR; //pointer auf zelle
    uint16_t INDF; // ?
    
    
    static void gi_denke(void)  // die genesis
    {
      uns8 zell_ind = 0, link=0, freeLink=0, buf=0;
      BOOL hit;
      do {              // Suche feuernde zellen
        rand_link++;    // randomize link
        FSR = zellen + zell_ind;  // pointer auf zelle
    
        /**** sensoren, aktoren und triebe sind besondere zellen *****/
        /*
            if (zell_ind <= SENS_3) { // Sensoren abfragen
              buf = _BV(zell_ind);  // bit-maske entwickeln
              if (GPIO & buf) {
                if (!(INDF.0)) INDF = FIRE_LIMIT + _BV(FIRE_REQ);
              }
              else INDF.0 = 0   // FIRE_REQ bearbeiten
              }       // nun die aktoren
            else if (zell_ind == AKT_0) GPIO.OUT_0 = INDF.FIRE_REQ;
            else if (zell_ind == AKT_1) GPIO.OUT_1 = INDF.FIRE_REQ;
    
            if (INDF.FIRE_REQ == FALSE) continue; // zelle möchte nicht feuern
        */
        /***** wenn zelle feuern will, verfolge die links *************/
        //    INDF.FIRE_REQ = FALSE;  // zelle möchte feuern
    
        INDF &= ~(1 << FIRE_REQ);
        freeLink = NO_LINK; link = 0; hit = FALSE;
        do {      // alle links durchsuchen
          rand_link++;    // randomize link
          buf = LINK_RD(link, LINK_SRC); // linkbyte lesen
          if (buf == NO_LINK) freeLink = link; // leeren link merken
          else if (buf == zell_ind) { // link gefunden
            FSR = zellen + LINK_RD(link, LINK_DST); // pointer auf dst-zelle lesen
            //if ((++INDF == FIRE_LIMIT) && (!(INDF.FIRE_REQ))) { // will dst feuern?
            if ((++INDF == FIRE_LIMIT) && (!(INDF & (1 << FIRE_REQ)))) { // will dst feuern?
              //INDF.FIRE_REQ = TRUE; // feuer_req schon mal vormerken
              INDF |= (1 << FIRE_REQ);
              buf = LINK_RD(link, LINK_USE); // zwei zellen feuern synchron
              LINK_WR(link, LINK_USE, ++buf); // dadurch wird der link nuetzlicher
              hit = TRUE;   // zumindest ein nützlicher link
            }
          }
          //link += sizeof(struct _link);// nächsten link adressieren
          link++;// the link pointer is only an address
        } while (link < MAX_LINKS);
        //while (link < MAX_LINKS * sizeof(struct _link));
    
        /** wenn kein nützlicher link gefunden und platz ist: erzeuge neuen link **/
        if ((!hit) && (freeLink != NO_LINK)) {
          LINK_WR(freeLink, LINK_SRC, zell_ind); // link neu erzeugen
          buf = rand_link % sizeof(zellen); // randomize verlinken, aber eingrenzen
          if (buf < FIRST_NEURON) buf += FIRST_NEURON;    // keine read-only-zellen
          if (buf == zell_ind) buf++; // zellen nicht direkt rückkoppeln
          LINK_WR(freeLink, LINK_DST, buf);
          LINK_WR(freeLink, LINK_USE, 0);  // ob der link nützlich wird, weiß keiner
        }
      } while (++zell_ind < sizeof(zellen)); // nächste zelle
    }
    
    #define DELETE    0
    #define REDUCE    1
    #define SLEEP   2
    
    static void gi_links(uns8 steuer) // links abschwächen
    {
      uns8 link = 0, buf;
      do {          // alle links durchsuchen
        if (LINK_RD(link, LINK_SRC) != NO_LINK) { // gelöschte ignorieren
          if (steuer == DELETE) buf = 0;
          else {
            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
        link++;
      } while (link < MAX_LINKS);
      //while (link < MAX_LINKS * sizeof(struct _link));
      if (steuer == DELETE) rand_link = 0;
    }
    
    static void gi_zellen(uns8 steuer)// zell-erregungen abschwächen
    {
      uns8 zell_ind = 0;
      do {        // Suche zellen
        FSR = zellen + zell_ind;  // zellerregung lesen
        if (steuer == DELETE) INDF = 0;
        if (INDF) INDF--;
        if ((steuer == SLEEP) && (INDF > FIRE_LIMIT)) INDF = FIRE_LIMIT - 1;
      } while (++zell_ind < sizeof(zellen)); // nächste zelle
    }
    
    void showLinks(uint8_t adr)
    {
      Serial.print(adr); Serial.print(" -");
      Serial.print(" src:"); Serial.print(Simulated_EEPROM[adr].src);
      Serial.print(" dst:"); Serial.print(Simulated_EEPROM[adr].dst);
      Serial.print(" use:"); Serial.print(Simulated_EEPROM[adr].use);
      Serial.println();
    }
    
    void showAll()
    {
      Serial.println("list Neurons:");
      for (int n = 0; n < MAX_LINKS; n++)
      {
        showLinks(n);
      }
      Serial.println();
    }
    
    void setup()
    {
      Serial.begin(115200);
      Serial.println("Gugi ;-)");
      delay(1000);
      gi_links(DELETE);   // alle links löschen
      gi_zellen(DELETE);    // zellerregungen löschen
    
    }
    
    uns8 loopCounter = 0;
    //  FOREVER {
    void loop()
    {
      Serial.println("gi_denke");
      gi_denke();
      if (!++loopCounter) {
        Serial.println("gi_links");
        gi_links(REDUCE);   // links langsam verlernen
        Serial.println("gi_zellen");
        gi_zellen(SLEEP);   // schlafen
      }
      else if (!(loopCounter & 0x1F)) // alle 32 durchläufe
      {
        Serial.println("gi_zellen");
        gi_zellen(REDUCE);  // zellerregungen vermindern
        showAll();
        delay(1000);
      }
    }

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

    ich wusste nicht, dass Du "arduinifizieren" wolltest. Die Freitags-Version war noch sehr krank. Hier die aktuelle Sonntags-Version:

    gi.txt

    ----

    Zu Deinen "Arduinifizierungen":

    FALSE ist bei mir 0
    TRUE ist bei mir 1

    Der FSR, INDF-Mechanismus ist ein PIC-Feature und zentral. Ich denke an den Konstrukt:

    static unsigned char* FSR;
    #define INDF (*FSR)

    Du solltest auch keinesfalls mit 16-Bit-Werten arbeiten. Dann scheitern Schleifen, Offsets und Bit-Dröseleien.

    Ich rechne damit, dass die Anzahl meiner Links eh nicht reichen wird, um Dekoder zu errichten. Dann muss ich sowieso auf Tiny85 umsteigen. Dann gibts naturgemäß kein "Arduinifizierungs"-Problem mehr.

    Ich hatte den PIC lediglich genommen, weil er mich gleich zum sparsamen Umgang mit allen Ressourcen anhalten sollte. Mal gucken, wie weit ich damit noch komme....

    Ich wäre dafür, dass wir weiterhin gemütlich bleiben. In der Ruhe liegt die Kraft. Zum Nachbauen oder gar zum Konvertieren auf andere Plattformen ist es m.E. noch zu früh. Ich kümmere mich noch nicht um Versionenpflege und Administration und will das zur Zeit auch keinesfalls im Hinterkopf haben. Auch die Anzahl meiner "Links" und Zellen ist beschränkt...

    Viele Grüße

    Wolfgang
    Geändert von Rumgucker (18.11.2019 um 07:24 Uhr)

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

    ich falle mal wieder in meine kleinen Schrittchen zurück.

    Über den in der hochgeladenen Sonntags-Software enthaltenen "pattern"-Mechanismus hab ich die drei Sensor-Zellen mit vier Bitmustern geladen, die dann nacheinander im Netzwerk abgearbeitet wurden.

    switch(zell_ind) {
    case SENS_0: WR_FIRE_REQ(pattern == 1); break;
    case SENS_1: WR_FIRE_REQ(pattern == 2); break;
    case SENS_2: WR_FIRE_REQ(pattern == 3); break;

    Es wird pro Netzwerkdurchlauf also immer ein Bit gesetzt. Oder auch keins.

    000 - Ergebnis: alle Ausgänge low
    100 - Ergebnis: OUT_0 high
    010 - Ergebnis: OUT_1 high
    001 - Ergebnis: OUT_2 high

    Ohne weiteres Zutun kann Klatschi also drei serielle Bits auseinanderhalten und eindeutig dekodieren.

    Ein "zeitloses" Perzeptron-Netz zur Mustererkennung hätte dagegen eher so geanwortet:

    000 - Ergebnis: alle Ausgänge low
    100 - Ergebnis: OUT_0 high (= ein Input-Bit ist gesetzt)
    010 - Ergebnis: OUT_0 high (= ein Input-Bit ist gesetzt)
    001 - Ergebnis: OUT_0 high (= ein Input-Bit ist gesetzt)

    Ich muss also bei zukünftigen Diskussionen höllisch aufpassen, dass ich mir die Kernidee der 20 Zeilen bewahre und nicht verwässern lasse.

    Wenn ein gestelltes Problem nicht auf Anhieb von Klatschi gelöst werden kann, dann muss das nicht unbedingt an Klatschi liegen. Es kann auch am Problem liegen. Da kann schon eine simple Übersetzung des Problems von "Perceptronisch" auf Klatschis Sprache helfen.

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

    Zur Zeit kann Klatschi ohne "Einlernen" zeitliche Ereignisse dekodieren. Nicht mehr und nicht weniger. Unter "zeitlichem Ereignis" verstehe ich das Setzen eines FIRE_REQ-Bits in einer Sensorzelle. Das kann durch eine high-low- oder durch eine low-high-Flanke des serialisierenden patterns entstehen.

    Man muss sich jetzt fragen, ob damit die Aufgabe der "Dekodierung" schon hinreichend gelöst ist, denn ich sollte die 8 möglichen Muster von drei Eingangsbits damit vollständig in 8 eindeutige Ausgangssignale wandeln können (wenn ich genug Ausgänge hätte).

    Für vier Eingangsmuster konnte ich das gestern Abend ja schon zeigen.

    -------

    Klatschi ist tatsächlich ein "wenig anders". Es muss anders gedacht werden. Für Klatschi besteht eine "Information" aus Ereignis und dem Zeitpunkt des Ereignisses. Ein klassisches Perzeptron kennt nur Ereignisse und es macht Mühe, ihm ein Zeitgefühl beizubringen.

    Mein pattern-Generator "versteckt" sozusagen die Anweisung zur richtigen Dekodierung im Zeitpunkt der Information. Das ist das Geheimnis, warum Klatschi keinen besonderen Lehrer braucht. Der pattern-Generator IST der Lehrer.

    Ich werde diese Klatschi-Informationseinheit zukünftig "Ereigniszeit" nennen.

    Viele Grüße

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

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.156
    Blog-Einträge
    3
    ich wusste nicht, dass Du "arduinifizieren" wolltest. Die Freitags-Version war noch sehr krank. Hier die aktuelle Sonntags-Version:

    gi.txt
    Das wollte ich eigentlich gar nicht unbedingt. Aber um deinen Code nachzuvollziehen schien es mir am besten, etwas lauffähiges auf dem Tisch zu haben.
    Den Arduino-Uno habe ich gewählt, weil hier wahrscheinlich jeder einen zu Haus rumliegen hat und die niedrige Leistungsklasse ganz im Sinne deiner PIC-Wahl zur Demonstrationszwecken ist, sonst hätte ich einen ESP32 genommen.

    Ich wäre dafür, dass wir weiterhin gemütlich bleiben. In der Ruhe liegt die Kraft. Zum Nachbauen oder gar zum Konvertieren auf andere Plattformen ist es m.E. noch zu früh. Ich kümmere mich noch nicht um Versionenpflege und Administration und will das zur Zeit auch keinesfalls im Hinterkopf haben. Auch die Anzahl meiner "Links" und Zellen ist beschränkt...
    Es ging mir keineswegs darum vorzugreifen oder dir davon eilen zu wollen. Ich finde es nur schön, wenn ich etwas Lauffähiges auf dem Tisch liegen habe, das irgendwas tut. Das ist besser als abstrakter Code.

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

    ich kann Dich verstehen. Mir würds genauso gehen. Dann nimm aber bitte die Sonntags-Version.

    Und ich werde - wenn sich was erhebliches gändert hat - immer gleich die aktuelle Version hochladen.

    Wir müssen einfach nur unsere Ereigniszeiten besser synchronisieren. Klatschi ist da vorbildhaft...

    Viele Grüße

    Wolfgang

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.11.2019
    Ort
    Hamburg
    Beiträge
    117
    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)

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

Ä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
  •  

fchao-Sinus-Wechselrichter AliExpress