Beispiel #1
0
    IEnumerator Start()
    {
        // ルールの設定
        SetupRules();

        // ゲノム生成
        var genoms = new VectorGenom[MAX_GENOM_COUNT];

        for (int i = 0; i < genoms.Length; i++)
        {
            genoms[i] = new VectorGenom(GENOM_LENGTH);
        }

        // ゲノムを適用するキューブを用意
        cubes = new GameObject[MAX_GENOM_COUNT];
        for (int i = 0; i < cubes.Length; i++)
        {
            cubes[i] = GameObject.CreatePrimitive(PrimitiveType.Cube);
        }

        var pase = new WaitForSeconds(0.2f);

        while (true)
        {
            for (int i = 0; i < cubes.Length; i++)
            {
                var v = genoms[i].OutputDna();
                cubes[i].transform.position = new Vector3(v.x, 0, v.y);
            }

            // 終了
            if (age >= MAX_AGE)
            {
                break;
            }

            // ゲノムのスコアリング
            for (int i = 0; i < genoms.Length; i++)
            {
                var vg = genoms[i].OutputDna();
                genoms[i].Score = Mathf.Sqrt(Mathf.Pow(TARGET_POINT.position.x - vg.x, 2) + Mathf.Pow(TARGET_POINT.position.z - vg.y, 2));
            }

            // 優秀順に並べ替え
            Array.Sort(genoms, (a, b) => a.Score > b.Score ? 1 : a.Score == b.Score ? 0 : -1);

            // 選択
            var selected = selectRule.Select(genoms, MAX_GENOM_COUNT / 5);

            // 交差
            List <VectorGenom> nGenoms = new List <VectorGenom>();
            for (int i = 0; i < selected.Length; i++)
            {
                nGenoms.Add((VectorGenom)selected[i]);
            }
            while (nGenoms.Count < MAX_GENOM_COUNT)
            {
                var ch = new VectorGenom(GENOM_LENGTH);
                crossOverRule.CrossOverDna(
                    genoms[UnityEngine.Random.Range(0, genoms.Length)],
                    genoms[UnityEngine.Random.Range(0, genoms.Length)],
                    ch
                    );
                nGenoms.Add(ch);
            }
            genoms = nGenoms.ToArray();

            // 突然変異
            for (int i = 0; i < genoms.Length; i++)
            {
                if (UnityEngine.Random.value < m_rate)
                {
                    mutationRule.Mutate(genoms[i]);
                }
            }

            age++;

            yield return(pase);
        }
    }
Beispiel #2
0
 public VectorGenom(VectorGenom baseGenom) : base(baseGenom)
 {
 }