Мегаобучалка Главная | О нас | Обратная связь


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



2020-03-19 203 Обсуждений (0)
Направления развития генетических алгоритмов 0.00 из 5.00 0 оценок




Практическая деятельность человека ставит перед наукой все новые исследовательские задачи祥 Область применения генетических алгоритмов постоянно расширяется, что требует их совершенствования и исследова­ния. Перечислим несколько новых задач, которые могут решаться с ис­пользованием генетических алгоритмов, и связанные с ними направления исследований в этой области:

1) разработка новых методов тестирования генетических алгоритмов;
разработка адаптивных генетических алгоритмов;

2) расширение круга решаемых с использованием генетических алго­ритмов задач;

3) максимальное приближение генетических алгоритмов к естествен­ному эволюционному процессу.

До недавнего времени в качестве критерия качества большинства кон­кретных генетических алгоритмов использовалась эффективность решения задачи получения битового вектора с максимальным числом единичных разрядов. Чем быстрее алгоритм находил наилучшее решение, тем он счи­тался эффективнее. Сейчас эта задача уже не является объективным сред­ством тестирования алгоритмов, что свидетельствует об их бурном разви­тии не только с точки зрения применимости к тем или иным классам задач, но и с точки зрения их внутреннего построения и принципов работы.

В области исследований, направленных на повышение эффективности генетических алгоритмов, большое значение приобрели идеи создания адап­тивных генетических алгоритмов, которые могут изменять свои парамет­ры в процессе работы. Они стали продолжением развития идеи поколенческих алгоритмов, которые в процессе работы изменяют размер популя­ции. Адаптивные алгоритмы способны изменять не только этот параметр, но и суть генетических операторов, вероятность мутации и даже генотип алгоритма. Как правило, данные изменения происходят путем выбора па­раметров из нескольких вариантов, определенных перед началом работы алгоритма.

Идея адаптивных генетических алгоритмов получила свое воплощение в концепции, представляющей многоуровневые генетические ал­горитмы. Нижний уровень такого алгоритма непосредственно выполняет задачу улучшения популяции решений. Верхние уровни представляют со­бой генетические алгоритмы, решающие оптимизационную задачу по улучшению параметров алгоритма нижнего уровня. При этом в качестве целе­вой функции используется обычно скорость работы алгоритма нижнего уровня и скорость улучшения им популяции от поколения к поколению.

Традиционные оптимизационные задачи имеют целевую функцию с фиксированной областью значений, называемой также ландшафтом. В последнее время потребовалось решение задач, в которых ландшафт со временем может изменяться. То есть целевая функция при одних и тех же значениях аргументов в разные моменты времени может принимать раз­личные значения. Создание алгоритмов, способных работать с такими за­дачами, является сейчас одной из актуальных и одновременно сложных проблем в области генетических алгоритмов.

До сих пор продолжается дискуссия между сторонниками универсальных и проблемно-ориентированных представлений задач при использовании эволюционных вычислений. Можно говорить, что в этом вопросе чаша весов, склоняется в сторону универсальных, в которых можно осуществлять изменения на уровне генотипа значительно проще и эффективнее, чем на уровне фенотипа.

Перспективным направлением развития является добавление к генетическим операторам ламарковских операторов, которые позволяют вводить в рассмотрение признаки, приобретенные особью не в результате наследо­вания, а в течение своего жизненного цикла. Это еще более приближает модель генетических алгоритмов к природным процессам и, по мнению ученых, способно повысить их эффективность.

Идея приближения генетических алгоритмов к реальному эволюцион­ному процессу нашла свое отражение и в предложениях ввести в рассмотрение такие понятия, как вид и пол, учитывать взаимодействие особей в популяции в процессе "жизни", причем особей как одного вида, так и различных. Это позволит моделировать процессы сотрудничества, отноше­ний хозяев и паразитов и т. д.

Помимо этих новых течений в области исследования генетических ал­горитмов ведутся работы и в традиционных направлениях. Создаются все новые разновидности операторов отбора, скрещивания и мутации. Конструируются адаптивные алгоритмы, совершенствуются методы распараллеливания вычислений и структурирования популяций. Одновременно разрабатываются методики оценки эффективности и тестирования гене­тических алгоритмов.

