//Функция рождения поколения public void Born(int N) { for (int i = 0; i < N; i++) { Perseptron persi = new Perseptron(Neurons); persi.Initialization(); PersiList.Add(persi); } n += N; }
//Функция скрещивания, скрещивает всех особей по принципу: //слабый-><-сильный = новый //В результате популяция уменьшается в два раза, или увеличивается в 1 раз, (upPopulation = true) public void Crossbreeding(bool upPopulation) { //Новое поколение List<Perseptron> NewPersiList = new List<Perseptron>(); //Скрещиваем for (int i = 0; i < n/2; i++) { Perseptron persi = new Perseptron(Neurons); //Скрещиваем скрытые нейроны for (int j = 0; j < Neurons; j++) { for (int l = 0; l < 9; l++) persi.InvisibleNeurons_1[j].weights[l] = PersiList[Change(i, n - i - 1)].InvisibleNeurons_1[j].weights[l]; for (int l = 0; l < Neurons; l++) { persi.InvisibleNeurons_2[j].weights[l] = PersiList[Change(i, n - i - 1)].InvisibleNeurons_2[j].weights[l]; persi.InvisibleNeurons_3[j].weights[l] = PersiList[Change(i, n - i - 1)].InvisibleNeurons_3[j].weights[l]; } } //Скрещиваем выходные нейроны for (int j = 0; j < Neurons; j++) persi.on.weights[j] = PersiList[Change(i, n - i - 1)].on.weights[j]; //Добавляем новую особь в список NewPersiList.Add(persi); } //Тут два варианта, либо добавлять особей if (upPopulation) { for (int i = 0; i < n/2; i++) PersiList.Add(NewPersiList[i]); n += n/2; } else //либо замещать популяцию { PersiList.Clear(); for (int i = 0; i < n/2; i++) PersiList.Add(NewPersiList[i]); n = n / 2; } }
//Функция игры public int Game(Perseptron persi_1, Perseptron persi_2, int f1, int f2) { int winner = 0; persi_1.game++; persi_2.game++; //Выбираем стороны persi_1.Fraction = f1; persi_2.Fraction = f2; if (persi_1.Fraction == -1) { for (int i = 0; i < 9; i++) { X = persi_1.GameStep(X); winner = WinController(X); if (winner != 0) break; X = persi_2.GameStep(X); winner = WinController(X); if (winner != 0) break; } } else if (persi_2.Fraction == -1) { for (int i = 0; i < 9; i++) { X = persi_2.GameStep(X); winner = WinController(X); if (winner != 0) break; X = persi_1.GameStep(X); winner = WinController(X); if (winner != 0) break; } } if (winner == persi_1.Fraction) persi_1.WinCounter++; else if (winner == persi_2.Fraction) persi_2.WinCounter++; //else if (winner == 0) { persi_1.WinCounter += 0.5; persi_2.WinCounter += 0.5; } //Обнуляем фракции persi_1.Fraction = 0; persi_2.Fraction = 0; return winner; }