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

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 22.02.2015
Размер файла 131,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

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

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

высшего профессионального образования

«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)

Кафедра радиоэлектроники и защиты информации (РЗИ)

Курсовой проект

По дисциплине «Информатика - КП»

Выполнил студент

специальности 210400.62

Группа з-142-а

Хусаенов Руслан Альфатович

2015

Введение

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

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

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

Постановка задачи

программа генетический алгоритм популяция

Необходимо найти минимум функции в заданной области.

При выполнении данного проекта необходимо учитывать, что решение задачи является подверженным влиянию случайных величин. Поэтому каждый запуск программы необходимо повторять, по крайней мере, 2030 раз. После этого из набора полученных решений надо отобрать лучшее. Разумеется, это надо сделать, поместив содержание главной программы в соответствующий цикл, в котором будет одновременно выбираться наилучшее решение. Одновременно надо вычислить и среднее значение минимума за эти 20-30 прогонов.

.

.

.

Рассмотреть равномерное скрещивание и двухточечную мутацию.

Каждая переменная кодируется 20 битами.

Провести расчеты для 40 и 80 поколений.

Сравнить получающиеся решения при размерах популяции 8, 12, 20 особей.

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

Пусть у нас есть некоторый определенный тип или класс объектов (т.е. множество объектов, удовлетворяющих некоторому набору условий). И пусть нам необходимо найти в этом классе некоторый объект, удовлетворяющий другому некоторому условию. Такой процесс можно обобщенно назвать поиском или решением. Класс, среди объектов которого производится поиск, назовем областью поиска или пространством поиска. Искомый объект можно назвать целью или целевым объектом поиска, а условие, которому он должен удовлетворять целевым условием. Для определения условия обычно задается некоторая функция на пространстве поиска. Достижение функцией определенного значения и является целевым условием. Такая функция называется целевой функцией. Таким образом, поиск заключается в просмотре по определенным правилам пространства поиска всех объектов, пока не будет обнаружен целевой. Функции выбора нового кандидата для проверки называются операторами поиска.

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

В генетическом алгоритме (ГА) каждый индивид кодируется сходным с ДНК методом в виде строки из символов одного типа. Длина строки (ДНК) постоянна. Популяция из индивидов подвергается процессу эволюции с интенсивным использованием скрещивания и мутаций.

Назовем представление каждого индивида геномом. Для каждого вида и каждого представления для данного целевого условия задается целевая функция. Значение целевой функции назовем целевым значением. Вектор, состоящий из целевых значений всех индивидов в популяции, назовем вектором целевых значений. Тогда если вычислен вектор целевых значений, то можно определить приспособленность (fitness) индивида в популяции, для чего задается специальная функция приспособленности от данного целевого значения и от вектора целевых значений. Аналогично вектору целевых значений введем вектор приспособленности. Часто целевое значение называют приспособленностью, а значение приспособленности, в смысле вероятность участия в размножении, неявно вычисляется во время отбора. Процесс эволюции останавливается, когда популяция отвечает определенному критерию критерию завершения.

Принципиальная схема работы ГА состоит из следующих основных фаз:

1. Создание начальной популяции. Задание генома каждому из индивидов. Расчет вектора целевых значений.

2. Шаг эволюции построение нового поколения.

3. Проверка критерия завершения, если не выполнено переход на 2.

Шаг эволюции можно разделить на следующие этапы:

1. Вычисление вектора приспособленности.

2. Отбор кандидатов на скрещивание (Отбор Selection).

3. Скрещивание, т.е. порождение каждой парой отобранных кандидатов новых индивидов, путем геномов.

4. Мутация геномов.

5. Вычисление вектора целевых значений и построение новой популяции (нового поколения).

Среди компонентов, образующих генетический алгоритм, в большинстве случаев только два непосредственно определяются конкретной задачей это кодировка задачи (отображение пространства поиска на пространство битовых строк) и целевая функция. Рассмотрим задачу параметрической оптимизации, заключающуюся в определении набора переменных, минимизирующих некоторую величину (цель). В более традиционных терминах, задача состоит в поиске минимума некоторой функции F(X1, X2, …, XM).

