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

        //TEST
        //carDNA.InitCar(5, 5, 2);
    }
Exemple #3
0
    // Crossover
    public NeuralNetwork CrossOver(ZombieKnight_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);
    }