- •Реализация персептрона:
- •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
- •Описание
- •Общая схема работы и взаимосвязь модулей
- •Тестирование и демонстрация:
2.3. Реализация персептрона по методу Хебба Perceptron.Cs
using System;
namespace PerceptronSymbols
{
// Класс, реализующий отдельный персептрон для распознавания одного символа.
public class Perceptron
{
public double[] Weights; // вектор весов длины 25
public string Symbol; // распознаваемый символ
public double LearningRate = 0.1;
public int InputSize { get; }
public double Threshold = 0; // порог активации
public Perceptron(string symbol, int inputSize)
{
Symbol = symbol;
InputSize = inputSize;
Weights = new double[inputSize];
// Инициализация весов нулями
for (int i = 0; i < inputSize; i++)
Weights[i] = 0;
}
// Функция активации: возвращает 1, если сумма без смещения не меньше порога, иначе 0.
public int Predict(int[] input)
{
double sum = 0;
for (int i = 0; i < InputSize; i++)
sum += Weights[i] * input[i];
return sum >= Threshold ? 1 : 0;
}
/* Обучение персептрона по правилу Хебба.
При ложном отрицательном срабатывании (ожидали 1, получили 0) увеличиваем веса.
При ложноположительном срабатывании (ожидали 0, получили 1) уменьшаем веса.*/
public void Train(int[] input, int target)
{
int output = Predict(input);
if (output != target)
{
if (target == 1 && output == 0) // Ложноотрицательное срабатывание
{
for (int i = 0; i < InputSize; i++)
{
if (input[i] == 1)
Weights[i] += LearningRate;
}
// Обновление смещения удалено
}
else if (target == 0 && output == 1) // Ложноположительное срабатывание
{
for (int i = 0; i < InputSize; i++)
{
if (input[i] == 1)
Weights[i] -= LearningRate;
}
}
}
}
}
}
2.4 Вывод информации OutputInformation.Cs
using System;
namespace PerceptronSymbols
{
public static class OutputInformation
{
// Вывод весовой матрицы персептрона в виде 5x5.
public static void PrintWeights(Perceptron p)
{
Console.WriteLine($"Весовая матрица для символа {p.Symbol}:");
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
Console.Write($"{p.Weights[i * 5 + j],8:F3}");
}
Console.WriteLine();
}
}
// Вывод результата тестового распознавания: матрица ввода, матрица весов (если распознано) и распознанный символ.
public static void PrintTestResult(int[] inputMatrix, Perceptron? p, string recognizedSymbol)
{
Console.WriteLine("\nМатрица ввода:");
PrintMatrix(inputMatrix);
if (p != null)
{
Console.WriteLine($"\nВесовая матрица для символа {p.Symbol}:");
PrintMatrixDouble(p.Weights);
}
else
{
Console.WriteLine("\nНи один персептрон не сработал (распознавание не выполнено).");
}
Console.WriteLine($"\nРаспознанный символ: {recognizedSymbol}");
Console.WriteLine(new string('-', 40));
}
// Метод для печати матрицы (целочисленной) в виде 5x5.
static void PrintMatrix(int[] matrix)
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
Console.Write(matrix[i * 5 + j] + " ");
}
Console.WriteLine();
}
}
// Метод для печати матрицы (вещественной) в виде 5x5.
static void PrintMatrixDouble(double[] matrix)
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
Console.Write($"{matrix[i * 5 + j],8:F3}");
}
Console.WriteLine();
}
}
}
}
