Нейронные сети действуют одинаково - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь создать нейронную сеть, обученную по алгоритму genti c, чтобы играть в летучую птицу.

Когда я инициализирую первое поколение случайных нейронных сетей, все работает как положено: происходит относительно случайное распределение действий. Однако после того, как все они * ie и я go инициализируют второе поколение, они все делают одно и то же: постоянно прыгают. Я понятия не имею, в чем проблема.

Я использую матричную библиотеку Eigen; Вот код моего класса нейронной сети:

#include "pch.h"
#include <Eigen/Dense>
#include <Eigen/Core>
using namespace Eigen;

class NeuralNetwork
{
private:

    static double sigmoid(double x)
    {
        return 1 / (1 + exp(-x));
    }

public:
    MatrixXd weightsIH;
    MatrixXd weightsHO;
    MatrixXd biasesIH;
    MatrixXd biasesHO;

public:

    NeuralNetwork(int in, int hid, int out)
    {
        weightsIH = MatrixXd::Random(hid,in);

        weightsHO = MatrixXd::Random(out,hid);

        biasesIH = MatrixXd::Random(hid,1);
        biasesHO = MatrixXd::Random(out,1);  
    }

    //Copy Constructors
    NeuralNetwork(NeuralNetwork& net)
    {
        weightsIH = net.weightsIH;
        weightsHO = net.weightsHO;

        biasesIH = net.biasesIH;
        biasesHO = net.biasesHO;
    }

    NeuralNetwork(std::shared_ptr<NeuralNetwork> net)
    {
        weightsIH = net->weightsIH;
        weightsHO = net->weightsHO;

        biasesIH = net->biasesIH;
        biasesHO = net->biasesHO;
    }


    int feedForward(MatrixXd input)
    {     
        MatrixXd hiddenOutputs = (weightsIH * input) + biasesIH;
        hiddenOutputs.unaryExpr([&](double x) {return sigmoid(x); });

        MatrixXd finalOutputs = (weightsHO * hiddenOutputs) + biasesHO;
        finalOutputs.unaryExpr([&](double x) {return sigmoid(x); });


        if (finalOutputs(0) > finalOutputs(1))
            return 0;
        return 1; 
    }

    void mutate(double rate)
    {
       srand((unsigned)time(NULL));
       weightsIH.unaryExpr([&](double x) {
           if ((double)rand() / (double)RAND_MAX < rate)
           {

               return ((double)rand() / (double)RAND_MAX);
           }
           else
           {
               return x;
           }
       });
       weightsHO.unaryExpr([&](double x) {
           if ((double)rand() / (double)RAND_MAX < rate)
           {

               return ((double)rand() / (double)RAND_MAX);
           }
           else
           {
               return x;
           }
        });
       biasesIH.unaryExpr([&](double x) {
           if ((double)rand() / (double)RAND_MAX < rate)
           {

               return ((double)rand() / (double)RAND_MAX);
           }
           else
           {
               return x;
           }
       });
       biasesHO.unaryExpr([&](double x) {
           if ((double)rand() / (double)RAND_MAX < rate)
           {

               return ((double)rand() / (double)RAND_MAX);
           }
           else
           {
               return x;
           }
       });
    }

};
...