На первом этапе обычно делается предположение, что переменные, представляющие параметры, могут быть представлены битовыми строками. Это означает, что переменные предварительно дискретизируются некоторым образом и что область дискретных значений соответствует некоторой степени 2. Например, с 10 битами на параметр мы получаем область из 210 = 1024 дискретных значений. Если параметры непрерывны, то проблема дискретизации не заслуживает особого внимания. Разумеется, предполагается, что дискретизация обеспечивает достаточное разрешение, чтобы сделать возможным регулирование получения результата с желаемым уровнем точности. Предполагается также, что дискретизация в некотором смысле представляет основную функцию.

Битовую строку длины N можно рассматривать как целое двоичное число I, которому соответствует некоторое вещественное значение r из заданного диапазона . Это соответствие устанавливается формулой

.

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

Генетические операторы

В соответствии с техническим заданием решение задачи производится генетическим алгоритмом.

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

Задача формализуется таким образом, чтобы её решение могло быть закодировано в виде вектора («хромосомы»). Случайным образом создаётся некоторое количество начальных векторов («начальное поколение»). Они оцениваются с использованием «функции приспособленности», в результате чего каждому вектору присваивается определённое значение («приспособленность»), которое определяет вероятность выживания организма, представленного данным вектором, а также может влиять на вероятность применения к нему «генетических операторов».

Из полученного множества решений («поколения») с учётом значения «приспособленности» выбираются решения (обычно лучшие особи имеют большую вероятность быть выбранными), к которым применяются «генетические операторы» (в большинстве случаев «скрещивание» -- crossover и «мутация» -- mutation), результатом чего является получение новых решений. Для них также вычисляется значение приспособленности, и затем производится отбор («селекция») лучших решений в следующее поколение.

Этот набор действий повторяется итеративно, так моделируется «эволюционный процесс», продолжающийся несколько жизненных циклов (поколений), пока не будет выполнен критерий остановки алгоритма. Таким критерием может быть:

1. нахождение глобального, либо субоптимального решения;

2. исчерпание числа поколений, отпущенных на эволюцию;

3. исчерпание времени, отпущенного на эволюцию.

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

Создание начальной популяции

Перед первым шагом нужно случайным образом создать начальную популяцию; даже если она окажется совершенно неконкурентоспособной, генетический алгоритм все равно достаточно быстро переведет ее в жизнеспособную популяцию. Таким образом, на первом шаге можно особенно не стараться сделать слишком уж приспособленных особей, достаточно, чтобы они соответствовали формату особей популяции, и на них можно было подсчитать функцию приспособленности (Fitness). Итогом первого шага является популяция H, состоящая из N особей.

Размножение

Размножение в генетических алгоритмах обычно половое - чтобы произвести потомка, нужны несколько родителей; обычно, конечно, нужны два. Размножение в разных алгоритмах определяется по-разному - оно зависит от представления данных. Главное требование к размножению - чтобы потомок или потомки имели возможность унаследовать черты обоих родителей, «смешав» их каким-либо достаточно разумным способом. Вообще говоря, для того чтобы провести операцию размножения, нужно выбрать (1-s)p/2 пар гипотез из H и провести с ними размножение, получив по два потомка от каждой пары (если размножение определено так, чтобы давать одного потомка, нужно выбрать (1-s)p пар), и добавить этих потомков в H'. В результате H' будет состоять из N особей. Почему особи для размножения обычно выбираются из всей популяции H, а не из выживших на первом шаге элементов H0 (хотя последний вариант тоже имеет право на существование)? Дело в том, что главный бич многих генетических алгоритмов - недостаток разнообразия (diversity) в особях. Достаточно быстро выделяется один-единственный генотип, который представляет собой локальный максимум, а затем все элементы популяции проигрывают ему отбор, и вся популяция «забивается» копиями этой особи. Есть разные способы борьбы с таким нежелательным эффектом; один из них - выбор для размножения не самых приспособленных, но вообще всех особей.

Мутация

К мутациям относится все то же самое, что и к размножению: есть некоторая доля мутантов m, являющаяся параметром генетического алгоритма, и на шаге мутаций нужно выбрать mN особей, а затем изменить их в соответствии с заранее определенными операциями мутации.

