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

3 ГА

.doc
Скачиваний:
7
Добавлен:
28.06.2021
Размер:
53.76 Кб
Скачать

Омский государственный технический университет

Кафедра ИВТ

Дисциплина

«Вычислительные системы и сети»

Лабораторная работа № 3

Численные методы решения задач:

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

Омск, 2019

Введение

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

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

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

Прежде всего, генетический алгоритм – это метод многомерной оптимизации, т.е. метод поиска минимума многомерной функции.

Сама суть метода заключается в том, что модулируется эволюционный процесс: есть какая-то популяция (набор векторов), которая «размножается», на которую воздействуют мутации и производится естественный отбор на основании минимизации целевой функции.

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

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

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

Рассмотрим простой пример – задачу нахождения максимума функции:

f(x) = 30x – 29x2

для целочисленной переменной х, принимающей значения от 0 до 31.

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

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

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

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

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

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

7. Повторяем шаги 4-6 до достижения условий остановки.

Реализация описанных шагов приведена в приложении 2.

  1. Задания к ЛР

4.3 Составить блок-схему генетического алгоритма. Изучить код к примеру (приложение 2), предложить варианты автоматического определения момента завершения процесса оптимизации, исследовать влияние вероятности мутаций на сходимость решения;

4.4 Оформить отчёт (см. раздел 3).

3. Содержание отчёта по лабораторной работе

- титульный лист (см. приложение на последнем листе);

- описание решенных задач;

- скриншоты программ и результатов их выполнения;

- выводы.

Приложение 1. Титульный лист отчета по лабораторной работе

Министерство образования и науки РФ

Федеральное государственное бюджетное образовательное учреждение высшего образования

«Омский государственный технический университет»

Кафедра «Информатика и вычислительная техника»

Отчёт по лабораторной работе № ____

по дисциплине

«____»

Выполнил

Студент гр. АБВ-101

Серый И.А. ______________

(подп., дата)

Проверил

Старший преподаватель каф. ИВТ

Звонов А.О. ______________

(подп., дата)

Омск, 201_

Приложение 2. Код к примеру 2

#include<iostream>

#include <cstdlib>//for rand

#include <conio.h>

#include <ctime>//for TIME in rand

#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}

};

//создание начальной популяции - заполнение её 0 и 1

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)//в цикле

{//из всех 10 генов выбираем 5 генов с наибольшей ЦФ:

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

//проходя по всем 10 генам и ища максимум

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;

//на отобранных 5 генах создаём новые 10:

for (int j=0;j<5;j++) {//для каждого из 5

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];};//мутируем образец "пересечённого" генотипа с вероятностью 1/5

};

};

//снова считаем ЦФ

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

g[i][5]=CFunction;

};

};

return 0;

}

Соседние файлы в предмете Вычислительные Системы