コード例 #1
0
        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;
            }
        }
コード例 #2
0
ファイル: Creature.cs プロジェクト: pkupper/EvoNet
 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);
     }
 }
コード例 #3
0
ファイル: Creature.cs プロジェクト: pkupper/EvoNet
 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);
             }
         }
     }
 }
コード例 #4
0
ファイル: CreatureManager.cs プロジェクト: toffen/EvoNet
        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);
        }
コード例 #5
0
        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;
            }
        }
コード例 #6
0
        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;
            }
        }
コード例 #7
0
 // For deserialization
 public Creature(CreatureManager manager)
 {
     Manager = manager;
     CalculateCollisionGridPos();
 }
コード例 #8
0
        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();
        }
コード例 #9
0
 public void SetupManager(CreatureManager manager)
 {
     Manager = manager;
     CalculateCollisionGridPos();
     SetupVariablesFromBrain();
 }
コード例 #10
0
        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();
        }