예제 #1
0
        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);
            }
        }
예제 #2
0
        //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);
    }
예제 #4
0
        //возвращает 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);
        }
예제 #5
0
        //
        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));
        }
예제 #6
0
        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));
    }
예제 #8
0
        // 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++;
            }
        }
예제 #9
0
        //возвращает случайную популящию;
        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);
        }
예제 #10
0
        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);
        }
예제 #11
0
    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));
    }
예제 #12
0
        //генерирует популяцию того же размера, что и предедущая
        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;
            }
        }
예제 #13
0
        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);
        }
예제 #14
0
        //protected abstract void UpdateSensors(Sensors sensors);

        //врозващает очки, заработанные за шаг
        protected abstract float ProcessStep(Genom genom);
예제 #15
0
        //public abstract Sensors InitSensors();

        protected abstract void ApplyGenom(Genom genom);
예제 #16
0
 public void SetGenom(Genom Genom)
 {
     this.genom       = Genom;
     genomInistalized = true;
 }