Каждый бит каждой особи в популяции мутирует (точнее, пытается мутировать) с некоторой низкой вероятностью pm. Обычно мутация применяется с вероятностью меньше чем 1 %.

Мутации бывают разных видов: инверсионная, двухточечная. Инверсионная мутация интерпретируется как “зеркальное отражение“ бита (инверсия его значения, т.е. изменение его с 1 на 0 или с 0 на 1).

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

Однако в результате мутации хромосома может не измениться если вероятность мутации низкая. И хромосома останется прежней. Это приводит к замедлению поиска цели.

Высокая вероятность мутации также плохо сказывается на поиске, так как хромосома может “проскочить” нужную цель.

Поэтому вероятность устанавливается в некоторое определенное значение.

Отбор (селекция)

На этапе отбора нужно из всей популяции выбрать определенную ее долю, которая останется «в живых» на этом этапе эволюции. Есть разные способы проводить отбор. Вероятность выживания особи h должна зависеть от значения функции приспособленности Fitness(h). Сама доля выживших s обычно является параметром генетического алгоритма, и ее просто задают заранее. По итогам отбора из N особей популяции H должны остаться sN особей, которые войдут в итоговую популяцию H'. Остальные особи погибают.

Целью селекции является осуществление выборки индивидуумов в текущей популяции (т.е. из некоторого набора) пропорционально их пригодности. Обычно используют четыре различных механизма селекции “колесо рулетки”, остаточная стохастическая выборка, стохастическая равномерная выборка и турнирная селекция. Первые три алгоритма являются вариантами пропорциональной селекции, а последний непропорциональной.

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

При турнирной селекции все особи популяции разбиваются на подгруппы с последующим выбором в каждой из них особи с наилучшей приспособленностью. Различаются два способа такого выбора: детерминированный выбор и случайный выбор. Детерминированный выбор осуществляется с вероятностью, равной 1, а случайный выбор - с вероятностью, меньшей 1. Подгруппы могут иметь произвольный размер, но чаще всего популяция разделяется на подгруппы по 2-3 особи в каждой.

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

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

Существуют различные варианты алгоритмов селекции. Представленные выше методы (рулетки, турнирный и ранговый) применяются чаще всего, но существуют так называемые особые процедуры селекции: элитарная стратегия и генетический алгоритм с частичной заменой популяции.

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

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

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

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

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

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

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

Скрещивание

Наиболее простым является одноточечное скрещивание каждая выбранная таким образом пара строк скрещивается следующим образом: случайным образом выбирается положение точки сечения (целое число k в промежутке от 1 и l-1, где l длина строки). Затем, путем обмена всеми элементами между позициями k+1 и l включительно, рождаются две новых строки. Например, пусть первая особь а вторая соответственно и пусть случайно выбранная точка сечения будет после третьего гена (бита). Тогда в результате скрещивания получим две особи-потомки и . После этого потомки замещают родительские особи в промежуточной популяции . Схематично этот вариант показан на рисунке.

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

Двухточечное скрещивание иллюстрирует следующий пример:

Здесь чёрными линиями выделены точки разреза исходной хромосомы, а в данном случае битовой строки.

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

Разработка программы

Программа реализована в одном модуле: genetic.pas, текст которой приведен в приложении.

Программа состоит из нескольких процедур.

Процедура InitPop создает начальную популяцию случайным образом с помощью вспомогательной функции Flip, которая генерирует случайное число из вариантов 0 и 1. Процедура выполняется при запуске программы и вычисляет функцию пригодности. Процедуры Select, Mutation и Crossover реализуют 3 генетических оператора. Процедура Select реализует оператор турнирного отбора. Функция Select1 осуществляет отбор наилучших особей для популяции.

В функции происходит перемешивание популяции и выбор особей, которые перейдут в следующее поколение (имеющие наилучшее значение целевой функции). Выбираются две рядом стоящих особи и в следующее поколение переходит особь с наилучшим значением целевой функции. Отбор происходит PopSize раз (количество особей в популяции).

Функция Mutation реализует процесс двухточечной мутации. Мутация происходит с некоторой вероятностью. Алгоритм мутации имеет вид:

В процедуре используются следующие переменные и константы:

