Example #1
0
        public void AI()
        {
            set_user("CPU1", "CPU2");

            int    samplesize             = 500;                                     //how many games , half is black
            int    cycles                 = 10;                                      //repeat slaughterhouse x times
            int    students               = 20;                                      //number of students slaughtered
            int    maxchange              = 25;                                      //max change per cycle in percent
            double maxchange_changefactor = Math.Pow((5 / maxchange), (1 / cycles)); //calculate facotr: maxchange reaches only 5% after n cycles

            List <double[]> weights = new List <double[]>();

            double[] Parent =
            {
                50,  // Wert eigener Stein
                100, // Wert eigene Dame
                -20, // Wert gegnerischer Stein
                -80, // Wert gegnerische Dame
                -2,  // Distance Faktor Dame-Stein
                -40, // Bewertung gegnerischer Sprunganzahl
                5,   // Zug der einen eigenen Sprung ermöglicht
                +10  // für jeden Stein der in der Königsreihe verweilt
            };       //stats of the winner (starts at our stats)

            double[] Winner = new double[8];
            int      highest_winrate;
            int      winrate;


            for (int i = 0; i < cycles; i++)
            {
                //Maxchange in each Generation lowerd
                maxchange = (int)(maxchange * maxchange_changefactor);

                //BUILDER BOT
                weights.Clear();
                //set weights
                for (int j = 0; j < students; j++)
                {
                    double[] weight = new double[8];
                    Parent.CopyTo(weight, 0);
                    weights.Add(weight);
                }

                //modify weights at random
                for (int k = 1; k < weights.Count; k++)
                {
                    double[] weight = weights[k];
                    //keep last round's winner as a contestend
                    for (int j = 0; j < weight.Length; j++)
                    {
                        weight[j] = weight[j] * (1 + ((double)(Zufall.Next(2 * maxchange + 1) - maxchange) / 100));
                    }
                }
                //TEACHER BOT
                highest_winrate = -10000;
                for (int j = 0; j < students; j++)
                {
                    Player[0].cpu.set_weights(weights[j]);
                    Player[1].cpu.set_weights(Parent);
                    Tuple <int, int> results1 = test(samplesize / 2);
                    //repeat for inverted colors
                    Player[0].cpu.set_weights(Parent);
                    Player[1].cpu.set_weights(weights[j]);
                    Tuple <int, int> results2 = test(samplesize / 2);
                    //check if black is current best
                    winrate = results2.Item2 + results1.Item1;
                    if (winrate > highest_winrate)
                    {
                        highest_winrate = winrate; Winner = weights[j];
                    }
                }

                Winner.CopyTo(Parent, 0);

                string output = Winner[0] +
                                "\n" + Winner[1] +
                                "\n" + Winner[2] +
                                "\n" + Winner[3] +
                                "\n" + Winner[4] +
                                "\n" + Winner[5] +
                                "\n" + Winner[6] +
                                "\n" + Winner[7];

                //gibt aktuell beste weights aus
                drawing.labelWeights(output);

                //Zeichnet Fortschritt in Prozent auf Label
                drawing.labelStatus(((100 * (i + 1)) / cycles + "%").ToString());
            }
        }