//----------------------------------------------------- //【関数定義】選択(担当:秋元) //----------------------------------------------------- protected CreatureParam[] Select() { CreatureParam[] surviver = new CreatureParam[param.surviveCount]; calcscore(); // エリート保存戦略 for (int i = 0; i < param.surviveCount; i++) { int sc = bestScoreIds[i]; surviver[i] = param.creatureParams[sc]; } return(surviver); }
//----------------------------------------------------- //【関数定義】突然変異(担当:池田) //----------------------------------------------------- protected CreatureParam Mutation(CreatureParam np) { // 関節のパラメータを1~4回ランダムで変更する // (同じ関節が複数回変更されることもある) int mpc = Random.Range(1, 4); for (int j = 0; j < mpc; ++j) { // パラメータを突然変異させる関節をランダムに選ぶ int lr = Random.Range(0, 6); finParam lp = np.finParams[lr]; lp.RotRange = new Vector3[4]; if (lr < 3) { for (int k = 0; k < 4; k++) { lp.RotRange[k] = new Vector3( Random.Range(-bodyRotateLimit.x, bodyRotateLimit.x), Random.Range(-bodyRotateLimit.y, bodyRotateLimit.y), Random.Range(-bodyRotateLimit.z, bodyRotateLimit.z)); } } else { for (int k = 0; k < 4; k++) { lp.RotRange[k] = new Vector3( Random.Range(-finRotateLimit.x, finRotateLimit.x), Random.Range(-finRotateLimit.y, finRotateLimit.y), Random.Range(-finRotateLimit.z, finRotateLimit.z)); } } np.finParams[lr] = lp; } return(np); }
//----------------------------------------------------- //【関数定義】交叉(担当:小林) //----------------------------------------------------- protected CreatureParam[] Cross(CreatureParam[] surviver) { //----------------------------------------------------- // 【1】親をエリート世代から選択する場合 //----------------------------------------------------- /* * List<int> indices = new List<int>(); * for( int j=0; j<param.surviveCount; ++j ) { * indices.Add(j); * } * * // 今世代の優秀な個体のうち、2体をランダムに選ぶ = 親 * int i1 = indices[Random.Range(0,param.surviveCount)]; * indices.Remove(i1); * int i2 = indices[Random.Range(0,param.surviveCount-1)]; * * CreatureParam[] cp = new CreatureParam[]{ surviver[i1], surviver[i2] }; */ //----------------------------------------------------- // 【2】親をルーレット方式で選択する場合 //----------------------------------------------------- // 親を2体選択 int parent1 = Roulette(); int parent2 = Roulette(); CreatureParam[] cp = new CreatureParam[] { param.creatureParams[parent1], param.creatureParams[parent2] }; //----------------------------------------------------- // 【1】【2】共通 //----------------------------------------------------- CreatureParam[] np = new CreatureParam[2]; np[0].finParams = new finParam[6]; np[1].finParams = new finParam[6]; // 6つの関節に関してそれぞれ、かつ4つの動作についてそれぞれ上記で選んだ親のどちらかのパラメータをコピーする // 現在は一様交叉→進化が速い一方、比較的優秀な個体が破壊される危険も // 進化の前半にとどめておくべきかも for (int j = 0; j < 6; ++j) { np[0].finParams[j].RotRange = new Vector3[4]; np[1].finParams[j].RotRange = new Vector3[4]; for (int k = 0; k < 4; k++) { int mask = Random.Range(0, 2); np[0].finParams[j].RotRange[k] = cp[mask].finParams[j].RotRange[k]; if (mask == 0) { mask = 1; } else { mask = 0; } np[1].finParams[j].RotRange[k] = cp[mask].finParams[j].RotRange[k]; } } return(np); }