- •Реализация персептрона:
- •2.1. Точка входа в программу Program.Cs
- •2.2. Входные данные InputData.Cs
- •2.3. Реализация персептрона по методу Хебба Perceptron.Cs
- •2.4 Вывод информации OutputInformation.Cs
- •Описание
- •1. Точка входа – Program.Cs
- •2. Входные данные – InputData.Cs
- •3. Реализация персептрона – Perceptron.Cs
- •4. Вывод информации – OutputInformation.Cs
- •Взаимосвязь скриптов
- •Реализация генетического алгоритма:
- •1) Скрипт Program.Cs
- •2) Скрипт Population.Cs
- •3) Скрипт Individual.Cs
- •4) Скрипт Gen.Cs
- •5) Скрипт EvolutionManager.Cs
- •6) Скрипт Chromosome.Cs
- •Описание
- •Взаимосвязь между скриптами
- •Нейроэволюционный алгоритм:
- •1) Скрипт Program.Cs
- •2) Скрипт gaEvolutionManager
- •3) Скрипт TrainingSample.Cs
- •4) Скрипт OutputInformation.Cs
- •5) Скрипт InputData.Cs
- •6) Скрипт gaPerceptronIndividual.Cs
- •Описание
- •Общая схема работы и взаимосвязь модулей
- •Тестирование и демонстрация:
5) Скрипт EvolutionManager.Cs
using System;
using System.Collections.Generic;
namespace EvolutionaryAlgorithmTemplate
{
/*
Класс EvolutionManager (Менеджер эволюции)
Хранит список популяций (каждая популяция – поколение), генератор случайных чисел
и параметры задачи: размерность (число рабочих параметров), диапазон [xmin, xmax],
вероятность мутации и параметры оператора кроссинговера (a и b).
Методы:
InitPopulation – инициализирует начальную популяцию заданным числом особей.
CreateNewGeneration – создаёт новое поколение путём селекции, кроссинговера и мутации.
RemovePopulation – удаляет предпоследнюю популяцию для освобождения памяти.
*/
public class EvolutionManager
{
public List<Population> Populations { get; private set; }
public Random Rnd { get; private set; }
private int dimension; // число рабочих параметров (от 2 до N)
private double xmin;
private double xmax;
private double mutationProbability; // от 0.005 до 0.1
private double crossoverA;
private double crossoverB;
public EvolutionManager(int dimension, double xmin, double xmax, double mutationProbability, double crossoverA, double crossoverB)
{
if (dimension < 2)
throw new ArgumentException("Количество рабочих параметров должно быть не менее 2.");
this.dimension = dimension;
this.xmin = xmin;
this.xmax = xmax;
this.mutationProbability = mutationProbability;
this.crossoverA = crossoverA;
this.crossoverB = crossoverB;
Populations = new List<Population>();
Rnd = new Random();
}
// Инициализирует начальную популяцию, создавая заданное число особей со случайными рабочими параметрами
public void InitPopulation(int populationCount)
{
Population pop = new Population();
for (int i = 0; i < populationCount; i++)
{
pop.NewRandomIndividual(dimension, xmin, xmax, Rnd);
}
Populations.Add(pop);
}
// Создаёт новое поколение: для каждой пары родителей (выбранных методом рулетки)
// выполняется оператор кроссинговера и потомки мутируют
public void CreateNewGeneration()
{
if (Populations.Count == 0)
throw new InvalidOperationException("Нет популяции для эволюции.");
Population currentPop = Populations[Populations.Count - 1];
Population newPop = new Population();
while (newPop.Individuals.Count < currentPop.Individuals.Count)
{
var (parent1, parent2) = currentPop.SelectPair(Rnd);
List<Individual> offspring = currentPop.Crossingover(parent1, parent2, crossoverA, crossoverB, xmin, xmax, Rnd);
foreach (var child in offspring)
{
child.Mutation(mutationProbability, Rnd);
newPop.Individuals.Add(child);
if (newPop.Individuals.Count >= currentPop.Individuals.Count)
break;
}
}
Populations.Add(newPop);
}
// Удаляет предпоследнюю популяцию (после создания нового поколения)
public void RemovePopulation()
{
if (Populations.Count >= 2)
{
Populations.RemoveAt(Populations.Count - 2);
}
}
}
}
