Скачиваний:
0
Добавлен:
26.10.2025
Размер:
66.59 Кб
Скачать

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

}

}

}

}