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

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ.ПРОФ.М.А.БОНЧ-БРУЕВИЧА»

(СПбГУТ)

Факультет: «Институт магистратуры»

Кафедра: «Систем автоматизации и робототехники»

Направление подготовки:

Автоматизация технологических процессов и производств

Направленность (профиль):

Интеллектуальные технологии в автоматизации

ЛАБОРАТОРНАЯ РАБОТА № 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}"));

}

}

Соседние файлы в предмете Методы и модели искусственного интеллекта в управлении техническими системами