void AddToPool(GeneticAgent agent) { pool.Add(agent); pool.Sort(); pool.Sort(); if (pool.Count > maxPoolSize) { GeneticAgent a = pool[pool.Count - 1]; Destroy(a.gameObject); pool.RemoveAt(pool.Count - 1); } }
GeneticAgent CreateAgentFromCrossOver(GeneticAgent parentOne, GeneticAgent parentTwo) { NeuralNet neuralNetwork = parentOne.neuralNetwork; if (parentOne != parentTwo) { neuralNetwork = CreateNeuralNetworkFromCrossOver(parentOne.neuralNetwork, parentTwo.neuralNetwork); } var agent = AddAgentToSimulation(); agent.neuralNetwork = neuralNetwork; return(agent); }
/* * bool :PoolSort(std::shared_ptr<C_GeneticAgent> a, std::shared_ptr<C_GeneticAgent> b) * { * return a->GetTimeAlive() > b->GetTimeAlive(); * } */ void Update() { for (int i = agents.Count - 1; i >= 0; i--) { GeneticAgent o = agents[i]; var geneticAgent = o.GetComponent <GeneticAgent>(); if (geneticAgent.energy <= 0) { AddToPool(o); CalculateTotalFitness(); if (pool.Count > 1) { int parentOne = FitnessProportionateSelection(); int parentTwo = FitnessProportionateSelection(); GeneticAgent agent = CreateAgentFromCrossOver(pool[parentOne], pool[parentTwo]); float mutation = Random.value; if (mutation < mutationChance) { agent.neuralNetwork.Mutate(); } agents.Add(agent); } agents.RemoveAt(i); o.gameObject.SetActive(false); } } }
private void Awake() { agent = GetComponent <GeneticAgent>(); }
// Use this for initialization void Start() { agent = GetComponent <GeneticAgent>(); }