- •Ход работы
- •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. Результаты исследования работы программы
- •Заключение
МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ.ПРОФ.М.А.БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Факультет: «Институт магистратуры»
Кафедра: «Систем автоматизации и робототехники»
Направление подготовки: |
Автоматизация технологических процессов и производств |
Направленность (профиль): |
Интеллектуальные технологии в автоматизации |
ЛАБОРАТОРНАЯ РАБОТА № 5
по дисциплине:
Методы и модели искусственного интеллекта в управлении техническими системами
|
на тему:
Программная реализация и экспериментальное исследование нейроэволюционного алгоритма
Вариант: 10
-
Выполнили студенты группы:
дата, подпись
Фамилия И. О.
Принял к.т.н., доцент
Верхова Г.В.
дата, подпись
Фамилия И. О.
Цель работы: Приобретение навыков программной реализации на языке C# и экспериментального исследования нейроэволюционного алгоритма.
Задание: Выполнить программную реализацию на языке C# и экспериментально исследовать нейроэволюционный алгоритм. Распознаваемые символы берутся из лабораторной работы № 4, согласно 10 варианту. Рекомендуется воспользоваться генетическим алгоритмом, который был разработан в результате выполнения лабораторных работ №2 и №3, при необходимости модифицировав его.
В случае вещественного кодирования можно использовать вещественные значения весовых коэффициентов. Данное условие не является обязательным. Результаты представить в виде таблицы.
Ход работы
1. Структура нейроэволюционного алгоритма
Нейроэволюционный алгоритм объединяет обучение нейросети с методами эволюционных алгоритмов. В нём каждая нейросеть представлена хромосомой, набором генов (весовых коэффициентов). Алгоритм начинается с инициализации популяции, затем каждая сеть обучается на примерах {X, Y} (по формуле Y = F(W, X) + Err), после чего оценивается её пригодность. Далее с помощью операций отбора, кроссовера и мутации создаётся новое поколение. Существуют два вида алгоритмов: с фиксированной топологией сети и с эволюцией топологии, позволяющей изменять структуру сети.
Рис.1 — Структура нейроэволюционного алгоритма
2. Способ кодирования весовых коэффициентов персептрона в виде хромосомы генетического алгоритма.
Используется прямое вещественное кодирование. Хромосома представлена в виде вектора (списка) вещественных чисел, где каждый элемент соответствует одному весовому коэффициенту персептрона. Эти значения ограничены диапазоном [-1,1] и используются напрямую для вычисления выходного сигнала персептрона. При инициализации в базовой популяции к базовым весам добавляется шум, чтобы обеспечить генетическое разнообразие.
3. Исходный код нейроэволюционного алгоритма, включая модель персептрона и генетический алгоритм, выполняющий обучение персептрона.
3.1. Точка входа в программу Program.Cs
namespace PerceptronSymbolsHybrid
{
class Program
{
static void Main()
{
var bases = new[]{5,10,50,100,1000,10000,100000};
int gaE=10000; var res=new List<(int,double,double,double)>();
foreach(var b in bases)
{
double si=0,sn=0,sm=0;
for(int i=0;i<10;i++)
{
var (ie,ne,me)=RunExp(b,gaE);
si+=ie;sn+=ne;sm+=me;
}
res.Add((b+gaE,si/10,sn/10,sm/10));
}
PrintTable(res);
var sam=InputData.GetSymbolSamples();
var set=sam.Concat(Enumerable.Range(0,sam.Count*2).Select(_=>InputData.GenNoise())).ToList();
var models=new Dictionary<string,GAPerceptronIndividual>();
foreach(var s in sam)
{
var bw=BaseTrain(s.Label,set,10000,25);
var ga=new GAEvolutionManager(20,25,-1,1,0.1,0.3,0.7,s.Label,set,bw);
models[s.Label]=ga.Evolve(10000,0);
}
}
static double[] BaseTrain(string sym,List<TrainingSample>t,int e,int n)
{
var w=new double[n];
for(int i=0;i<e;i++)
foreach(var s in t)
{
int tar=s.Label==sym?1:0, o=Pred(w,s.Input);
if(o!=tar)
for(int j=0;j<n;j++)if(s.Input[j]==1)w[j]+=0.1*(tar-o);
}
return w;
}
static int Pred(double[]w,int[]i){double su=0;for(int j=0;j<w.Length;j++)su+=w[j]*i[j];return su>=0?1:0;}
static (double,double,double) RunExp(int b,int g)
{
var sam=InputData.GetSymbolSamples();
var set=sam.Concat(Enumerable.Range(0,sam.Count*2).Select(_=>InputData.GenNoise())).ToList();
var mods=new Dictionary<string,GAPerceptronIndividual>();
foreach(var s in sam)
{
var bw=BaseTrain(s.Label,set,b,25);
var ga=new GAEvolutionManager(20,25,-1,1,0.1,0.3,0.7,s.Label,set,bw);
mods[s.Label]=ga.Evolve(g,0);
}
double ie=Test(sam,mods);
double ne=Test(Enumerable.Range(0,sam.Count*2).Select(_=>InputData.GenNoise()).ToList(),mods);
double me=Test(sam.SelectMany(x=>new[]{x,InputData.GenNoise(),InputData.GenNoise()}).ToList(),mods);
return (ie,ne,me);
}
static double Test(List<TrainingSample>ts,Dictionary<string,GAPerceptronIndividual>ms)
=> ts.Count(t=>
{
var f=ms.Where(kv=>GAPerceptronIndividual.Predict(kv.Value.Weights,t.Input)==1).Select(kv=>kv.Key).ToList();
return t.Label=="None"?f.Count>0:f.Count!=1||f[0]!=t.Label;
})*100.0/ts.Count;
static void PrintTable(List<(int,double,double,double)>r)
=> r.ForEach(x=>Console.WriteLine($"{x.Item1}|{x.Item2:F2}|{x.Item3:F2}|{x.Item4:F2}"));
}
}
