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()); } }