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

3) Скрипт Individual.Cs

using System;

using System.Collections.Generic;

namespace EvolutionaryAlgorithmTemplate

{

/*

Класс Individual (Особь)

Хранит хромосому (вектор рабочих параметров) и вычисляет значение фитнес-функции.

Фитнес-функция – функция трёхгорбого верблюда:

f(x,y)=2x^2 - 1.05x^4 + x^6/6 + x*y + y^2, где x,y [xmin, xmax] ([-5,5]),

глобальный минимум достигается при (0,0) со значением 0.

Методы:

Конструкторы для создания особи по хромосоме или по списку вещественных значений.

SetChromosome – устанавливает новую хромосому.

Fitness – вычисляет значение фитнес-функции.

Mutation – применяет мутацию к хромосоме.

GetGenes – возвращает рабочие параметры в виде списка вещественных чисел.*/

public class Individual

{

public Chromosome Chromosome { get; private set; }

public double FitnessValue { get; private set; }

// Конструктор, принимающий хромосому

public Individual(Chromosome chromosome)

{

Chromosome = chromosome;

FitnessValue = Fitness();

}

// Конструктор, принимающий список рабочих параметров

public Individual(List<double> values, double xmin, double xmax)

{

Chromosome = new Chromosome(values, xmin, xmax);

FitnessValue = Fitness();

}

// Обновляет хромосому и пересчитывает фитнес

public void SetChromosome(List<double> values, double xmin, double xmax)

{

Chromosome = new Chromosome(values, xmin, xmax);

FitnessValue = Fitness();

}

// Фитнес-функция (функция трёхгорбого верблюда) для первых двух параметров

public double Fitness()

{

if (Chromosome.Dimension < 2)

throw new ArgumentException("Фитнес-функция требует не менее двух рабочих параметров.");

double x = Chromosome.Gens[0].Value;

double y = Chromosome.Gens[1].Value;

FitnessValue = 2 * Math.Pow(x, 2) - 1.05 * Math.Pow(x, 4) + Math.Pow(x, 6) / 6 + x * y + Math.Pow(y, 2);

return FitnessValue;

}

// Применяет мутацию: выбирается случайный ген, к которому применяется мутация, затем обновляется фитнес

public void Mutation(double mutationProbability, Random rnd)

{

Chromosome.Mutation(mutationProbability, rnd);

FitnessValue = Fitness();

}

// Возвращает рабочие параметры особи в виде списка вещественных значений

public List<double> GetGenes()

{

List<double> genes = new List<double>();

foreach (var gene in Chromosome.Gens)

{

genes.Add(gene.Value);

}

return genes;

}

}

}

4) Скрипт Gen.Cs

using System;

namespace EvolutionaryAlgorithmTemplate

{

/* Класс Gen (Ген)

Свойства:

Value (double) – рабочий параметр.

Методы:

Конструктор Gen(double value) – задаёт значение гена.

SetValue(double newValue) – устанавливает новое значение гена.

Mutation() – выполняет мутацию гена: с заданной вероятностью прибавляет случайное смещение [xmin/5, xmax/5],

при этом результат ограничивается диапазоном [xmin, xmax].*/

public class Gen

{

public double Value { get; private set; }

public Gen(double value)

{

Value = value;

}

public void SetValue(double newValue)

{

Value = newValue;

}

public void Mutation(double xmin, double xmax, double mutationProbability, Random rnd)

{

if (rnd.NextDouble() < mutationProbability)

{

// Генерируем случайное смещение из интервала [xmin/5, xmax/5]

double lowerDelta = xmin / 5.0;

double upperDelta = xmax / 5.0;

double delta = lowerDelta + rnd.NextDouble() * (upperDelta - lowerDelta);

double newValue = Value + delta;

// Ограничиваем значение в диапазоне [xmin, xmax]

if (newValue < xmin) newValue = xmin;

if (newValue > xmax) newValue = xmax;

Value = newValue;

}

}

}

}