Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Отчеты / Лаб-3

.docx
Скачиваний:
5
Добавлен:
28.06.2021
Размер:
148.59 Кб
Скачать

Введение

На современном уровне техники сложность объектов зачастую не позволяет разработать для них эффективных математических моделей и тем более - аналитических методов их решения. К тому же составление мат. модели и проведение расчёта требует определённой квалификации. Таковы две причины всё большего распространения численных методов.

Основой численных методов являются не менее сложные математические теории, их главное отличие — возможность значительно уменьшить долю ручных вычислений и корректировок мат. модели. Такое упрощение компенсируется необходимостью многократного повторения расчётных шагов - «итераций», однако для современных компьютеров это зачастую не является проблемой.

Генетический алгоритм

Прежде всего, генетический алгоритм – это метод многомерной оптимизации, т.е. метод поиска минимума многомерной функции. Сама суть метода заключается в том, что модулируется эволюционный процесс: есть какая-то популяция (набор векторов), которая «размножается», на которую воздействуют мутации и производится естественный отбор на основании минимизации целевой функции. Основной принцип размножения — потомок похож на своих родителей. Т.е. должен быть какой-то механизм наследования. И лучше будет, если он будет включать элемент случайности. Но скорость развития таких систем очень низкая — генетическое разнообразие падает, популяция вырождается. Т.е. значение функции перестает минимизироваться. Для решения этой проблемы был введен механизм мутации, который заключается в случайном изменении каких-то особей. Этот механизм позволяет привнести что-то новое в генетическое разнообразие.

Следующий важный механизм — селекция. Отбор особей, которые лучше минимизируют функцию. Обычно отбирают столько особей, сколько было до размножения, чтобы из эпохи в эпоху было постоянное количество особей в популяции. Также принято отбирать «счастливчиков» — какое-то число особей, которые, возможно, плохо минимизируют функцию, но зато внесут разнообразия в последующие поколения.

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

Для реализации алгоритма была выбрана задача нахождения максимума функции: f(x) = 30x – 29x2. Где переменная x принимает значения от 0 до 31.

Рисунок 1 – График значений целевой функции

1. Целые числа из интервала от 0 до 31 представлены последовательностями нулей и единиц, используя их представление в двоичной системе счисления. Число 0 при этом записывается как 00000, а число 31 – как 11111. В данном случае хромосомы приобретают вид двоичных последовательностей, состоящих из 5 битов, т.е. цепочками длиной 5.

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

3. Случайным образом выбирается исходную популяцию, состоящую из 10 кодовых последовательностей.

4. По формуле рассчитываем значения функции приспособленности для каждой хромосомы в популяции.

5. Определяем, какие хромосомы возьмем в работу.

6. Скрещиваем или оставляем особи.

7. Шаги 4-6 повторяются до достижения условий остановки.

На рисунке 1 представлена блок-схема генетического алгоритма.

Рисунок 2 – блок схема генетического алгоритма

Результат выполнения программы для расчёта целевой функции генов различных популяций приведен на рисунках 3, 4, 5.

Р исунок 3 – результат выполнения программы

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

Рисунок 4 – результат выполнения второй программы

Исходный код программы генетического алгоритма представлен в приложении А.

Рисунок 5 – результат выполнения третьей программы

Вывод:

Проведенный эксперимент показал, что высокие значения вероятности (в задача p = 20%) мутации в сочетании с оператором мутации сильно снижают эффективность работы алгоритма. Очевидно, что мутация оказывает значительное влияние на сходимость генетического алгоритма. Следовательно, имеет смысл проводить ее дальнейшую модификацию, направленную на увеличение скорости сходимости ГА.

Приложение А

#include<iostream>

#include <cstdlib>

#include <conio.h>

#include <ctime>

#include <math.h>

#define EX ( g[i][0]*pow(2,4)+g[i][1]*pow(2,3)+g[i][2]*pow(2,2)+g[i][3]*pow(2,1)+g[i][4]*pow(2,0) )

#define CFunction 30*EX-29*EX*EX

using namespace std;

int main() {

::std::srand((unsigned int)::std::time(NULL));

int a=0;

int b=0;

int localmax=0;

int g [10][6] = {//шестой разряд - для ЦФ

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0}

};

int g2 [10][6] = {//временные данные

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0},

{0,0,0,0,0,0}

};

for (int i=0;i<10;i++) {

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

g[i][j]=(rand() % (2));

};

};

for (int i=0;i<10;i++) {

g[i][5]=CFunction;

};

while (true)

{

for (int j=0;j<5;j++) {//для этого 5 раз ищем ген с макисмальной ЦФ из оставшихся

for (int i=0;i<10;i++) {if (b<g[i][5]) {b=g[i][5];a=i;}; };

if (j==0) {localmax=g[a][5];};

g2[j][0]=g[a][0];

g2[j][1]=g[a][1];

g2[j][2]=g[a][2];

g2[j][3]=g[a][3];

g2[j][4]=g[a][4];

g[a][5]=-32000;

a=0;b=0;

};

cout<<"localmax: "<<localmax<<" Continue? y/n \n";

if (getch() == 'n') break;

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

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

if ( (rand() % (2))==1) {g[j][i]=g2[j][i];} else {g[j][i]=g2[j+1][i];};

g[j+5][i]=g2[j][i];

if ( (rand() % (5))==1) {g[j][i]= !g[j][i];};

};

};

for (int i=0;i<10;i++) {

g[i][5]=CFunction;

};

};

return 0;

}

Соседние файлы в папке Отчеты