- •Ход работы
- •1. Структура нейроэволюционного алгоритма
- •2. Способ кодирования весовых коэффициентов персептрона в виде хромосомы генетического алгоритма.
- •3. Исходный код нейроэволюционного алгоритма, включая модель персептрона и генетический алгоритм, выполняющий обучение персептрона.
- •3.1. Точка входа в программу Program.Cs
- •3.2. Корректировка весов персептрона gaEvolutionManager.Cs
- •3.3. Структура обучающего примера TrainingSample.Cs
- •3.4. Вывод информации OutputInformation.Cs
- •3.5. Отдельный индивида в генетическом алгоритме gaPerceptronIndividual.Cs
- •3.6. Входные данные InputData.Cs
- •5. Матрицы весовых коэффициентов обученного персептрона
- •6. Результаты исследования работы программы
- •Заключение
3.6. Входные данные InputData.Cs
namespace PerceptronSymbolsHybrid
{
public static class InputData
{
static Random rnd = new Random();
public static List<TrainingSample> GetSymbolSamples()
{
var samples = new List<TrainingSample>();
int[] symbol1 = new int[]
{
1, 0, 0, 0, 0,
1, 0, 0, 0, 0,
1, 1, 1, 1, 1,
1, 0, 0, 0, 0,
1, 0, 0, 0, 0
};
samples.Add(new TrainingSample(symbol1, "├"));
int[] symbol2 = new int[]
{
0, 0, 0, 0, 1,
0, 0, 0, 0, 1,
1, 1, 1, 1, 1,
0, 0, 0, 0, 1,
0, 0, 0, 0, 1
};
samples.Add(new TrainingSample(symbol2, "┤"));
int[] symbol3 = new int[]
{
1, 1, 1, 1, 1,
0, 0, 1, 0, 0,
0, 0, 1, 0, 0,
0, 0, 1, 0, 0,
0, 0, 1, 0, 0
};
samples.Add(new TrainingSample(symbol3, "┬"));
int[] symbol4 = new int[]
{
0, 0, 1, 0, 0,
0, 0, 1, 0, 0,
0, 0, 1, 0, 0,
0, 0, 1, 0, 0,
1, 1, 1, 1, 1
};
samples.Add(new TrainingSample(symbol4, "┴"));
int[] symbol5 = new int[]
{
0, 0, 1, 0, 0,
0, 0, 1, 0, 0,
1, 1, 1, 1, 1,
0, 0, 1, 0, 0,
0, 0, 1, 0, 0
};
samples.Add(new TrainingSample(symbol5, "┼"));
int[] symbol6 = new int[]
{
0, 0, 0, 0, 0,
1, 1, 1, 1, 1,
0, 0, 0, 0, 0,
1, 1, 1, 1, 1,
0, 0, 0, 0, 0
};
samples.Add(new TrainingSample(symbol6, "═"));
int[] symbol7 = new int[]
{
0, 1, 0, 1, 0,
0, 1, 0, 1, 0,
0, 1, 0, 1, 0,
0, 1, 0, 1, 0,
0, 1, 0, 1, 0
};
samples.Add(new TrainingSample(symbol7, "║"));
return samples;
}
public static TrainingSample GenerateNoiseSample()
{
int[] pattern = new int[25];
for (int i = 0; i < 25; i++)
{
pattern[i] = rnd.NextDouble() > 0.5 ? 1 : 0;
}
return new TrainingSample(pattern, "None");
}
public static int[] ReadUserInput()
{
int[] userInput = new int[25];
for (int i = 0; i < 5; i++)
{
string? line = Console.ReadLine();
if (string.IsNullOrWhiteSpace(line))
{
i--;
continue;
}
string[] parts = line.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length != 5)
{
i--;
continue;
}
for (int j = 0; j < 5; j++)
{
userInput[i * 5 + j] = parts[j] == "1" ? 1 : 0;
}
}
return userInput;
}
}
}
4. Результаты настройки генетического алгоритма: число особей в популяции, вероятность мутации, время выполнения обучения с помощью генетического алгоритма, число поколений, число выполненных вычислений фитнес-функции.
В конфигурации алгоритма популяция состоит из 20 особей. Используется альтернативная равномерная мутация с вероятностью 0.1. Время работы зависит от числа поколений и вычислительных затрат на оценку фитнес-функции. Эволюция продолжается до достижения порога фитнеса или максимального числа поколений до 10 000 поколений. Алгоритм продолжает эволюцию до тех пор, пока не будет достигнут заданный порог фитнес-функции или не исчерпается максимальное число поколений. Фитнес-функция вычисляется при создании каждой особи (при инициализации популяции) и повторно после каждой мутации. При популяции из 20 особей и 10 000 поколениях, общее число вычислений может достигать примерно 200000.