Таким образом, генетические алгоритмы представляют собой одну из важных и активно развивающихся парадигм обширной области алгорит­мов поиска оптимальных решений. И в последнее время, с развитием ме­тодов компьютерной поддержки принятия решений, они приобретают все большее значение.

 

 


 ЗАКЛЮЧЕНИЕ

 

 В ходе данной работы была построена модель нейрона, нейронной сети. Для обучения сети был использовании алгоритм обратного распространения ошибки, являющийся наиболее распространённым алгоритмом при обучении нейронных сетей. Для обучения сети был применен генетический алгоритм. Программирование и обучение нейронных сетей очень интересное и увлекательное занятие. Роль генетических алгоритмом и нейронных сетей в настоящее время очень велика, поэтому знание и умение программировать их необходимо знать.

 


СПИСОК ЛИТЕРАТУРЫ

 

1) Курс лекций по дисциплине «Интеллектуальные ИС», Гурьев А.Т. , 2008

2) Лабораторный практикум по дисциплине «Интеллектуальные ИС», 2008г.

3) Методические пособия по дисциплине «Интеллектуальные ИС», 2008г.

4) Нейрокомпьютерная техника, Ф.Уоссермен, 1992.

5) Нейронные сети: основные положения, С.Короткий, 2008г.

 


ПРИЛОЖЕНИЕ

(обязательное)

 

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Collections;

using System.IO;

namespace neuro

{

                      struct SandY//резултат работы нейрона

                      {

                                                public double S;//сумма

                                                public double Y;//значение активизационной функции

                      }

                      class Program

                      {

                                                static Random ver = new Random();

                                                static int s = 0;//для рандомайза

 

                                                static int[] NMinIndexesValue(int N, double[] mass)//Возвращает N индексов для наименьших значений mass

                                                {

                                                                                              int[] resultMin = new int[N];

                                                                                              double[] arr = new double[mass.Length];

                                                                                              int[] ind = new int[mass.Length];

                                                                                              for (int i = 0; i < mass.Length; i++)

                                                                                              {

                                                                                                         arr[i] = mass[i];

                                                                                                         ind[i] = i;

                                                                                              }

                                                                                              double x;

                                                                                              int x1;

                                                                                              for (int i = 0; i < mass.Length; i++)

                                                                                              {

                                                                                                         for (int j = mass.Length - 1; j > i; j--)

                                                                                                         {

                                                                                                                        if (arr[j - 1] > arr[j])

                                                                                                                        {

                                                                                                                                        x = arr[j - 1];

                                                                                                                                        x1 = ind[j - 1];

                                                                                                                                        arr[j - 1] = arr[j];

                                                                                                                                        ind[j - 1] = ind[j];

                                                                                                                                   arr[j] = x;

                                                                                                                                        ind[j] = x1;

                                                                                                                        }

                                                                                                         }

                                                                                              }

                                                                                              for (int n = 0; n < N; n++)

                                                                                              {

                                                                                                         resultMin[n] = ind[n];

                                                                                              }

                                                                                              return resultMin;

                                                }

                                                static void mutation(double[][] W)// оператор мутации

                                                {

                                                                                              Random rnd = new Random(s);

                                                                                              int rnd1 = rnd.Next(0, 5);

                                                                                              int rnd2 = rnd.Next(0, 5);

                                                                                                  

                                                                                              double[] temp = new double[W[rnd1].Length];

                                                                                              double[] temp2 = new double[W.Length];

                                                                                              //меняет местами случайную строку и случайный столбец - и все портит =)

                                                                                              for (int j = 0; j < W[rnd1].Length; j++)

                                                                                              {

                                                                                                         temp[j] = W[rnd1][j];

                                                                                              }

                                                                                              for (int i = 0; i < W.Length; i++)

                                                                                              {

                                                                                                         temp2[i] = W[i][rnd2];

                                                                                                         W[i][rnd2] = temp[i];

                                                                                              }

                                                                                              for (int j = 0; j < W[rnd1].Length; j++)

                                                                                              {

                                                                                                         W[rnd1][j] = temp2[j];

                                                                                              }

                                                                                              if (s > 500)

                                                                                                         s = 0;

                                                                                              else

                                                                                                    s++;

                                                }