a - хромосома для мутации;

PMutation - вероятность мутации;

NMutation - счетчик мутаций;

d - вспомогательный бит для обмена;

jcross, jcross - номера битов для обмена.

Код процедуры:

procedure Mutation(var a: Chromosome; flchrom: integer; var NMutation: integer);

var jcross, jcross1: integer;

d: Allele;

begin

if Flip(PMutation) then

{ Мутация с вероятностью PMutation }

begin

Inc(NMutation); { Наращиваем счетчик мутаций }

{ Ищем биты для обмена }

jcross := 1 + Random(flchrom);

jcross1 := 1 + Random(flchrom);

{ Цикл до тех пор, пока не будут выбраны разные гены }

while jcross = jcross1 do

jcross1 := 1 + Random(flchrom);

{ Обмениваем }

d := a[jcross];

a[jcross] := a[jcross1];

a[jcross1] := d;

end;

end;

Однако мутация происходит только с вероятностью PMutation т.к. в природе мутации наступают не часто. Вероятность мутации в программе установлена согласно методическому пособию в 1%.

Процедура Crossover реализует оператор скрещивания. Скрещивание происходит с некоторой вероятностью PCross.

Каждая выбранная таким образом пара строк скрещивается следующим образом: если скрещивание должно произойти, то наращивается счетчик скрещиваний и потомки наследуют гены путем обмена всеми элементами. Потомки с вероятностью 50% наследуют гены либо одного, либо второго родителя.

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

Данная процедура использует следующие переменные:

parent1, parent2 - хромосомы родителей;

child1,child2 - хромосомы потомков;

flchrom - длина хромосомы (количество генов);

ncross, nmutation - счетчики количества скрещиваний и мутаций;

Код процедуры:

procedure Crossover(var Parent1, Parent2, Child1, Child2: Chromosome;

flchrom: integer; var NCross, NMutation: integer);

var j: integer;

begin

if Flip(PCross) then { Скрещивание с вероятностью PCross }

begin

Inc(NCross); { Наращиваем счетчик скрещиваний }

for j := 1 to flchrom do

begin

{ Производим скрещивание }

if Flip(0.5) then

begin

child1[j] := parent1[j];

child2[j] := parent2[j];

end

else

begin

child1[j] := parent2[j];

child2[j] := parent1[j];

end

end;

end;

{ Двухточечная мутация }

Mutation(Child1, NMutation, flchrom);

Mutation(Child2, NMutation, flchrom);

end;

Процедура Generation используется для генерации нового поколения при помощи операторов отбора, скрещивания и мутации.

Для декодирования строки битов в вещественное число используется процедура Decode.

На первом этапе обычно делается предположение, что переменные, представляющие параметры, могут быть представлены битовыми строками. Это означает, что переменные предварительно дискретизируются некоторым образом и что область дискретных значений соответствует некоторой степени 2. Например, с 20 битами на параметр мы получаем область из 220 = 1048576 дискретных значений. Если параметры непрерывны, то проблема дискретизации не заслуживает особого внимания. Разумеется, предполагается, что дискретизация обеспечивает достаточное разрешение, чтобы сделать возможным регулирование получения результата с желаемым уровнем точности. Предполагается также, что дискретизация в некотором смысле представляет основную функцию. Битовую строку длины N можно рассматривать как целое двоичное число I, которому соответствует некоторое вещественное значение r из заданного диапазона . Это соответствие устанавливается формулой

.

В нашем случае n=20.

Для получения статистических данных: минимального, максимального и среднего значений целевой функции (в программе задана в виде функции ObjFunc) используется процедура Statistics. С помощью данной процедуры находятся статистические данные. В основной программе она используется следующим образом: по всей популяции считается функция пригодности, находится максимальное и минимальное значение целевой функции а также ее среднее.

procedure Statistics(var Max, Avg, Min: double; Pop: Population);

var j :integer;

SumFitness: double;

begin

SumFitness := Pop[1].Fitness;

Min := Pop[1].Fitness;

Max := Pop[1].Fitness;

for j := 2 to PopSize do

with Pop[j] do

begin

{ Накопление суммы значений функции пригодности }

SumFitness := SumFitness + Fitness;

