public void GenerateInitalPopulation() { population = new List <GeneticPlayer>(); aliveCount = populationCount; for (int i = 0; i < populationCount; i++) { Vector3 pos = GetPos(i); GeneticPlayer geneticPlayer = Instantiate(geneticPlayerPrefab, pos, Quaternion.Euler(spawnRotation)); Genom genom; if (geneticPlayerPrefab.mode == Mode.LoadAndTrain) { genom = Genom.LoadFromFile(geneticPlayerPrefab.GetSavePath()); if (i > 0) { genom = Genom.MutateAll(genom, 0.01f); } } else { genom = geneticPlayer.InitGenom(); genom.RandomizeAll(); //случайные гены } geneticPlayer.SetGenom(genom); population.Add(geneticPlayer); } }
//public Genom(Dictionary<string, Gen> gens_dict) //{ // this.gens_dict = new Dictionary<string, Gen>(gens_dict); //} public Genom(Genom parent) { for (int j = 0; j < parent.Size(); j++) { Gen pGen = parent.GetGen(j); AddGen(new Gen(pGen)); //copy } //this.gens_dict = new Dictionary<string, Gen>(copy.gens_dict); }
public override GeneticGame.Genom InitGenom() { GeneticGame.Genom genom = new GeneticGame.Genom(); genom.AddGen(new Gen("max_degree_x", 0, 180)); //genom.AddGen(new Gen("force_power", 1000, 1)); genom.AddGen(new Gen("force_power_left", 1000, 1)); genom.AddGen(new Gen("force_power_right", 1000, 1)); //genom.AddGen(new Gen("wheel_radius", 1, 10)); return(genom); }
//возвращает mutation-% мутации от parent; public static List <Genom> GetChilds(Genom parent, int childsCount, float mutation) { List <Genom> childs = new List <Genom>(); for (int i = 0; i < childsCount; i++) { Genom c = MutateAll(parent, mutation); childs.Add(c); } return(childs); }
// public static Genom MutateAll(Genom parent, float f) { Genom newGenes = new Genom(parent); foreach (var item in newGenes.gens_dict) { Gen g = item.Value; g.Mutate(f); } return(new Genom(newGenes)); }
public static void SaveToFile(Genom genom, string path) { string json = JsonUtility.ToJson(genom); string directoryName = Path.GetDirectoryName(path); if (!Directory.Exists(directoryName)) { Directory.CreateDirectory(directoryName); } File.WriteAllText(path, json); }
protected override void ApplyGenom(GeneticGame.Genom genom) { maxDegreeX = genom.GetGen("max_degree_x").value; forcePowerLeft = genom.GetGen("force_power_left").value; forcePowerRight = genom.GetGen("force_power_right").value; rig = GetComponent <Rigidbody>(); forcePoint = transform.Find("ForcePoint"); forcePointMat = forcePoint.gameObject.GetComponent <Renderer>().material; StartCoroutine(AddRandomForce(genom.GetGen("force_power_left").maxVal)); }
// Update is called once per frame void Update() { if (aliveCount <= 0 && generation < maxGenerations) { //сортровка по score population.Sort((x, y) => (y.score.CompareTo(x.score))); GeneticPlayer best = population[0]; Debug.Log("generation " + generation + " best \np1: " + best.score); if (bestScore < best.score) { bestScore = best.score; bestGenom = best.GetGenom(); Genom.SaveToFile(bestGenom, geneticPlayerPrefab.GetSavePath()); } Debug.Log("global best score: " + bestScore); /* * передавая отсортированный список генов всех особей можно всегда надеятся, * что гены лучшей особи передадутся самому большому кол-ву детей. * но если разнится между 1 и 2 коосальная, есть ли смысл оставлять гены второго в популяции? * (возможно, стоит переделать сам алгорим скрещевания) * ((но делать я этого, конечно же, не буду)) */ List <Genom> populationGenom = new List <Genom>(); foreach (GeneticPlayer p in population) { // коосальная разница = 50% if (p.score >= best.score * 0.5f) { populationGenom.Add(p.GetGenom()); } } /* * в список генов родителей 100% попадет хотя бы 1 ген - лучший. * если попадет только он - поколение сгенерируется на основе полных случайных мутаций лучшего */ GenerateNextPopulation(populationGenom); generation++; } }
//возвращает случайную популящию; public static List <Genom> GetChilds(Genom parent, int childsCount) { List <Genom> childs = new List <Genom>(); for (int i = 0; i < childsCount; i++) { Genom g = new Genom(parent); //copy g.RandomizeAll(); childs.Add(g); } return(childs); }
public static Genom LoadFromFile(string path) { string json = ""; if (File.Exists(path)) { json = File.ReadAllText(path); } else { Debug.LogError("path: " + path + "\nfile not exists."); } Genom loaded = JsonUtility.FromJson <Genom>(json); foreach (Gen gen in loaded.gens_list) { loaded.gens_dict.Add(gen.name, gen); } return(loaded); }
protected override void ApplyGenom(GeneticGame.Genom genom) { maxDegreeXLeft = genom.GetGen("max_degree_x_left").value; maxDegreeXRight = genom.GetGen("max_degree_x_right").value; forcePowerLeft = genom.GetGen("force_power_left").value; forcePowerRight = genom.GetGen("force_power_right").value; wheelRadius = genom.GetGen("wheel_radius").value; rig = GetComponent <Rigidbody>(); forcePoint = transform.Find("ForcePoint"); forcePointMat = forcePoint.gameObject.GetComponent <Renderer>().material; wheel = transform.Find("wheels/Wheel").gameObject; wheel.transform.localScale *= wheelRadius; wheel.transform.localPosition *= wheelRadius / 2; StartCoroutine(AddRandomForce(genom.GetGen("force_power_left").maxVal)); }
//генерирует популяцию того же размера, что и предедущая public void GenerateNextPopulation(List <Genom> parents) { aliveCount = populationCount; for (int i = 0; i < populationCount; i++) { Destroy(population[i].gameObject); } List <Genom> childsGenes = Genom.GetChilds(parents, populationCount, true); for (int i = 0; i < populationCount; i++) { Vector3 pos = GetPos(i); GeneticPlayer geneticPlayer = Instantiate(geneticPlayerPrefab, pos, Quaternion.Euler(spawnRotation)); geneticPlayer.SetGenom(childsGenes[i]); geneticPlayer.name += " #" + i; population[i] = geneticPlayer; } }
private void Start() { //sensors = InitSensors(); //Debug.Log("ApplyGenom"); if (mode == Mode.Train || mode == Mode.LoadAndTrain) { if (!genomInistalized) { Debug.LogWarning("Genom is not inistalized.\n Maybe you forgot add GeneticGame.cs on scene?"); Genom newgenom = InitGenom(); newgenom.RandomizeAll(); SetGenom(newgenom); } } else if (mode == Mode.LoadAndTest) { SetGenom(Genom.LoadFromFile(GetSavePath())); } //Debug.Log(genom); ApplyGenom(genom); }
//protected abstract void UpdateSensors(Sensors sensors); //врозващает очки, заработанные за шаг protected abstract float ProcessStep(Genom genom);
//public abstract Sensors InitSensors(); protected abstract void ApplyGenom(Genom genom);
public void SetGenom(Genom Genom) { this.genom = Genom; genomInistalized = true; }