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