if Fitness>Max then Max := Fitness; {Новое значение Max}

if Fitness<Min then Min := Fitness; {Новое значение Min}

end;

Avg := SumFitness / PopSize; { Расчет среднего }

end;

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

По сравнению с предложенной программой внесены следующие изменения:

1. Изменено пространство поиска и одномерного случая на двумерный.

2. Изменены процедуры скрещивания и мутации в соответствии с вариантом.

3. Программа выполняет по 30 прогонов с целью улучшения достоверности результата.

4. Изменены целевая функция и границы поиска минимума.

Больше изменений нет.

Тестирование

В процессе тестирования программы были получены следующие результаты:

Число поколений

Размер популяции

Среднее значение минимума

Лучшее значение минимума

40

8

4.010E+0000

1.079E+0000

12

1.080E+0000

6.346E-0001

20

1.069E+0000

1.181E-0002

80

8

2.112E+0000

1.610E+0000

12

9.131E-0001

7.597E-0002

20

5.579E-0001

4.632E-0002

Выводы

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

Так, чем больше особей участвует в генетическом отборе (больший размер популяции)), тем более точный получается результат; чем большее количество поколений живут особи, тем точнее получается результат.

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

Литература

1. Змитрович А. И. Интеллектуальные информационные системы. -- Мн.:ТетраСистемс, 1997. -- 368 с.

2. Батищев Д. А. Генетические алгоритмы решения экстремальных задач. -- Воронеж:Изд.-во ВГТУ, 1995.

3. Емельянов В. В., Курейчик В. В., Курейчик В. М. Теория и практика эволюционного моделирования. -- М.:ФизМатЛит, 2003. -- 432 с.

Приложение

program Genetic;

uses Crt;

const

N = 30; { Количество прогонов }

MaxPop = 100; { Максимальное число поколений }

LenChrome = 20; { Число битов на один кодируемый параметр }

dim = 2; { Размерность пространства поиска }

P1 = 40; { Количество поколений }

P2 = 80;

S1 = 8; { Размер популяции }

S2 = 12;

S3 = 20;

PMutation = 0.01; { Вероятность скрещивания }

PCross = 0.9; { Вероятность мутации }

type

Allele = boolean; {Алель - позиция в битовой строке }

Chromosome = array [1..LenChrome * Dim] of Allele; { Битовая строка }

Fenotype = array [1..Dim] of double;

Individual = record

Chrom: Chromosome; { Генотип = битовая строка }

x: Fenotype; { Фенотип = массив вещественных координат точки в пространстве поиска }

Fitness: double; { Значение целевой функции }

end;

Population = array [1..maxpop] of Individual;

const

{массив максимальных значений для координат точки в пространстве поиска}

xMax: Fenotype = ( 2.048, 2.048);

{массив минимальных значений для координат точки в пространстве поиска}

xMin: Fenotype = (-2.048, -2.048);

var

{ Три непересекающихся популяции - старая, новая и промежуточная }

OldPop, NewPop, IntPop: Population;

{ Глобальные целые переменные}

PopSize, Gen, h, s, b: integer;

{ Счетчики мутаций, скрещиваний и количество поколений }

NMutation, NCross, NGen: integer;

{ Статистические переменные }

Avg, Min, Max, BestMin, Result, SumFitness: double;

{ Функция }

function ObjFunc(x: Fenotype): double;

begin

ObjFunc := 100 * Sqr(Sqr(x[1]) - Sqr(x[2])) + Sqr(1 - x[1]);

end;

{ Подбрасывание монетки - true если орел }

function Flip(Probability: double): boolean;

begin

Flip := Random <= Probability;

end;

{ Декодирование строки в массив вещественных координат в пространстве поиска }

procedure Decode(Chrom: Chromosome; var x: fenotype);

var i, j, f, accum: longint;

begin

for i := 1 to Dim do

begin

Accum := 0;

f := 1;

for j := 1 + LenChrome * (i - 1) to LenChrome + LenChrome * (i - 1) do

begin

if Chrom[j] then Inc(Accum, f);

f := f * 2;

end;

x[i] := xmin[i] + (xmax[i] - xmin[i]) * Accum / (f - 1);

end

end;

