- •Реализация персептрона:
- •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
- •Описание
- •Общая схема работы и взаимосвязь модулей
- •Тестирование и демонстрация:
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;
}
}
}
}
