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); } }
public VectorGenom(VectorGenom baseGenom) : base(baseGenom) { }