{ Расчет статистических величин }

procedure Statistics(var Max, Avg, Min: double; Pop: Population);

var j :integer;

SumFitness: double;

begin

SumFitness := Pop[1].Fitness;

Min := Pop[1].Fitness;

Max := Pop[1].Fitness;

for j := 2 to PopSize do

with Pop[j] do

begin

{ Накопление суммы значений функции пригодности }

SumFitness := SumFitness + Fitness;

if Fitness > Max then Max := Fitness; { Новое значение Max }

if Fitness < Min then Min := Fitness; { Новое значение Min }

end;

Avg := SumFitness / PopSize; { Расчет среднего }

end;

{ Инициализация начальной популяции случайным образом }

procedure InitPop;

var i, j: integer;

begin

for i := 1 to PopSize do

with OldPop[i] do

begin

for j := 1 to LenChrome * Dim do

Chrom[j] := Flip(0.5); { Бросок монеты }

Decode(Chrom, x); { Декодирование строки }

{ Вычисление начальных значений функции пригодности }

Fitness := ObjFunc(x);

end;

end;

{ Оператор отбора (селекции) }

procedure Select;

var ipick, i: integer;

{ Процедура перемешивания популяции в процессе отбора }

procedure Shuffle(var pop: Population);

var

i, j: integer;

ind0: Individual;

begin

for i := 1 to PopSize do

begin

j := 1 + Random(i);

{ Перемешиваем }

ind0 := pop[i];

pop[i] := pop[j];

pop[j] := ind0;

end;

end;

{ Отбор наилучших особей для популяции для перехода в следующее поколение }

function Select1: integer;

var i, j, m: integer;

begin

if ipick > PopSize then

begin

Shuffle(OldPop);

ipick := 1;

end;

i := ipick;

j := ipick + 1;

if OldPop[j].Fitness < OldPop[i].Fitness then

m := j

else

m := i;

Inc(ipick, 2);

Select1 := m;

end;

begin

ipick := 1;

for i := 1 to PopSize do

IntPop[i] := OldPop[Select1];

OldPop := IntPop;

end;

{ Оператор двухточечной мутации }

procedure Mutation(var a: Chromosome; var NMutation: integer; flchrom: integer);

var jcross, jcross1: integer;

d: Allele;

begin

if Flip(PMutation) then { Мутация с вероятностью PMutation }

begin

Inc(NMutation); { Наращиваем счетчик мутаций }

{ Ищем биты для обмена }

jcross := 1 + Random(flchrom);

jcross1 := 1 + Random(flchrom);

{ Цикл, пока точки обмена не будут разными }

while jcross = jcross1 do

jcross1 := 1 + Random(flchrom);

{ Обмениваем }

d := a[jcross];

a[jcross] := a[jcross1];

a[jcross1] := d;

end;

end;

{ Оператор равномерного скрещивания }

procedure Crossover(var Parent1, Parent2, Child1, Child2: Chromosome;

flchrom: integer; var NCross, NMutation: integer);

var j: integer;

begin

if Flip(PCross) then { Скрещивание с вероятностью PCross }

begin

Inc(NCross); { Наращиваем счетчик скрещиваний }

for j := 1 to flchrom do

begin

{ Производим скрещивание }

if Flip(0.5) then

begin

child1[j] := parent1[j];

child2[j] := parent2[j];

end

else

begin

child1[j] := parent2[j];

child2[j] := parent1[j];

end

end;

end;

{ Двухточечная мутация }

Mutation(Child1, NMutation, flchrom);

Mutation(Child2, NMutation, flchrom);

end;

{ Генерирование нового поколения при помощи отбора, скрещивания и мутации }

{ Предполагается, что популяция имеет четный размер }

procedure Generation;

var i: integer;

begin

Select;

i := 1;

repeat

{ Выполняются отбор, скрещивание и мутация пока полностью не

сформируется новая популяция newpop }

{ Скрещивание и мутация - мутация вставлена в процедуру скрещивания }

Crossover(OldPop[i].Chrom, OldPop[i + 1].Chrom,

NewPop[i].Chrom, NewPop[i + 1].Chrom,

LenChrome * Dim, NCross, NMutation);

