- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 10

Thema: Inkas Anfrage bezüglich Code, im Thema Linienfolger

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Hallo inka,

    Copy & Paste, um irgendwas zum funktionieren zu bekommen,
    bläht aber den Code womöglich um unnötige Zeilen auf.
    Kann man zur Not machen.

    Einfach mal ein Menü einbauen, wo Du ganze Datensätze eingeben kannst,
    ist so schnell auch nicht gemacht. Zumal die Datensätze (Arrays) im Quelltext
    vom Compiler übersetzt werden. Das sind feste Größen, die sich später nicht
    einfach per Menü ändern lassen.

    Die Vorgehensweise bei dem Quelltext würde ich so sehen:

    1. Überlegen, was ich damit machen will.
    2. Die Eingangszustände definieren.
    3. Die Ausgangszustände definieren.
    4. Den Quelltext für Deine Zwecke anpassen.

    Dann wäre Dein Auto fertig, mit den Eigenschaften, die Du benötigst.
    Ein Universalauto, das alles kann und nur eingestellt werden müsste,
    ist es leider nicht. Bis dahin ist es ein weiter Weg.



    MfG

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hallo Moppi,
    zunächst, nichts liegt mir ferner als hier irgendwelche forderungen zu stellen, ich versuche nur zu erreichen, dass wir die KI endlich von dem podest - ich bin nur was für absolute korypheen - runterstossen - wir müssen reden...

    ich habs mal ein bischen aufgedröselt:
    Zitat Zitat von Moppi Beitrag anzeigen
    Copy & Paste, um irgendwas zum funktionieren zu bekommen, bläht aber den Code womöglich um unnötige Zeilen auf. Kann man zur Not machen.
    In der reinen lehre hast du natürlich recht, früher hatten die autos noch eine vernünftige karroserie, unter 1mm dicke war da nix. Heute spart man. Und optimiert. Kostet zeit, nerven, ressourcen, klima...

    Zitat Zitat von Moppi Beitrag anzeigen
    Einfach mal ein Menü einbauen, wo Du ganze Datensätze eingeben kannst, ist so schnell auch nicht gemacht. Zumal die Datensätze (Arrays) im Quelltext vom Compiler übersetzt werden. Das sind feste Größen, die sich später nicht einfach per Menü ändern lassen.
    Ich wollte nur einzelne werte eingeben. Da wo es nicht geht gibt es standardeinstellungen - zunächst, bis man die ersten probefahrten hinter sich hat...


    Zitat Zitat von Moppi Beitrag anzeigen
    1. Überlegen, was ich damit machen will.
    ich denke damit kann man alles machen? Jetzt aber im ernst: ich wollte nur testen, was z.b. eine änderung an einem wert für konsequenzen für das ergebnis und die laufzteit hat...
    Zitat Zitat von Moppi Beitrag anzeigen
    2. Die Eingangszustände definieren.
    sind die nicht zufällig?
    Zitat Zitat von Moppi Beitrag anzeigen
    3. Die Ausgangszustände definieren.
    das geht, denke ich.
    Zitat Zitat von Moppi Beitrag anzeigen
    4. Den Quelltext für Deine Zwecke anpassen.
    und da sind wir beim problem: für das testen möchte ich eigentlich am quelltext nix anfassen - wenn Du mit quelltext das allerheiligste des Ki-systems meinst...

    Zitat Zitat von Moppi Beitrag anzeigen
    Dann wäre Dein Auto fertig, mit den Eigenschaften, die Du benötigst.
    Ein Universalauto, das alles kann und nur eingestellt werden müsste, ist es leider nicht. Bis dahin ist es ein weiter Weg.
    Ich kenne ja die eigenschaften nicht. siehe punkt 1. Es soll im prinzip nur ein simples "spielzeug" sein mit dem ich verständnis für abhängigkeiten von bestimmten eingans- und ausgangs- werten, von laufzeitabhängigkeit usw. bekomme...

    ich sehe schon, das wird nicht einfach sein...
    gruß inka

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    ich versuche nur zu erreichen, dass wir die KI endlich von dem podest - ich bin nur was für absolute korypheen - runterstossen
    Da bin ich ja bei Dir, deshalb erkläre ich das schon so, dass es verständlich ist.
    Ich denke, "Künstliche Intelligenz" muss man zuerst mal durch so was wie "einstellbares Logikgatter" ersetzen. Um der Sache und der Grundfunktion dieses Quelltextes irgendwie gerecht zu werden.

    Jetzt aber im ernst: ich wollte nur testen, was z.b. eine änderung an einem wert für konsequenzen für das ergebnis und die laufzteit hat...
    Das hatte ich so auch etwa verstanden.

    sind die nicht zufällig?
    Die Eingangszustände nein. Die Ausgangszustände: nein.
    Diese Zustände sind vorgegeben.



    Für die Eingabe kannst Du digitale Signale verwenden "0" oder "1".

    Eingang#1: Umgebungslichtsensor (Licht da: ja / nein)
    Eingang#2: Endschalter an der Fahrzeugfront (an Hindernis gestoßen: ja / nein)

    Für die Ausgabe kommt im Grunde auch "0" oder "1" raus:

    Ausgang#1: Fahren oder Anhalten (Fahren = 1, Anhalten = 0)
    Ausgang#2: Scheinwerfer (Licht an = 1, Licht aus = 0)

    Mit einer Wahrheitstabelle kann man nun die Regeln aufstellen, wie zum Beispiel:

    Wenn kein Umgebungslicht da ist und das Fahrzeug angestoßen ist, dann mache am Scheinwerfer das Licht aus und halte das Fahrzeug an.
    Tabelle dafür:

    Eingang#1,Eingang#2,Ausgang#1,Ausgang#2
    ----0------,----1------,------0------,----0------

    Das entspräche einem Trainingsmuster (Pattern). Davon kannst Du so viele erstellen, wie der Speicher am Ende her gibt.
    Das Programm lernt dann diese Regeln auswendig.
    Später reagiert es auf die Eingangszustände mit den eingeübten Ausgangszuständen.

    Falls Eingangszustände nicht definiert wurden, sie aber dennoch auftreten können, kann das KNN auch darauf reagieren, womöglich sogar "richtig", in unserm Verständnis, obwohl es diese Zustände nie trainiert hat. Erst hier zeigt sich dann die wirkliche Intelligenz, bis dahin kann man davon eigentlich noch nicht so recht sprechen (finde ich). Um das letztere Verhalten auszunutzen und das Netz möglichst intelligent zu machen, benötigt man mehr Schichten, u.U. einige Schichten mehr. Hier gibt es nur eine Zwischenschicht. Ohne diese eine Zwischenschicht würde das noch trauriger aussehen, mit der Intelligenz. Dann könnte das Netz sich noch nicht einmal eine XOR-Wahrheitstabelle "merken".



    MfG


    - - - Aktualisiert - - -

    Mal kurz geschaut:

    const int InputNodes = 2;
    const int HiddenNodes = 2;
    const int OutputNodes = 2;
    const int PatternCount = 4:


    Können zur Laufzeit nicht geändert werden, da der Compiler Speicherplatz für Arrays, aufgrund dieser Werte, organisiert.
    Diese Werte sollten mit der Wahrheitstabelle übereinstimmen und dann muss neu kompiliert werden.






    Gruß

    - - - Aktualisiert - - -

    den Quelltext mit den Eingabemöglichkeiten habe ich einmal angepasst, damit er wenigstens ein wenig funktioniert:


    Code:
    /******************************************************************
       ArduinoANN - An artificial neural network for the Arduino
       All basic settings can be controlled via the Network Configuration
       section.
       See robotics.hobbizine.com/arduinoann.html for details.
     ******************************************************************/
    
    
    
    
    #include <math.h>
    
    
    
    
    /******************************************************************
       Network Configuration - customized per network
     ******************************************************************/
    
    
    
    
    float LearningRate = 0.3;
    float Momentum = 0.9;
    float InitialWeightMax = 0.5;
    float Success = 0.0004;
    
    
    
    
    const int InputNodes = 2;
    const int HiddenNodes = 2;
    const int OutputNodes = 2;
    const int PatternCount = 4;  //zu trainierende Muster
    
    
    const byte Input[PatternCount][InputNodes] =
    {
      { 0, 0 },
      { 1, 0 },
      { 0, 1 },
      { 1, 1 }
    };
    //};
    
    
    
    
    const byte Target[PatternCount][OutputNodes] =
    {
      { 1, 1 },
      { 0, 1 },
      { 1, 0 },
      { 1, 0 }
    };
    
    
    
    
    /******************************************************************
       End Network Configuration
     ******************************************************************/
    
    
    
    
    
    
    
    
    int i, j, p, q, r;
    int ReportEvery1000;
    int RandomizedIndex[PatternCount];
    long  TrainingCycle;
    float Rando;
    float Error;
    float Accum;
    
    
    
    
    
    
    
    
    float Hidden[HiddenNodes];
    float Output[OutputNodes];
    float HiddenWeights[InputNodes + 1][HiddenNodes];
    float OutputWeights[HiddenNodes + 1][OutputNodes];
    float HiddenDelta[HiddenNodes];
    float OutputDelta[OutputNodes];
    float ChangeHiddenWeights[InputNodes + 1][HiddenNodes];
    float ChangeOutputWeights[HiddenNodes + 1][OutputNodes];
    
    
    
    
    void setup() {
      Serial.begin(9600);
      randomSeed(analogRead(3));
      ReportEvery1000 = 1;
      for ( p = 0 ; p < PatternCount ; p++ )
      {
        RandomizedIndex[p] = p ;
      }
    }
    
    
    
    
    void loop ()
    {
    
    
        input_NN();
    
    
        calculation();
    }
    
    
    
    
    /******************************************************************
      Input
    ******************************************************************/
      char str[10];
      int charcount;
    float intInput()
    {
      for(int i=0;i<10;i++)str[i]=0; // String-Puffer löschen
      charcount = 0;
      //memset(str, 0, sizeof(str)); // String-Puffer löschen
      while (!Serial.available()); // Warten bis 1. Zeichen im Eingangspuffer
      delay(100); // Warten auf weitere Zeichen im Eigangspuffer
      while (Serial.available() && charcount < 10)
      {
        str[charcount] = Serial.read(); // Zeichen aus Eingangspuffer lesen
        charcount++;
      }
      return atof(str); // String in Integer-Rückgabewert wandeln
    }
    
    
    void input_NN (void)
    {
      Serial.println();
      Serial.println();
      Serial.print("Geben Sie > LearningRate < (standard = 0.3)ein: ");
      LearningRate = intInput();
      Serial.println(LearningRate, 5);
    
    
      Serial.print("Geben Sie > Momentum < (standard = 0.9)ein: ");
      Momentum =  intInput();
      Serial.println(Momentum, 5);
    
    
      Serial.print("Geben Sie > InitialWeightMax < (standard = 0.5)ein: ");
      InitialWeightMax =  intInput();
      Serial.println(InitialWeightMax, 5);
    
    
      Serial.print("Geben Sie > Success < (standard = 0.0004)ein: ");
      Success =  intInput();
      Serial.println(Success, 5);
    /*
      Serial.print("Geben Sie > InputNodes < (standard = 2)ein: ");
      InputNodes = intInput();
      Serial.println(InputNodes);
    
    
      Serial.print("Geben Sie > HiddenNodes < (standard = 2)ein: ");
      HiddenNodes = intInput();
      Serial.println(HiddenNodes);
    
    
      Serial.print("Geben Sie > OutputNodes < (standard = 2)ein: ");
      OutputNodes = intInput();
      Serial.println(OutputNodes);
    
    
      Serial.print("Geben Sie > PatternCount < (standard = 4)ein: ");
      PatternCount = intInput();
      Serial.println(PatternCount);
    */  
    /*
      Serial.print("Das Ergebnis Wert1 * Wert2 ist = ");
      long wert3 = (long)wert1 * wert2;
      Serial.println(wert3);
      */
      Serial.println();
    }
    
    
    
    
    void calculation()
    {
      /******************************************************************
        Initialize HiddenWeights and ChangeHiddenWeights
      ******************************************************************/
    
    
    
    
      for ( i = 0 ; i < HiddenNodes ; i++ )
      {
        for ( j = 0 ; j <= InputNodes ; j++ )
    
    
    
    
        {
          ChangeHiddenWeights[j][i] = 0.0 ;
          Rando = float(random(100)) / 100;
          HiddenWeights[j][i] = 2.0 * ( Rando - 0.5 ) * InitialWeightMax ;
        }
      }
      /******************************************************************
        Initialize OutputWeights and ChangeOutputWeights
      ******************************************************************/
    
    
    
    
      for ( i = 0 ; i < OutputNodes ; i ++ )
      {
        for ( j = 0 ; j <= HiddenNodes ; j++ )
        {
          ChangeOutputWeights[j][i] = 0.0 ;
          Rando = float(random(100)) / 100;
          OutputWeights[j][i] = 2.0 * ( Rando - 0.5 ) * InitialWeightMax ;
        }
      }
      Serial.println("Initial/Untrained Outputs: ");
      toTerminal();
      /******************************************************************
        Begin training
      ******************************************************************/
    
    
    
    
      for ( TrainingCycle = 1 ; TrainingCycle < 2147483647 ; TrainingCycle++)
      {
        yield();
    
    
    
    
        /******************************************************************
          Randomize order of training patterns
        ******************************************************************/
    
    
    
    
        for ( p = 0 ; p < PatternCount ; p++)
        {
          q = random(PatternCount);
          r = RandomizedIndex[p] ;
          RandomizedIndex[p] = RandomizedIndex[q] ;
          RandomizedIndex[q] = r ;
        }
        Error = 0.0 ;
        /******************************************************************
          Cycle through each training pattern in the randomized order
        ******************************************************************/
        for ( q = 0 ; q < PatternCount ; q++ )
        {
          p = RandomizedIndex[q];
    
    
    
    
          /******************************************************************
            Compute hidden layer activations
          ******************************************************************/
    
    
    
    
          for ( i = 0 ; i < HiddenNodes ; i++ )
          {
            Accum = HiddenWeights[InputNodes][i] ;
            for ( j = 0 ; j < InputNodes ; j++ )
            {
              Accum += Input[p][j] * HiddenWeights[j][i] ;
            }
            Hidden[i] = 1.0 / (1.0 + exp(-Accum)) ;
          }
    
    
    
    
          /******************************************************************
            Compute output layer activations and calculate errors
          ******************************************************************/
    
    
    
    
          for ( i = 0 ; i < OutputNodes ; i++ )
          {
            Accum = OutputWeights[HiddenNodes][i] ;
            for ( j = 0 ; j < HiddenNodes ; j++ )
            {
              Accum += Hidden[j] * OutputWeights[j][i] ;
            }
            Output[i] = 1.0 / (1.0 + exp(-Accum)) ;
            OutputDelta[i] = (Target[p][i] - Output[i]) * Output[i] * (1.0 - Output[i]) ;
            Error += 0.5 * (Target[p][i] - Output[i]) * (Target[p][i] - Output[i]) ;
          }
    
    
    
    
          /******************************************************************
            Backpropagate errors to hidden layer
          ******************************************************************/
    
    
    
    
          for ( i = 0 ; i < HiddenNodes ; i++ )
          {
            Accum = 0.0 ;
            for ( j = 0 ; j < OutputNodes ; j++ ) {
              Accum += OutputWeights[i][j] * OutputDelta[j] ;
            }
            HiddenDelta[i] = Accum * Hidden[i] * (1.0 - Hidden[i]) ;
          }
    
    
    
    
    
    
    
    
          /******************************************************************
            Update Inner-->Hidden Weights
          ******************************************************************/
    
    
    
    
    
    
    
    
          for ( i = 0 ; i < HiddenNodes ; i++ )
          {
            ChangeHiddenWeights[InputNodes][i] = LearningRate * HiddenDelta[i] + Momentum * ChangeHiddenWeights[InputNodes][i] ;
            HiddenWeights[InputNodes][i] += ChangeHiddenWeights[InputNodes][i] ;
            for ( j = 0 ; j < InputNodes ; j++ )
            {
              ChangeHiddenWeights[j][i] = LearningRate * Input[p][j] * HiddenDelta[i] + Momentum * ChangeHiddenWeights[j][i];
              HiddenWeights[j][i] += ChangeHiddenWeights[j][i] ;
            }
          }
    
    
    
    
          /******************************************************************
            Update Hidden-->Output Weights
          ******************************************************************/
    
    
    
    
          for ( i = 0 ; i < OutputNodes ; i ++ )
          {
            ChangeOutputWeights[HiddenNodes][i] = LearningRate * OutputDelta[i] + Momentum * ChangeOutputWeights[HiddenNodes][i] ;
            OutputWeights[HiddenNodes][i] += ChangeOutputWeights[HiddenNodes][i] ;
            for ( j = 0 ; j < HiddenNodes ; j++ )
            {
              ChangeOutputWeights[j][i] = LearningRate * Hidden[j] * OutputDelta[i] + Momentum * ChangeOutputWeights[j][i] ;
              OutputWeights[j][i] += ChangeOutputWeights[j][i] ;
            }
          }
        }
    
    
    
    
        /******************************************************************
          Every 1000 cycles send data to terminal for display
        ******************************************************************/
        ReportEvery1000 = ReportEvery1000 - 1;
        if (ReportEvery1000 == 0)
        {
          Serial.println();
          Serial.println();
          Serial.print ("TrainingCycle: ");
          Serial.print (TrainingCycle);
          Serial.print ("  Error = ");
          Serial.println (Error, 5);
    
    
    
    
          toTerminal();
    
    
    
    
          if (TrainingCycle == 1)
          {
            ReportEvery1000 = 999;
          }
          else
          {
            ReportEvery1000 = 1000;
          }
        }
    
    
    
    
    
    
    
    
        /******************************************************************
          If error rate is less than pre-determined threshold then end
        ******************************************************************/
    
    
    
    
        if ( Error < Success ) break ;
      }
      Serial.println ();
      Serial.println();
      Serial.print ("TrainingCycle: ");
      Serial.print (TrainingCycle);
      Serial.print ("  Error = ");
      Serial.println (Error, 5);
    
    
    
    
      toTerminal();
    
    
    
    
      Serial.println ();
      Serial.println ();
      Serial.println ("Training Set Solved! ");
      Serial.println ("--------");
      Serial.println ();
      Serial.println ();
      ReportEvery1000 = 1;
    
    
    }
    
    
    
    
    void toTerminal()
    {
    
    
    
    
      for ( p = 0 ; p < PatternCount ; p++ )
      {
        Serial.println();
        Serial.print ("  Training Pattern: ");
        Serial.println (p);
        Serial.print ("  Input ");
        for ( i = 0 ; i < InputNodes ; i++ )
        {
          Serial.print (Input[p][i], DEC);
          Serial.print (" ");
        }
        Serial.print ("  Target ");
        for ( i = 0 ; i < OutputNodes ; i++ )
        {
          Serial.print (Target[p][i], DEC);
          Serial.print (" ");
        }
        /******************************************************************
          Compute hidden layer activations
        ******************************************************************/
    
    
    
    
        for ( i = 0 ; i < HiddenNodes ; i++ )
        {
          Accum = HiddenWeights[InputNodes][i] ;
          for ( j = 0 ; j < InputNodes ; j++ )
          {
            Accum += Input[p][j] * HiddenWeights[j][i] ;
          }
          Hidden[i] = 1.0 / (1.0 + exp(-Accum)) ;
        }
    
    
    
    
        /******************************************************************
          Compute output layer activations and calculate errors
        ******************************************************************/
    
    
    
    
        for ( i = 0 ; i < OutputNodes ; i++ )
        {
          Accum = OutputWeights[HiddenNodes][i] ;
          for ( j = 0 ; j < HiddenNodes ; j++ )
          {
            Accum += Hidden[j] * OutputWeights[j][i] ;
          }
          Output[i] = 1.0 / (1.0 + exp(-Accum)) ;
        }
        Serial.print ("  Output ");
        for ( i = 0 ; i < OutputNodes ; i++ )
        {
          Serial.print (Output[i], 5);
          Serial.print (" ");
        }
      }
    
    
    
    
    
    
    
    
    }

    MfG
    Geändert von Moppi (17.12.2019 um 19:08 Uhr)

Ähnliche Themen

  1. [ERLEDIGT] Eine Bitte bezüglich des Code-Tag Buttons
    Von TobiKa im Forum Anregungen/Kritik/Fragen zum Forum und zum Wiki RN-Wissen
    Antworten: 4
    Letzter Beitrag: 23.03.2011, 14:44
  2. Anfrage
    Von pota20 im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 0
    Letzter Beitrag: 15.11.2009, 14:08
  3. Anfrage Unterstützung
    Von BenniX im Forum Bauanleitungen, Schaltungen & Software nach RoboterNetz-Standard
    Antworten: 3
    Letzter Beitrag: 08.07.2008, 07:25
  4. Nur eine I2C Anfrage?
    Von franzlst im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 2
    Letzter Beitrag: 21.02.2007, 00:06
  5. Anfrage SPI - I2S
    Von olafk im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 10.09.2005, 13:19

Berechtigungen

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

Solar Speicher und Akkus Tests