public NeuralNet Clone() { NeuralNet result = new NeuralNet(); result.layers = new List <List <NNConnection> >(); foreach (List <NNConnection> layer in layers) { List <NNConnection> copy = new List <NNConnection>(); foreach (NNConnection con in layer) { copy.Add(new NNConnection(con.n1, con.n2, con.w)); } result.layers.Add(copy); } return(result); }
public Player() { baseCar = new List <LineSegment>(); baseCar.Add(new LineSegment(new Point(-10, 5), new Point(10, 5))); baseCar.Add(new LineSegment(new Point(10, 5), new Point(10, -5))); baseCar.Add(new LineSegment(new Point(10, -5), new Point(-10, -5))); baseCar.Add(new LineSegment(new Point(-10, -5), new Point(-10, 5))); baseRays = new List <LineSegment>(); baseRays.Add(new LineSegment(new Point(4, 3), new Point(20, 23))); baseRays.Add(new LineSegment(new Point(4, 3), new Point(20, 13))); baseRays.Add(new LineSegment(new Point(4, 3), new Point(20, 8))); baseRays.Add(new LineSegment(new Point(4, 3), new Point(20, 3))); baseRays.Add(new LineSegment(new Point(4, 3), new Point(20, -2))); baseRays.Add(new LineSegment(new Point(4, 3), new Point(20, -7))); baseRays.Add(new LineSegment(new Point(4, 3), new Point(20, -17))); baseRayDis = new List <float>(); baseRayDis.AddRange(new float[7]); net = new NeuralNet(); running = new Stopwatch(); }
public void Load(string filename) { borders = new List <LineSegment>(); string[] lines = File.ReadAllLines(filename); start = new Point(); foreach (string line in lines) { string[] parts = line.Split(';'); switch (parts[0]) { case "bbminx": BBoxMin.X = Convert.ToInt32(parts[1]); break; case "bbminy": BBoxMin.Y = Convert.ToInt32(parts[1]); break; case "bbmaxx": BBoxMax.X = Convert.ToInt32(parts[1]); break; case "bbmaxy": BBoxMax.Y = Convert.ToInt32(parts[1]); break; case "bbsize": BBoxSize = Convert.ToInt32(parts[1]); break; case "posx": start.X = Convert.ToInt32(parts[1]); break; case "posy": start.Y = Convert.ToInt32(parts[1]); break; case "seg_b": LineSegment seg = new LineSegment(); seg.start = new Point(Convert.ToInt32(parts[1]), Convert.ToInt32(parts[2])); seg.end = new Point(Convert.ToInt32(parts[3]), Convert.ToInt32(parts[4])); borders.Add(seg); break; } } bestNet = players[0].net.Clone(); foreach (Player p in players) { p.pos = start; } }
public void Update() { foreach (Player p in players) { if (!p.running.IsRunning) { p.running.Start(); } p.rot += p.steer * 20f; if (!p.crashed) { p.pos.X += Helper.Cos(p.rot) * p.speed; p.pos.Y -= Helper.Sin(p.rot) * p.speed; long time = p.running.ElapsedMilliseconds; if (time > bestTime + 10000)// 10 sec better? { test++; generation++; bestTime = time; if (!dontEvolve) { bestNet = p.net.Clone(); } p.pos = start; p.rot = 0; p.running.Restart(); p.baseRayDis = new List <float>(new float[7]); } } else { test++; p.running.Stop(); long time = p.running.ElapsedMilliseconds; if (time > bestTime)//better? { generation++; bestTime = time; if (!dontEvolve) { bestNet = p.net.Clone(); } else { p.net = bestNet; } } else { p.net = bestNet.Clone(); if (!dontEvolve) { p.net.Randomize(); } } p.pos = start; p.rot = 0; p.running.Restart(); p.baseRayDis = new List <float>(new float[7]); } } }