                                                static double[][][] Screshivanie(double[][] W1, double[][] W2)//оператор скрещивания, возвращает двух потомков

                                                {

                                                                                              Random rnd = new Random(s);

                                                                                              int rnd1 = rnd.Next(0,5);

                                                    

                                                                                              double[] temp = new double[W1[0].Length];

                                                                                              double[][][] resultW = new double[2][][];//для двух потомков

                                                                                              double[][][] resultW_temp = new double[2][][];

                                                                                              resultW[0] = new double[W1.Length][];

                                                                                              resultW[1] = new double[W1.Length][];

                                                                                              resultW_temp[0] = new double[W1.Length][];

                                                                                              resultW_temp[1] = new double[W1.Length][];

                                                                                              int rnd2 = rnd.Next(0, 5);

                                                                                              for (int i = 0; i < W1.Length; i++)

                                                                                              {        

                                                                                                         resultW_temp[0][i] = new double[W1[i].Length];

                                                                                                         resultW_temp[1][i] = new double[W1[i].Length];

                                                                                                         resultW[0][i] = new double[W1[i].Length];

                                                                                                         resultW[1][i] = new double[W1[i].Length];

                                                                                                         for (int j = 0; j < W1[i].Length; j++ )

                                                                                                         {

                                                                                                                        resultW_temp[0][i][j] = W1[i][j];

                                                                                                                        resultW_temp[1][i][j] = W2[i][j];

                                                                                                                        resultW[0][i][j] = W1[i][j];

                                                                                                                        resultW[1][i][j] = W2[i][j];

                                                                                                         }

                                                                                              }

                                                                                                  

                                                                                              //меяет одну случайных строки между двумя массивами

                                                                                                  

                                                                                              //проверяем не равны ли строки у родителей

                                                                                              bool[] str1 = new bool[resultW_temp[0].Length];

                                                                                              bool[] str2 = new bool[resultW_temp[0].Length];

                                                                                              for (int i = 0; i < resultW_temp[0].Length; i++)

                                                                                              {

                                                                                                         str1[i] = true;

                                                                                                         str2[i] = true;

                                                                                              }

                                                                                              for (int i = 0; i < resultW_temp[0].Length; i++)

                                                                                              {

                                                                                                         for (int j = 0; j < resultW_temp[0][i].Length; j++)

                                                                                                         {

                                                                                                                        if (resultW[0][i][j] != resultW_temp[1][i][j])

                                                                                                                        {

                                                                                                                                        str1[i] = false;

                                                                                                                                        break;

                                                                                                                        }

                                                                                                         }

                                                                                              }

                                                                                              for (int i = 0; i < resultW_temp.Length; i++)

                                                                                              {

                                                                                                         for (int j = 0; j < resultW_temp[0].Length; j++)

                                                                                                         {

                                                                                                                        if (resultW[0][i][j] != resultW_temp[1][i][j])

                                                                                                                        {

                                                                                                                                        str2[i] = false;

                                                                                                                                        break;

                                                                                                                        }

                                                                                                         }

                                                                                              }

                                                                                              if (!str1[rnd1])//если случайные строки не равны

                                                                                              {

                                                                                                         for (int j = 0; j < resultW_temp[0].Length; j++)

                                                                                                         {

                                                                                                                        resultW[0][rnd1][j] = resultW_temp[1][rnd1][j];

                                                                                                                        resultW[1][rnd1][j] = resultW_temp[0][rnd1][j];

                                                                                                         }

                                                                                              }

                                                                                              else

                                                                                              {

                                                                                                         //выбираем первую не равную пару строк

                                                                                                         for (int i = 0; i < resultW_temp.Length; i++)

                                                                                                         {

                                                                                                                        if (!str1[i])

                                                                                                                        {

                                                                                                                                        for (int j = 0; j < resultW_temp[0].Length; j++)

                                                                                                                                        {

                                                                                                                                                        resultW[0][i][j] = resultW_temp[1][i][j];

                                                                                                                                                        resultW[1][i][j] = resultW_temp[0][i][j];

                                                                                                                                        }

                                                                                                                                        break;

                                                                                                                        }

                                                                                                                        else//если таких пар не найдено то меняем случайные строки

                                                                                                                        {

                                                                                                                                        for (int j = 0; j < resultW_temp[0].Length; j++)

                                                                                                                                        {

                                                                                                                                                        resultW[0][rnd1][j] = rnd.NextDouble() * 0.1;

                                                                                                                                                        resultW[1][rnd1][j] = rnd.NextDouble() * 0.1;

                                                                                                                                        }

                                                                                                                        }

                                                                                                         }

                                                                                              }

                                                                                              if (s > 500)

                                                                                                         s = 0;

                                                                                              else

                                                                                                         s++;

                                                                                              return resultW;

                                                }

