private float fitness(CPPN cppn, int evaluationIterations) { Vector2 vel = new Vector2(); Vector2 prevVel = new Vector2(); Vector2 pos = new Vector2(); float traveledDistance = 0; for (int i = 0; i < evaluationIterations; i++) { prevVel = new Vector2(vel.x, vel.y); float[] input = { vel[0], vel[1], traveledDistance }; float[] result = cppn.setInputGetoutput(input); Vector2 res = new Vector2(result[0], result[1]); if (res.magnitude > maxSpeed) { res *= maxSpeed / res.magnitude; } vel[0] += Mathf.Clamp(res[0], -maxSpeed * Time.deltaTime, maxSpeed * Time.deltaTime); vel[1] += Mathf.Clamp(res[1], -maxSpeed * Time.deltaTime, maxSpeed * Time.deltaTime); traveledDistance += vel.magnitude; pos += vel; } return(traveledDistance / (pos.magnitude * 0.5f)); }
private void Start() { init(); CPPN winner = createRandomAndGetWinner(100, 1000); spawnWinner(winner); StartCoroutine(autoSpawner(winner)); }
public static void RunEvolution2() { var bmp = new System.Drawing.Bitmap(FILE_IN); ImageSys img = new ImageSys(bmp); Texture txt = new Interpolent(img, Intpol.Nearest); //var fitness = BuildFitness(txt); Console.WriteLine("Collecting Sample Points..."); ControlPoints.BuildData(); Fitness <CPPN> fitness = x => ControlPoints.GradeImage(x); EvolSpecies <CPPN> evolver = new EvolSpecies <CPPN>(500, 1.0, fitness); //100, 0.1 CPPN best = new CPPN(); CPPN proto = new CPPN(); Renderor ren = new Renderor(); ImageSys output = new ImageSys(256, 256); //img.BMP.Save(FILE_OUT + "test.png"); Console.WriteLine("Aproximating Image: " + FILE_IN); evolver.Initialise(best); for (int i = 0; i < MAX_GEN; i++) { Console.WriteLine(); string index = i.ToString("0000"); Console.WriteLine("Rendering Best Fit..."); ren.Render(best, output); output.BMP.Save(FILE_OUT + "A" + index + ".png"); Console.WriteLine("Rendering Random Species..."); ren.Render(proto, output); output.BMP.Save(FILE_OUT + "B" + index + ".png"); int nodes = best.NumNurons; int axons = best.NumAxons; double fit = evolver.TopFitness; Console.WriteLine(); Console.WriteLine("Generation " + i + ": " + nodes + " " + axons + " " + fit); Console.WriteLine("Num Species: " + evolver.NumSpecies); Console.WriteLine("Threshold: " + evolver.Threshold.ToString("0.00")); ////we cannot have more species than there are indvidual organisms //if (evolver.NumSpecies > 100) throw new Exception(); evolver.Evolve(); evolver.GetTopSpec(best); evolver.GetRandProto(proto); } }
IEnumerator autoSpawner(CPPN cppn) { CPPN winner = cppn; while (true) { yield return(new WaitForSeconds(2)); winner = createFromWinnerAndGetWinner(winner, 100, 1000); spawnWinner(winner); } }
public static void RandomMutaitons() { var bmp = new System.Drawing.Bitmap(FILE_IN); ImageSys img = new ImageSys(bmp); Texture txt = new Interpolent(img, Intpol.Nearest); var fitness = BuildFitness(txt); CPPN network = new CPPN(); VRandom rng = new RandMT(); network.Randomize(rng); Renderor ren = new Renderor(); ImageSys output = new ImageSys(256, 256); //img.BMP.Save(FILE_OUT + "test.png"); Console.WriteLine("Building Network..."); for (int i = 0; i < 200; i++) { network.Mutate(rng, 1.0); } Console.WriteLine("Aproximating Image: " + FILE_IN); //NOTE: Make it so we don't accept mutations that //result in NaN fitness! for (int i = 0; i < MAX_GEN; i++) { //network.Mutate(rng, 1.0); //0.1 network.Randomize(rng); ren.Render(network, output); string file = i.ToString("0000") + ".png"; output.BMP.Save(FILE_OUT + file); int nodes = network.NumNurons; int axons = network.NumAxons; double fit = fitness(network); //Console.WriteLine(); Console.WriteLine("Generation " + i + ": " + nodes + " " + axons + " " + fit); } }
private CPPN createRandomAndGetWinner(int amount, int evaluationIterations) { CPPN winner = null; float winnerScore = 0; for (int i = 0; i < amount; i++) { CPPN cppn = new CPPN(3, 2, neuronIA, connectionIA); float score = fitness(cppn, evaluationIterations); if (score > winnerScore) { winner = cppn; winnerScore = score; } } Debug.Log("Won with " + winnerScore); return(winner); }
public float Fitness(CPPN cppn, int evaluationIterations) { //float output = 0; Vector2 vel = new Vector2(); Vector2 pos = new Vector2(); float traveledDistance = 0; for (int i = 0; i < evaluationIterations; i++) { float[] input = { vel[0], vel[1], traveledDistance }; float[] result = cppn.setInputGetoutput(input); vel[0] = Mathf.Clamp(result[0], -maxSpeed * Time.deltaTime, maxSpeed * Time.deltaTime); vel[1] = Mathf.Clamp(result[1], -maxSpeed * Time.deltaTime, maxSpeed * Time.deltaTime); traveledDistance += vel.magnitude; pos += vel; } return(pos.magnitude + traveledDistance); }
private void Start() { int seed = Random.Range(0, 10000); Random.InitState(seed); Debug.Log("Seed: " + seed); CPPN cppn1 = new CPPN(3, 2, neuronIA, connectionIA); cppn1.printGenome(); CPPN cppn2 = new CPPN(3, 2, neuronIA, connectionIA); cppn2.printGenome(); CPPN.Genome genome = CPPNLib.Crossover(cppn1.genome, cppn2.genome); genome.mutate(neuronIA, connectionIA); cppn = new CPPN(genome, neuronIA, connectionIA); cppn.printGenome(); Debug.Log("fitness: " + Fitness(cppn, 100)); rb = GetComponent <Rigidbody>(); }
private CPPN createFromWinnerAndGetWinner(CPPN cppn, int amount, int evaluationIterations) { CPPN winner = cppn; float winnerScore = fitness(cppn, evaluationIterations); for (int i = 0; i < amount; i++) { CPPN.Genome genome = cppn.genome.copy(); genome.mutate(neuronIA, connectionIA); CPPN newCppn = new CPPN(genome, neuronIA, connectionIA); float score = fitness(newCppn, evaluationIterations); if (score > winnerScore) { winner = newCppn; winnerScore = score; } } Debug.Log("Won with " + winnerScore); return(winner); }
public static void RunEvolution() { var bmp = new System.Drawing.Bitmap(FILE_IN); ImageSys img = new ImageSys(bmp); Texture txt = new Interpolent(img, Intpol.Nearest); var fitness = BuildFitness(txt); EvolMonogen <CPPN> evolver = new EvolMonogen <CPPN>(50, 0.1, fitness); CPPN best = new CPPN(); evolver.Initialise(best); Renderor ren = new Renderor(); ImageSys output = new ImageSys(256, 256); //img.BMP.Save(FILE_OUT + "test.png"); Console.WriteLine("Aproximating Image: " + FILE_IN); for (int i = 0; i < MAX_GEN; i++) { evolver.Evolve(); evolver.GetTopSpec(best); ren.Render(best, output); string index = i.ToString("0000"); output.BMP.Save(FILE_OUT + index + ".png"); int nodes = best.NumNurons; int axons = best.NumAxons; double fit = evolver.TopFitness; Console.WriteLine(); Console.WriteLine("Generation " + i + ": " + nodes + " " + axons + " " + fit); } }
public void setup(CPPN icppn, float imaxSpeed) { rb = GetComponent <Rigidbody>(); cppn = icppn; maxSpeed = imaxSpeed; }
private void spawnWinner(CPPN cppn) { ParticleController pc = Instantiate(particlePrefab).GetComponent <ParticleController>(); pc.setup(cppn, maxSpeed); }