Exemple #1
0
 // Create a new generation
 public void Generate()
 {
     NeuralNetwork[] temp = new NeuralNetwork[alessiaAIs.Count];
     // Refill the population with children from the mating pool
     for (int i = 0; i < alessiaAIs.Count - 1; i++)
     {
         if (i == bestAlessiaAI)
         {
             temp[i] = alessiaAIs[i].GetComponent <Alessia_AI_DNA>().neuralNetwork;
         }
         else
         {
             Alessia_AI_DNA partnerA = PickOne(alessiaAIs);
             Alessia_AI_DNA partnerB = PickOne(alessiaAIs);
             NeuralNetwork  child    = partnerA.CrossOver(partnerB);
             Mutate(ref child, mutationRate);
             temp[i] = child;
         }
     }
     for (int i = 0; i < alessiaAIs.Count - 1; i++)
     {
         alessiaAIs[i].GetComponent <Alessia_AI_DNA>().neuralNetwork = temp[i];
     }
     alessiaAIs[alessiaAIs.Count - 1].GetComponent <Alessia_AI_DNA>().neuralNetwork = new NeuralNetwork(this.inputNodes, this.hiddenNodes, this.outputNodes);
     //if (matingPool.Count != 0)
     {
         generations++;
     }
     RestartAlessiaAIs(spawnPosition);
 }
    // Start is called before the first frame update
    void Start()
    {
        rigidbody         = GetComponent <Rigidbody>();
        alessia_AI_DNA    = GetComponent <Alessia_AI_DNA>();
        alessiaController = GetComponent <AlessiaController>();

        //TEST
        //carDNA.InitCar(5, 5, 2);
    }
    // Crossover
    public NeuralNetwork CrossOver(Alessia_AI_DNA partner)
    {
        // A new child
        NeuralNetwork child = new NeuralNetwork(neuralNetwork.inputNodes, neuralNetwork.hiddenNodes, neuralNetwork.outputNodes);

        //Do crossover
        DoCrossOver(ref child.ihWeights, neuralNetwork.ihWeights, partner.neuralNetwork.ihWeights);
        DoCrossOver(ref child.hoWeights, neuralNetwork.hoWeights, partner.neuralNetwork.hoWeights);
        DoCrossOver(ref child.biasH, neuralNetwork.biasH, partner.neuralNetwork.biasH);
        DoCrossOver(ref child.biasO, neuralNetwork.biasO, partner.neuralNetwork.biasO);

        return(child);
    }