Ejemplo n.º 1
0
      //-----------------------------------------------------
    //【関数定義】選択(担当:秋元)
      //-----------------------------------------------------
    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);
    }
Ejemplo n.º 2
0
    //-----------------------------------------------------
    //【関数定義】突然変異(担当:池田)
    //-----------------------------------------------------
     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);
    }
Ejemplo n.º 3
0
    //-----------------------------------------------------
    //【関数定義】交叉(担当:小林)
    //-----------------------------------------------------
    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);
    }