IMonster GenerateMonster() { int typeID = Common.Random.Next(0, 7); BrainStructure brainStructure = GetBrainStructure(typeID); Genome genome = new Genome(brainStructure); genome.SetRandomValues(); return(AddNewMonster(genome)); }
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(); } }
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); }
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); }
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()); } } } }
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); }
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); }
public void Load(Genome genome) { this.brainStructure = genome.BrainStructure; this.genome = genome; Load(brainStructure.InputCount, brainStructure.OutputCount, genome); }
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); }