private static int AddAnotherClone(List<Instruction[]> Clones, BleepyBloop b, List<double> PastFoods, int NumbClones) { Clones.Add(b.ReturnVaried(0.08, 0.08)); PastFoods.Add(b.Food); NumbClones++; return NumbClones; }
public static Field GenerateNewLevel(BleepyBloop[] Olds) { Field F = InitNewFieldWithOldBleeps(Olds); F.physicalLevel.AddNewFoodAndPoison(48); F.physicalLevel.UpdateThingChache(F); F.bleepSim.Bloops = F.Bloops; F.bleepSim.SetThreads(BleepSim.NumThread,NF); return F; }
private static void DrawBloopSizeIndicator(BleepyBloop B, double x, double y, double sr, double R1) { for (double i = 0; i < Math.PI; i += Math.PI / 3) { GL.Begin(PrimitiveType.LineLoop); for (double r = sr + (i * 2); r < sr + (i * 2 + Math.PI / 3); r += R1) { GL.Vertex2(x + (Math.Sqrt(B.Food) / 7d + 0.5) * Math.Sin(r), y + (Math.Sqrt(B.Food) / 7d + 0.5) * Math.Cos(r)); } GL.End(); } }
public static FieldSet NewField(BleepyBloop[] Olds) { List<Instruction[]> temp = new List<Instruction[]>(); List<Instruction[]> clones = new List<Instruction[]>(); List<double> PastFoods = new List<double>(); List<Instruction> GenePool = new List<Instruction>(); Olds = Olds.OrderByDescending(y => y.ObjectiveFunction()).ToArray(); Field F = new Field(Olds.Count()); double Mean = FillGenePool(Olds, clones, GenePool,PastFoods); AddPaddingToGenePool(GenePool); FillFromGenePool(temp, GenePool); F.Bloops = new BleepyBloop[temp.Count() + clones.Count()]; AddBloopsToField(temp, clones, F,Mean,PastFoods); F = Field.GenerateNewLevel(F.Bloops.ToArray()); return FieldSetFromField(F); }
private static void AddBloopsToField(List<Instruction[]> temp, List<Instruction[]> clones, Field F,double Mean,List<double> PastFoods) { for (int i = 0; i < temp.Count(); i++) { BleepyBloop B = F.Bloops[i]; B = new BleepyBloop(); B.Genes = temp[i]; B.Vary(0.08, 0.08); B.parentsFood = Mean; F.Bloops[i] = B; } for (int i = 0; i < clones.Count(); i++) { int b = i + temp.Count; F.Bloops[b] = new BleepyBloop(); F.Bloops[b].Genes = clones[i]; F.Bloops[b].parentsFood = PastFoods[i]; } }
private static void ExtractGenesToPassOn(List<Instruction[]> Clones, List<Instruction> GenePool, double Mean, BleepyBloop b,List<double> PastFoods,double Total) { if (Total >= 0) { double v = Math.Round(GetNumberOfGenesToPassFromBloop(b)); int NumberOfInstructionsToPassOn = (int)Math.Round(BleepyBloop.MemSize * (v / Mean)); if (v >= Mean) { Clones.Add(b.Genes); PastFoods.Add(b.Food); int NumbClones = 1; if (v >= (Mean * 2)) { NumbClones = AddAnotherClone(Clones, b, PastFoods, NumbClones); } NumberOfInstructionsToPassOn -= BleepyBloop.MemSize * NumbClones; Total -= NumbClones*BleepyBloop.MemSize; } FillGenePoolWithBloopsGenes(GenePool, b, NumberOfInstructionsToPassOn); Total -= NumberOfInstructionsToPassOn; } }
private static double GetNumberOfGenesToPassFromBloop(BleepyBloop b) { return Math.Pow(b.ObjectiveFunction(),1.5); }
private static void FillGenePoolWithBloopsGenes(List<Instruction> GenePool, BleepyBloop b, int NumberOfInstructionsToPassOn) { for (int j = 0; j < -NumberOfInstructionsToPassOn; j--) { GenePool.Add(b.Genes[j % BleepyBloop.MemSize]); } }
private static double FillGenePool(BleepyBloop[] Olds, List<Instruction[]> Clones, List<Instruction> GenePool,List<double> PastFoods) { double Mean = Olds.Sum(x => GetNumberOfGenesToPassFromBloop(x)) / 32; double Total = Mean / 32; foreach (BleepyBloop b in Olds.OrderByDescending(b=>b.ObjectiveFunction())) { ExtractGenesToPassOn(Clones, GenePool, Mean, b, PastFoods,Total); } return Mean; }
private static Field InitNewFieldWithOldBleeps(BleepyBloop[] Olds) { Field F = new Field(Olds.Count()); F.Bloops = new BleepyBloop[Olds.Count()]; F.physicalLevel.Foods = new List<Food>(); F.physicalLevel.Poisons = new List<Poison>(); for (int i = 0; i < Olds.Count(); i++) { F.Bloops[i] = new BleepyBloop(); F.Bloops[i] = new BleepyBloop(); F.Bloops[i].Genes = Olds[i].Genes; F.Bloops[i].Food += Olds[i].Food; } return F; }