public Creature(Creature mother, CreatureManager manager) : this(manager) { id = currentId++; motherId = mother.id; generation = mother.generation + 1; if (generation > manager.MaxGeneration) { manager.MaxGeneration = generation; } this.pos = mother.pos; this.viewAngle = Simulation.RandomFloat() * Mathf.PI * 2; this.brain = mother.brain.CloneFullMesh(); AmountOfMemory = mother.AmountOfMemory; AmountOfHidden = mother.AmountOfHidden; inMemory = new InputNeuron[AmountOfMemory]; outMemory = new WorkingNeuron[AmountOfMemory]; SetupFeelers(true, mother.AmountOfFeelers); SetupVariablesFromBrain(); DoMutations(mother); if (manager.SelectedCreature == null || manager.SelectedCreature.Energy < 100) { manager.SelectedCreature = this; } }
private void CalculateCollisionGridPos() { lock (this) { collisionGridX = (int)((pos.X / EvoGame.Instance.tileMap.GetWorldWidth()) * CreatureManager.COLLISIONGRIDSIZE / 3 + CreatureManager.COLLISIONGRIDSIZE / 3); collisionGridY = (int)((pos.Y / EvoGame.Instance.tileMap.GetWorldHeight()) * CreatureManager.COLLISIONGRIDSIZE / 3 + CreatureManager.COLLISIONGRIDSIZE / 3); collisionGridX = Mathf.Clamp(collisionGridX, 0, CreatureManager.COLLISIONGRIDSIZE - 1); collisionGridY = Mathf.Clamp(collisionGridY, 0, CreatureManager.COLLISIONGRIDSIZE - 1); CreatureManager.AddToCollisionGrid(collisionGridX, collisionGridY, this); } }
public void HandleCollisions() { feelerOcclusion = 0; feelerCreature = null; CalculateFeelerPos(MAXIMUMFEELERDISTANCE); for (int i = collisionGridX - 1; i <= collisionGridX + 1; i++) { for (int k = collisionGridY - 1; k <= collisionGridY + 1; k++) { if (i >= 0 && k >= 0 && i < CreatureManager.COLLISIONGRIDSIZE && k < CreatureManager.COLLISIONGRIDSIZE) { List <Creature> collisionList = CreatureManager.GetCollisionGridList(i, k); HandleCollisionsWithList(collisionList); } } } }
public static CreatureManager Deserialize(string fileName, Simulation sim) { try { CreatureManager manager = null; IFormatter formatter = new BinaryFormatter(); using (Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None)) { try { manager = formatter.Deserialize(stream) as CreatureManager; } catch (Exception) { return(null); } }; if (manager == null) { return(null); } manager.Initialize(sim); long id = 0; foreach (Creature creature in manager.Creatures) { if (creature.Id > id) { id = creature.Id; } creature.SetupManager(manager); } Creature.currentId = id + 1; return(manager); } catch (IOException) { // Dir or file not found } return(null); }
public Creature(Creature mother, CreatureManager manager) : this(manager) { id = currentId++; //this.mother = mother; generation = mother.generation + 1; if (generation > _maximumGeneration) { _maximumGeneration = generation; } this.pos = mother.pos; this.viewAngle = Simulation.RandomFloat() * Mathf.PI * 2; this.brain = mother.brain.CloneFullMesh(); AmountOfMemory = mother.AmountOfMemory; inMemory = new InputNeuron[AmountOfMemory]; outMemory = new WorkingNeuron[AmountOfMemory]; SetupVariablesFromBrain(); CalculateFeelerPos(MAXIMUMFEELERDISTANCE); if (Simulation.RandomFloat() > 0.01f) { MutateConnections(); } else { MutateMemory(); } MutateColor(mother); GenerateColorInv(); if (manager.SelectedCreature == null || manager.SelectedCreature.Energy < 100) { manager.SelectedCreature = this; } }
public Creature(Creature mother, Creature father, CreatureManager manager) : this(manager) { id = currentId++; motherId = mother.id; generation = mother.generation + 1; if (generation > manager.MaxGeneration) { manager.MaxGeneration = generation; } pos = mother.pos; viewAngle = Simulation.RandomFloat() * Mathf.PI * 2; if (Simulation.SimulationConfiguration.MateBrainPercentage == 1.0f) { brain = father.brain.CloneFullMesh(); } else { brain = mother.brain.CloneFullMesh(); brain.MixNetwork(father.brain, Simulation.SimulationConfiguration.MateBrainPercentage); } AmountOfMemory = mother.AmountOfMemory; AmountOfHidden = mother.AmountOfHidden; inMemory = new InputNeuron[AmountOfMemory]; outMemory = new WorkingNeuron[AmountOfMemory]; SetupFeelers(true, mother.AmountOfFeelers); SetupVariablesFromBrain(); DoMutations(mother); if (manager.SelectedCreature == null || manager.SelectedCreature.Energy <= 100) { manager.SelectedCreature = this; } }
// For deserialization public Creature(CreatureManager manager) { Manager = manager; CalculateCollisionGridPos(); }
public Creature(Vector2 pos, float viewAngle, CreatureManager manager) : this(manager) { id = currentId++; this.pos = pos; this.viewAngle = viewAngle; inBias.SetName(NAME_IN_BIAS); inFoodValuePosition.SetName(NAME_IN_FOODVALUEPOSITION); inFoodValueFeeler.SetName(NAME_IN_FOODVALUEFEELER); inOcclusionFeeler.SetName(NAME_IN_OCCLUSIONFEELER); inEnergy.SetName(NAME_IN_ENERGY); inAge.SetName(NAME_IN_AGE); inGeneticDifference.SetName(NAME_IN_GENETICDIFFERENCE); inWasAttacked.SetName(NAME_IN_WASATTACKED); inWaterOnFeeler.SetName(NAME_IN_WATERONFEELER); inWaterOnCreature.SetName(NAME_IN_WATERONCREATURE); //inOscilation .SetName(NAME_IN_OSCILATION); inMemory = new InputNeuron[AmountOfMemory]; for (int i = 0; i < AmountOfMemory; i++) { inMemory[i] = new InputNeuron(); inMemory[i].SetName(NAME_IN_MEMORY + (i + 1)); } outBirth.SetName(NAME_OUT_BIRTH); outRotate.SetName(NAME_OUT_ROTATE); outForward.SetName(NAME_OUT_FORWARD); outFeelerAngle.SetName(NAME_OUT_FEELERANGLE); outAttack.SetName(NAME_OUT_ATTACK); outEat.SetName(NAME_OUT_EAT); //outOscilation .SetName(NAME_OUT_OSCILATION); outMemory = new WorkingNeuron[AmountOfMemory]; for (int i = 0; i < AmountOfMemory; i++) { outMemory[i] = new WorkingNeuron(); outMemory[i].SetName(NAME_OUT_MEMORY + (i + 1)); } brain = new NeuronalNetwork(); brain.AddInputNeuron(inBias); brain.AddInputNeuron(inFoodValuePosition); brain.AddInputNeuron(inFoodValueFeeler); brain.AddInputNeuron(inOcclusionFeeler); brain.AddInputNeuron(inEnergy); brain.AddInputNeuron(inAge); brain.AddInputNeuron(inGeneticDifference); brain.AddInputNeuron(inWasAttacked); brain.AddInputNeuron(inWaterOnFeeler); brain.AddInputNeuron(inWaterOnCreature); //brain.AddInputNeuron(inOscilation); for (int i = 0; i < AmountOfMemory; i++) { brain.AddInputNeuron(inMemory[i]); } brain.GenerateHiddenNeurons(10); brain.AddOutputNeuron(outBirth); brain.AddOutputNeuron(outRotate); brain.AddOutputNeuron(outForward); brain.AddOutputNeuron(outFeelerAngle); brain.AddOutputNeuron(outAttack); brain.AddOutputNeuron(outEat); //brain.AddOutputNeuron(outOscilation); for (int i = 0; i < AmountOfMemory; i++) { brain.AddOutputNeuron(outMemory[i]); } brain.GenerateFullMesh(); brain.RandomizeAllWeights(); CalculateFeelerPos(MAXIMUMFEELERDISTANCE); Color = new Color(Simulation.RandomFloat(), Simulation.RandomFloat(), Simulation.RandomFloat()); GenerateColorInv(); CalculateCollisionGridPos(); }
public void SetupManager(CreatureManager manager) { Manager = manager; CalculateCollisionGridPos(); SetupVariablesFromBrain(); }
public Creature(Vector2 pos, float viewAngle, CreatureManager manager) : this(manager) { id = currentId++; this.pos = pos; this.viewAngle = viewAngle; inBias.SetName(NAME_IN_BIAS); inFoodValuePosition.SetName(NAME_IN_FOODVALUEPOSITION); inEnergy.SetName(NAME_IN_ENERGY); inAge.SetName(NAME_IN_AGE); inWasAttacked.SetName(NAME_IN_WASATTACKED); inWaterOnCreature.SetName(NAME_IN_WATERONCREATURE); //inOscilation .SetName(NAME_IN_OSCILATION); inMemory = new InputNeuron[AmountOfMemory]; for (int i = 0; i < AmountOfMemory; i++) { inMemory[i] = new InputNeuron(); inMemory[i].SetName(NAME_IN_MEMORY + (i + 1)); } outBirth.SetName(NAME_OUT_BIRTH); outRotate.SetName(NAME_OUT_ROTATE); outForward.SetName(NAME_OUT_FORWARD); outStrafe.SetName(NAME_OUT_STRAFE); outEat.SetName(NAME_OUT_EAT); outMate_Age.SetName(NAME_OUT_MATE_AGE); outMate_Energy.SetName(NAME_OUT_MATE_ENERGY); outMate_Generation.SetName(NAME_OUT_MATE_GENERATION); outMate_GeneticDifference.SetName(NAME_OUT_MATE_GENETICDIFFERENCE); outMate_Age_Weight.SetName(NAME_OUT_MATE_AGE_WEIGHT); outMate_Energy_Weight.SetName(NAME_OUT_MATE_ENERGY_WEIGHT); outMate_Generation_Weight.SetName(NAME_OUT_MATE_GENERATION_WEIGHT); outMate_GeneticDifference_Weight.SetName(NAME_OUT_MATE_GENETICDIFFERENCE_WEIGHT); //outOscilation .SetName(NAME_OUT_OSCILATION); outMemory = new WorkingNeuron[AmountOfMemory]; for (int i = 0; i < AmountOfMemory; i++) { outMemory[i] = new WorkingNeuron(-1); outMemory[i].SetName(NAME_OUT_MEMORY + (i + 1)); } brain = new NeuronalNetwork(); brain.AddInputNeuron(inBias); brain.AddInputNeuron(inFoodValuePosition); brain.AddInputNeuron(inEnergy); brain.AddInputNeuron(inAge); brain.AddInputNeuron(inWasAttacked); brain.AddInputNeuron(inWaterOnCreature); //brain.AddInputNeuron(inOscilation); for (int i = 0; i < AmountOfMemory; i++) { brain.AddInputNeuron(inMemory[i]); } brain.GenerateHiddenNeurons(AmountOfHidden, manager.simulation.SimulationConfiguration.NumberOfStartNeuronLayers); brain.AddOutputNeuron(outBirth); brain.AddOutputNeuron(outRotate); brain.AddOutputNeuron(outForward); brain.AddOutputNeuron(outStrafe); brain.AddOutputNeuron(outEat); brain.AddOutputNeuron(outMate_Age); brain.AddOutputNeuron(outMate_Energy); brain.AddOutputNeuron(outMate_Generation); brain.AddOutputNeuron(outMate_GeneticDifference); brain.AddOutputNeuron(outMate_Age_Weight); brain.AddOutputNeuron(outMate_Energy_Weight); brain.AddOutputNeuron(outMate_Generation_Weight); brain.AddOutputNeuron(outMate_GeneticDifference_Weight); //brain.AddOutputNeuron(outOscilation); for (int i = 0; i < AmountOfMemory; i++) { brain.AddOutputNeuron(outMemory[i]); } SetupFeelers(false, 1); brain.GenerateFullMesh(); brain.RandomizeAllWeights(); Color = Color.FromFloat(Simulation.RandomFloat(), Simulation.RandomFloat(), Simulation.RandomFloat()); GenerateColorInv(); CalculateCollisionGridPos(); }