# Neuronales Netzwerk - Genetischer Algorithmus



## Feeder (28. Jan 2018)

Hey,

ich versuche mich an Neuronalen Netzwerken, auch wenn das mein Wissen über Informatik weit übersteigt.

Ich möchte versuchen, einem Netz mit Hilfe von 4 Inputs:

x Koordinate des Spielers
y Koordinate des Spielers
x Koordinate des Essens
y Koordinate des Essen

beizubringen immer dem Essen hinterherzujagen.
Die besten kommen weiter und dürfen sich fortpflanzen.

Dazu habe ich eine Input (4 Neurons), eine Hidden(4) und eine Output(2)schicht erstellt.
Der Output muss 1 oder -1 sein, ansonsten wird der Output nicht vermerkt.
Der Output ist dann die Gesschwindigkeit in x und y Koordinate.

Die Axome(Connections) besitzen einen weight und einen bias (Ich vermute das sollte reichen)
mögliche, frei generiebare Aktiverungsfunktionen sind:

f(x) = x

und eine Booleanfunktion:

die beinegativen Werte -1 und bei positiven Werten +1 ausgibt.

Ein genetischer Algorithmus soll nun bei der Evolution helfen, als Fitnessfunktion habe ich die überlebte Zeit^2:
Fittnes(Netz) = timealive * timealive
, ich habe auch schon versucht das Gegessene zusätzlich zu bewerten, bringt aber nichts ;(

Ich glaube es liegt an den richtigen Mutations und Crossingoverfunktionen.

Dafür habe ich folgende Mutationsfunktion:


```
public void mutate(float mutationrate) {
        Random r = new Random();
        for(WorkingNeuron w : outputNeurons) {
            if(mutationrate < r.nextFloat()) {
                IActivationFunction func = greateRandomActivationFunction();
                w.functionnumber = func.getB();
            }
            for(Connection c : w.connections) {
                if(mutationrate < r.nextFloat()) {
                    int a = r.nextInt(2);
                    if(a==1) {
                        c.setBias(c.getBias() + 0.01f*c.getBias());
                    } else {
                        c.setBias(c.getBias() - 0.01f*c.getBias());
                    }
                    a = r.nextInt(2);
                    if(a==1) {
                        c.setWeight((c.getWeight() + 0.01f*c.getWeight()));
                    } else {
                        c.setBias(c.getWeight() - 0.01f*c.getWeight());
                    }
                }
            }
        }
        for(WorkingNeuron w : hiddenNeurons) {
            if(mutationrate < r.nextFloat()) {
                IActivationFunction func = greateRandomActivationFunction();
                w.setFunction(func);
                w.functionnumber = func.getB();
            }
            for(Connection c : w.connections) {
                if(mutationrate < r.nextFloat()) {
                    int a = r.nextInt(2);
                    if(a==1) {
                        c.setBias(c.getBias() + 0.01f*c.getBias());
                    } else {
                        c.setBias(c.getBias() - 0.01f*c.getBias());
                    }
                    a = r.nextInt(2);
                    if(a==1) {
                        c.setWeight((c.getWeight() + 0.01f*c.getWeight()));
                    } else {
                        c.setWeight(c.getWeight() - 0.01f*c.getWeight());
                    }
                }
            }
        }
    }
```

und 2 Crossingoverfunktionen ausprobiert.
Die Crossingoverfunktionen scheinen nichts zu funktionieren(Wie stell ich das mit Neuronen am besten an?)

Reichen die Aktiverungsfunktionen oder muss ich andere implementieren?
Wie kann ich Mutationsfunktionen optimieren?

Im Anhang noch der aktuelle Fehlversuch ;D


----------

