Example #1
0
        IMonster GenerateMonster()
        {
            int            typeID         = Common.Random.Next(0, 7);
            BrainStructure brainStructure = GetBrainStructure(typeID);

            Genome genome = new Genome(brainStructure);

            genome.SetRandomValues();

            return(AddNewMonster(genome));
        }
Example #2
0
        public void Load(int inputCount, int outputCount, IBitInput logic)
        {
            levels.Clear();
            if (genome == null)
            {
                brainStructure = new BrainStructure()
                {
                    InputCount = inputCount,
                    LevelSizes = new int[] { outputCount }
                };

                genome = new Genome(brainStructure);
                genome.Load(logic);
            }

            // add memory input and output
            inputCount += brainStructure.MemoryBitCount;

            int genomeOffset = 0;

            for (int levelIndex = 0; levelIndex < brainStructure.LevelSizes.Length; levelIndex++)
            {
                DigitalLevel level = new DigitalLevel();

                outputCount = brainStructure.LevelSizes[levelIndex];
                int logicLength = BrainStructure.GetLevelLogicLength(inputCount, outputCount);

                logic         = genome.Copy(genomeOffset, logicLength);
                genomeOffset += logicLength;

                level.Load(inputCount, outputCount, logic);
                levels.Add(level);
                inputCount = outputCount;
            }

            // Load initial memory status
            if (brainStructure.MemoryBitCount > 0)
            {
                Memory = new BitStorage();
                Memory.Load(genome.Copy(genomeOffset, brainStructure.MemoryBitCount));
            }

            InputCount  = brainStructure.InputCount;
            OutputCount = brainStructure.OutputCount;

            if (autoCompile)
            {
                new Thread(() =>
                {
                    Compile();
                }).Start();
            }
        }
Example #3
0
        static BrainStructure GetBrainStructure(int typeID)
        {
            BrainStructure bs = new BrainStructure()
            {
                InputCount = 17,                 // sensors bits
                TypeID     = typeID
            };

            switch (typeID)
            {
            case 0:
                bs.MemoryBitCount = 1;
                bs.LevelSizes     = new int[] { 3 + bs.MemoryBitCount };
                break;

            case 1:
                bs.MemoryBitCount = 2;
                bs.LevelSizes     = new int[] { 3 + bs.MemoryBitCount };
                break;

            case 2:
                bs.MemoryBitCount = 4;
                bs.LevelSizes     = new int[] { 3 + bs.MemoryBitCount };
                break;

            case 3:
                bs.MemoryBitCount = 8;
                bs.LevelSizes     = new int[] { 3 + bs.MemoryBitCount };
                break;

            case 4:
                bs.MemoryBitCount = 16;
                bs.LevelSizes     = new int[] { 3 + bs.MemoryBitCount };
                break;

            case 5:
                bs.MemoryBitCount = 24;
                bs.LevelSizes     = new int[] { 3 + bs.MemoryBitCount };
                break;

            case 6:
                bs.MemoryBitCount = 16;
                bs.LevelSizes     = new int[] { 17 + bs.MemoryBitCount, 3 + bs.MemoryBitCount };
                break;
            }
            return(bs);
        }
Example #4
0
        public void AddBrain()
        {
            BrainStructure bs = new BrainStructure()
            {
                InputCount     = 16,
                MemoryBitCount = 0,
                LevelSizes     = new int[] { 32, 16, 1 }
            };

            Genome genome = new Genome(bs);

            genome.SetRandomValues();

            Brain brain = new Brain();

            brain.Load(genome);

            brains.Add(brain);
        }
Example #5
0
        void Start()
        {
            int            memorySize     = 2;
            BrainStructure brainStructure = new BrainStructure()
            {
                InputCount     = 16,
                LevelSizes     = new int[] { 3 + memorySize },
                MemoryBitCount = memorySize
            };

            Genome genome = new Genome(brainStructure);

            genome.SetRandomValues();
            Console.WriteLine("Genome: " + genome.GetView());

            DigitalBrain brain = new DigitalBrain();

            brain.Load(genome);

            BitStorage input  = new BitStorage(brainStructure.InputCount);
            BitStorage output = new BitStorage(brainStructure.OutputCount);

            for (int i = 0; i < 5; i++)
            {
                input.SetRandomValues();
                Console.WriteLine("\r\nInput: " + input.GetView());
                for (int j = 0; j < 1; j++)
                {
                    //int bitToChange = Common.Random.Next(genome.Length);
                    //genome[bitToChange] ^= true;
                    //Console.WriteLine("Genome: " + genome.GetView());

                    //brain.Load(genome);

                    for (int k = 0; k < 3; k++)
                    {
                        brain.Process(input, output);
                        Console.WriteLine("Output: " + output.GetView() + " Memory: " + brain.Memory.GetView());
                    }
                }
            }
        }
