Смекни!
smekni.com

Генетический алгоритм 3 (стр. 5 из 6)

- отбор пропорционально значению целевой функции.

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

- случайное равновероятное удаление;

- удаление К наихудших;

- удаление, обратно пропорциональное значению целевой функции.

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

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

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

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

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

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;

}

}

}