                                                static SandY neuro(double[][] X, double[][] W)//типа нейрон

                                                {

                                                                                              SandY result;

                                                                                              double alfa = 1;//коэфицент сигмоидности

                                                                                              result.S = 0;//результирующая сумма

                                                                                              for (int i = 0; i < X.Length; i++)

                                                                                              {

                                                                                                         for (int j = 0; j < X[i].Length; j++)

                                                                                                         {

                                                                                                                        result.S += X[i][j] * W[i][j];//комбинаторим

                                                                                                         }

                                                                                              }

                                                                                              result.Y = 1 / (1 + Math.Exp(alfa * result.S));//функция активизации

                                                                                              return result;

                                                }

                                                static void Main(string[] args)

                                                {

                                                                                              double[][] input_x0 = new double[5][];

                                                                                              double[][] input_x1 = new double[5][];

                                                                                              double[][][] weight = new double[2][][];//веса для двух нейрон

 

                                                                                              for (int i = 0; i < 5; i++)

                                                                                              {

                                                                                                         input_x0[i] = new double[5];

                                                                                                         input_x1[i] = new double[5];

                                                                                              }

                                                                                              int seed = 0;

                                                                                              for (int n = 0; n < 2; n++)//заполняем веса случайными значениями от 0,0 до 1,0

                                                                                              {

                                                                                                         weight[n] = new double[5][];

                                                                                                         for (int i = 0; i < 5; i++)

                                                                                                         {

                                                                                                                        weight[n][i] = new double[5];

                                                                                                                        for (int j = 0; j < 5; j++)

                                                                                                                        {

                                                                                                                                        weight[n][i][j] = new Random(seed).NextDouble()*0.1;

                                                                                                                                        seed++;

                                                                                                                        }

                                                                                                         }

                                                                                              }

                                                                                                         //тестовая матрица для 0

                                                                                              input_x0[0][0] = 0;

                                                                                              input_x0[0][1] = 1;

                                                                                              input_x0[0][2] = 1;

                                                                                              input_x0[0][3] = 1;

                                                                                              input_x0[0][4] = 0;

 

                                                                                              input_x0[1][0] = 1;

                                                                                              input_x0[1][1] = 0;

                                                                                              input_x0[1][2] = 0;

                                                                                              input_x0[1][3] = 0;

                                                                                              input_x0[1][4] = 1;

 

                                                                                              input_x0[2][0] = 1;

                                                                                              input_x0[2][1] = 0;

                                                                                              input_x0[2][2] = 0;

                                                                                         input_x0[2][3] = 0;

                                                                                              input_x0[2][4] = 1;

 

                                                                                              input_x0[3][0] = 1;

                                                                                              input_x0[3][1] = 0;

                                                                                              input_x0[3][2] = 0;

                                                                                              input_x0[3][3] = 0;

                                                                                              input_x0[3][4] = 1;

 

                                                                                              input_x0[4][0] = 0;

                                                                                              input_x0[4][1] = 1;

                                                                                              input_x0[4][2] = 1;

                                                                                              input_x0[4][3] = 1;

                                                                                         input_x0[4][4] = 0;

 

                                                                                              //тестовая матрица для 1

                                                                                              input_x1[0][0] = 0;

                                                                                              input_x1[0][1] = 0;

                                                                                              input_x1[0][2] = 1;

                                                                                              input_x1[0][3] = 0;

                 <



2020-03-19 203 Обсуждений (0)
Направления развития генетических алгоритмов 0.00 из 5.00 0 оценок









Обсуждение в статье: Направления развития генетических алгоритмов

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (203)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)