{ Декодирование строки и вычисление пригодности }

with NewPop[i] do

begin

Decode(Chrom, x);

Fitness := ObjFunc(x);

end;

with Newpop[i + 1] do

begin

Decode(Chrom, x);

Fitness := ObjFunc(x);

end;

Inc(i, 2);

until i > PopSize;

end;

begin

ClrScr; { Очистка экрана }

Randomize; { Инициализация генератора случайных чисел }

for h := 1 to 2 do { Цикл выбора количества поколений }

begin

If h = 1 then NGen := P1; { Количество поколений }

If h = 2 then NGen := P2;

for s := 1 to 3 do { Цикл выбора размера популяции }

begin

If s = 1 then PopSize := S1; { Размеры популяций }

If s = 2 then PopSize := S2;

If s = 3 then PopSize := S3;

Result := 0; { Инициализация переменной ответа }

for b := 1 to N do { Прогоняется N раз для повышения достоверности }

begin

NMutation := 0; { Инициализация счетчика мутация }

NCross := 0; { Инициализация счетчика скрещиваний }

InitPop; { Создание начальной популяции }

Statistics(Max, Avg, Min, OldPop);

BestMin := Min;

Gen := 1; { Установка счетчика поколений в 0 }

repeat { Главный итерационный цикл }

Generation;

Statistics(Max, Avg, Min, NewPop);

if Min < BestMin then BestMin := Min;

OldPop := NewPop;

{переход на новое поколение }

Inc(Gen);

until Gen > PopSize;

Result := Result + Min;

end;

Writeln('Количество поколений -', NGen);

Result := Result / N; { Находим среднее значение ответа }

WriteLn('Размер популяции, особей - ', PopSize);

WriteLn('Средний минимум вещественной функции = ', Result: 12);

WriteLn('Лучший минимум вещественной функции = ', BestMin: 12);

end; { Цикл выбора количества популяций }

end; { Цикл выбора количества поколений }

Write('Для завершения программы нажмите любую клавишу');

ReadKey;

End.

Размещено на Allbest.ru


Подобные документы

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

    курсовая работа [39,3 K], добавлен 29.10.2012

  • Постановка задачи и ее формализация. Поиск значений интерполяционного многочлена в точках x1 и x2. Поиск минимума функции F(x) на отрезке [a;b]. Проверка условий сходимости методов. Тестирование программных модулей. Детализированная схема алгоритма.

    курсовая работа [893,0 K], добавлен 04.02.2011

  • Основные определения поиска подстроки в строке. Простейшие алгоритмы поиска подстроки в строке. Алгоритмы последовательного поиска и Рабина-Карпа, создание и описание программы, реализующей их. Порядок работы с приложением. Тестирование алгоритмов.

    курсовая работа [2,7 M], добавлен 24.05.2012

  • Составление программы для вычисления по двум формулам одной и той же переменной "X". Создание программы, которая по введенному значению аргумента вычислят значение функции, заданной в виде графика. Вывод на экран значения функции, заданной графически.

    курсовая работа [4,9 M], добавлен 14.03.2014

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

    отчет по практике [725,6 K], добавлен 01.10.2013

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

    курсовая работа [527,0 K], добавлен 15.01.2010

  • Основные генетические операторы. Схема функционирования генетического алгоритма. Задачи, решаемые с помощью генетических алгоритмов. Математическая постановка задачи оптимизации. Решение Диофантова уравнения. Программная реализация. Создание пособия.

    курсовая работа [391,4 K], добавлен 20.02.2008

  • Численные методы в задачах без ограничений. Схема методов спуска. Среда редактора Visual Basic. Использование объектов ActiveX в формах. Блок-схема алгоритма моделирования. Задачи оптимизирования детерменированных функций с единственной точкой экстремума.

    курсовая работа [129,5 K], добавлен 26.04.2010

  • Исследование функции в математическом анализе, её свойства, экстремумы и точки перегиба. Понятие о повторных пределах. Дифференцирование функции двух переменных, построение графика. Инструментальная среда MathCAD как средство исследования функции.

    дипломная работа [2,5 M], добавлен 19.11.2012

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

    курсовая работа [398,5 K], добавлен 25.01.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.