// 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); }
// 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); }
// 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); }