Exemple #1
0
        static void Main(string[] args)
        {
            //      string str = GeneticAlgorithm.EncodeToGene(-46);
            //     Console.WriteLine(str);
            //    Console.WriteLine(   GeneticAlgorithm.DecodeFromGene(str));
            //     Console.Read();
            //  Console.WriteLine(TwoPointCrossOver("1111111111","0000000000"));
            // Console.ReadKey();

            GeneticAlgorithm.Learn();


            Console.ReadLine();

            int[,] field = new int[10, 25];
            field        = new int[, ]
            {
                { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
                { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
                { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
                { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
                { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
                { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
                { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
                { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
                { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
                { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }
            };

            var value = (NewTetrisAI.Find(field, 5, new int[1] {
                1
            }, 0, 2, true));

            TetrisEnvironment.Print(field, false);
            Console.WriteLine(value.way);
            Console.WriteLine(value.eval);
            Console.ReadLine();
        }
    static public float Evaluate(int[,] field, TetrisEnvironment.Vector2[] minopositions, float beforeEval, bool arrayApply, bool test = false)
    {
        holeYs.Clear();



        int[,] field_clone;
        if (arrayApply)
        {
            field_clone = field;
        }
        else
        {
            field_clone = (int[, ])field.Clone();
        }

        int completeLine = 0;

        foreach (TetrisEnvironment.Vector2 pos in minopositions)
        {
            field_clone[pos.x, pos.y] = 1;
        }
        CheckLine(field_clone, ref completeLine);



        int sumofheight = 0;

        //高さ合計計算
        for (int x = 0; x < 10; x++)
        {
            for (int y = 25 - 1; y >= 0; y--)
            {
                if (field_clone[x, y] == 1)
                {
                    maxHeights[x] = y;
                    sumofheight  += y;
                    continue;
                }
            }
        }

        int holeCount = 0;

        //穴計算
        for (int x = 0; x < 10; x++)
        {
            for (int y = 0; y < 25 - 1; y++)
            {
                if (field_clone[x, y] == 0 && field_clone[x, y + 1] == 1)
                {
                    holeCount++;
                    holeYs.Add(new TetrisEnvironment.Vector2(x, y));
                }
            }
        }

        for (int y = 25 - 1 - 1; y >= 0; y--)
        {
            for (int x = 0; x < 10; x++)
            {
                if (field_clone[x, y] == 0 && field_clone[x, y + 1] == 1)
                {
                    holeCount++;
                    holeYs.Add(new TetrisEnvironment.Vector2(x, y));
                }
            }
        }



        int holemax;

        if (holeYs.Count < 4)
        {
            holemax = holeYs.Count;
        }
        else
        {
            holemax = 4;
        }
        //穴の上
        for (int i = 0; i < holemax; i++)
        {
            int ad = 1;
            while (true)
            {
                if (holeYs[i].y + ad < 25 && field_clone[holeYs[i].x, holeYs[i].y + ad] == 1)
                {
                    ad++;
                }
                else
                {
                    holeup[i] = ad;
                    break;
                }
            }
        }


        //一番深いのはノーカンにしよう
        int dekoboko = 0;

        for (int i = 0; i < maxHeights.Length - 1; i++)
        {
            dekoboko += Math.Abs(maxHeights[i] - maxHeights[i + 1]);
        }

        float ajust = 0;

        switch (completeLine)
        {
        case 1:
            ajust += h_line1;
            break;

        case 2:
            ajust += h_line2;
            break;

        case 3:
            ajust += h_line3;
            break;

        case 4:
            ajust += h_line4;
            break;
        }



        if (test)
        {
            TetrisEnvironment.Print(field_clone, false);
            Console.WriteLine($"でこぼこ:{ dekoboko * -0.184 }");
            Console.WriteLine($"高さ合計:{ sumofheight * -0.51f}");
            Console.WriteLine($"穴:{ holeCount * -0.6f }");
            Console.WriteLine($"クリアライン:{ completeLine * 0.76 }");
            Console.WriteLine($"合計:{(float)(sumofheight * -0.51f + completeLine * 0.76 + holeCount * -0.356f + dekoboko * -0.184)}");
            Console.ReadKey();
        }

        return((float)(sumofheight * h_sumofheight + /* completeLine * 0.76+*/ holeCount * h_holeCount + dekoboko * h_dekoboko + beforeEval * 0.6f + ajust + holeup[0] * h_holeup1 + holeup[1] * h_holeup2 + holeup[2] * h_holeup3 + holeup[3] * h_holeup4));
    }