private void instantiateAgents() { for (int i = 0; i < numClones; i++) { agents[i] = Instantiate(agentPrefab); MeshRenderer pendulumMesh = agents[i].GetComponent <MeshRenderer>(); if (pendulumMesh != null) { pendulumMesh.material.color = Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f);//colours[i];//Random.Range(0, 1) * 255, Random.Range(0, 1) * 255, Random.Range(0, 1) * 255, 1); } AgentTrainer trainer = agents[i].GetComponent <AgentTrainer>(); trainer.Initialize(newTrainers[i].getNeuralNetwork(), Random.Range(-15, 15)); //Debug.Log("Fitness: " + trainer.fitness); } }
void Start() { //Note: Different instances are set to not collide given Edit>ProjectSettings>Physics>LayerCollisionMatrix settings Debug.Log("Starting! Godspeed"); Time.timeScale = timeScale; //TODO: Make random neural networks or read in NNs from file NeuralNetwork[] initNetworks = new NeuralNetwork[numClones]; for (int i = 0; i < initNetworks.Length; i++) { initNetworks[i] = new NeuralNetwork(topology); initNetworks[i].SetRandomWeights(-10.0, 10.0); } for (int i = 0; i < numClones; i++) { newTrainers[i] = new AgentTrainer(initNetworks[i]); } instantiateAgents(); }
public AgentTrainer[] evolve(AgentTrainer[] trainers) { if (trainers.Length < 2) { throw new System.Exception("Not enough trainers passed to Evolver.evolve(). Cannot breed."); } trainers = trainers.OrderByDescending(t => t.fitness).ToArray <AgentTrainer>(); NeuralNetwork mother = trainers[0].getNeuralNetwork(); NeuralNetwork father = trainers[1].getNeuralNetwork(); NeuralNetwork[] childrenNetworks = new NeuralNetwork[trainers.Length]; if (!validateNetworks(mother, father)) { throw new System.Exception("Invalid parents"); } ////////////////////////////////////////////////////// for (int i = 0; i < childrenNetworks.Length; i++) { childrenNetworks[i] = new NeuralNetwork(mother.Topology); } foreach (NeuralNetwork childNetwork in childrenNetworks) { for (int layer = 0; layer < childNetwork.Layers.Length; layer++) { NeuralLayer Layer = childNetwork.Layers[layer]; for (int weightRow = 0; weightRow < Layer.Weights.GetLength(0); weightRow++) { for (int weightCol = 0; weightCol < Layer.Weights.GetLength(1); weightCol++) { if (!mutate()) { double parentWeight = Mathf.RoundToInt(Random.Range(0, 1)) >= biasTowardsMother ? mother.Layers[layer].Weights[weightRow, weightCol] : father.Layers[layer].Weights[weightRow, weightCol]; childNetwork.Layers[layer].Weights[weightRow, weightCol] = parentWeight; } else { childNetwork.Layers[layer].Weights[weightRow, weightCol] = Random.Range(-mutationRange, mutationRange); Debug.Log("MUTATED!"); } } } } } NeuralNetwork[] randomChildren = childrenNetworks.Take((int)(percentRandomChildren * childrenNetworks.Length)).ToArray(); foreach (NeuralNetwork randomChild in randomChildren) { randomChild.SetRandomWeights(-mutationRange, mutationRange); } ////////////////////////////////////////////////////// AgentTrainer[] newTrainers = new AgentTrainer[trainers.Length]; for (int trainer = 0; trainer < newTrainers.Length; trainer++) { newTrainers[trainer] = new AgentTrainer(childrenNetworks[trainer]); } return(newTrainers); }