Example #6
0
        void TestCompilation()
        {
            var bs = new BrainStructure()
            {
                InputCount     = 100,
                MemoryBitCount = 16,
                LevelSizes     = new int[] { 50, 24 }
            };
            Genome genome = new Genome(bs);

            genome.SetRandomValues();

            var brain = new DigitalBrain();

            brain.Load(genome);

            var output = new BitStorage(bs.OutputCount);
            var input  = new BitStorage(bs.InputCount);

            input.SetRandomValues();
            Console.WriteLine(input.GetView());

            int count = 10000;
            var start = DateTime.Now;

            Parallel.For(0, count, i =>
            {
                brain.Process(input, output);
            });

            Console.WriteLine(output.GetView() + " " + count / (DateTime.Now - start).TotalSeconds);

            brain.Compile();
            start = DateTime.Now;
            Parallel.For(0, count, i =>
            {
                brain.Process(input, output);
            });

            Console.WriteLine(output.GetView() + " " + count / (DateTime.Now - start).TotalSeconds);
        }
Example #7
0
        IMonster CreateChildMonster(IMonster parentMonster)
        {
            BrainStructure brainStructure = parentMonster.Brain.Genome.BrainStructure;
            Genome         genome         = new Genome(brainStructure);

            genome.Load(parentMonster.Brain.Genome);

            // Mutation
            int bitCount = Common.Random.Next(1, Sex.DEFAULT_MUTATION);

            for (int i = 0; i < bitCount; i++)
            {
                int bitToChange = Common.Random.Next(genome.Length);
                genome[bitToChange] ^= true;
            }

            parentMonster.Energy -= MONSTER_INIT_ENERGY;
            UsedEnergy           -= MONSTER_INIT_ENERGY;

            IMonster monster = AddNewMonster(genome);

            (monster as SimpleMonster.Monster).Parents = (parentMonster as SimpleMonster.Monster).Parents + "M";
            return(monster);
        }
Example #8
0
 public void Load(Genome genome)
 {
     this.brainStructure = genome.BrainStructure;
     this.genome         = genome;
     Load(brainStructure.InputCount, brainStructure.OutputCount, genome);
 }
Example #9
0
        void Performance()
        {
            var brains = new List <IBrain>();
            var bs     = new BrainStructure()
            {
                InputCount     = 100,
                MemoryBitCount = 16,
                LevelSizes     = new int[] { 50, 24 }
            };

            for (int i = 0; i < 100; i++)
            {
                Genome genome = new Genome(bs);
                genome.SetRandomValues();

                var brain = new DigitalBrain();
                brain.Load(genome);
                brains.Add(brain);
            }

            Console.WriteLine("Compiling");
            int nr     = 0;
            var cStart = DateTime.Now;

            Parallel.ForEach(brains, brain =>
            {
                (brain as DigitalBrain).Compile();
                lock (brains)
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("Compiling " + ++nr);
                }
            });

            Console.WriteLine("Compilations per second " + nr / (DateTime.Now - cStart).TotalSeconds);
            return;

            var      output = new BitStorage(bs.OutputCount);
            int      op     = 0;
            DateTime start  = DateTime.Now;

            for (int i = 0; i <= 10000; i++)
            {
                var input = new BitStorage(bs.InputCount);
                input.SetRandomValues();
                Parallel.ForEach(brains, brain =>
                {
                    brain.Process(input, output);
                });

                op += brains.Count;

                if (i % 10 == 0)
                {
                    double seconds     = (DateTime.Now - start).TotalSeconds;
                    double performance = op;
                    performance /= seconds;

                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine(seconds.ToString("f2") + " => " + i + " ; " + performance.ToString("f2"));
                }
            }
            Console.WriteLine("Press any key");
            Console.ReadKey(true);
        }