Генетические алгоритмы в задаче оптимизации действительных параметров
Понятие эволюции - процесса оптимизации всех живых организмов. Генетический алгоритм как простая модель эволюции в природе, реализованная в виде компьютерной программы. Характерная структура хромосомы. Функция Fitness, Likelihood, Breeding, Solve, Main.
Рубрика | Биология и естествознание |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 28.04.2011 |
Размер файла | 111,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
{
if (last <= val && val <= population[i].likelihood) return i;
else last = population[i].likelihood;
}
return 4;
}
Возвращаясь к функции CreateNewPopulation(): если число итераций превосходит MAXPOP, она выберет любых родителей. После того, как родители выбраны, они скрещиваются: их индексы передаются вверх на функцию размножения (Breed). Breed function возвращает ген, который помещается во временную популяцию. Вот код:
gene CDiophantine::Breed(int p1, int p2)
{
int crossover = rand() % 3+1; //Число от 1 до 3 - генерируем точку кроссовера.
int first = rand() % 100; // Какой родитель будет первым ?
gene child = population[p1]; // Инициализировать ребенка первым родителем
int initial = 0, final = 4;
if (first < 50) initial = crossover;
// Если первый родитель р1(вероятность этого 50%) -
// начинаем с точки кроссовера
else final = crossover; // Иначе - заканчиваем на точке кроссовера
for(int i=initial;i<final;i++)
{ // Кроссовер
child.alleles[i] = population[p2].alleles[i];
if (rand() % 101 < 5) child.alleles[i] = rand() % (result + 1);
// 5% - мутация
}
return child; // Возвращаем ребенка
}
void CDiophantine::CreateNewPopulation() {
gene temppop[MAXPOP];
for(int i=0;i<MAXPOP;i++)
{
int parent1 = 0,parent2 = 0, iterations = 0;
while(parent1 == parent2 || population[parent1] == population[parent2])
{
parent1 = GetIndex((float)(rand() % 101));
parent2 = GetIndex((float)(rand() % 101));
if (++iterations > MAXPOP) break; // В этом случае родителей выбираем случайно
}
temppop[i] = Breed(parent1, parent2); // Процесс размножения
}
for(i=0;i<MAXPOP;i++)
population[i] = temppop[i];
}
В конце концов мы определим точку кросс-овера. Заметим, что мы нехотим, чтобы кросс-овер состоял из копирования только одного родителя. Сгенерируем случайное число, которое определит наш кроссовер. Остальное понятно и очевидно. Добавлена маленькая мутация, влияющая на скрещивание. 5% - вероятность появления нового числа.
5.5 Функция Solve
Теперь уже можно взглянуть на функцию Solve(). Она всего лишь итеративно вызывает вышеописанные функции. Заметим, что мы присутствует проверка: удалось ли функции получить результат, используя начальную популяцию. Это маловероятно, однако лучше проверить.
int CDiophantine::Solve()
{
int fitness = -1;
// Создаем начальную популяцию
srand((unsigned)time(NULL));
for(int i=0;i<MAXPOP;i++)
{ // Аллели хромосом заполняем произвольными числами от 0 до result
for (int j=0;j<4;j++)
{
population[i].alleles[j] = rand() % (result + 1);
}
}
if (fitness = CreateFitnesses())
{
return fitness;
}
int iterations = 0;
while (fitness != 0 || iterations < 50)
{ // Считаем до тех пор пока решение не будет найдено или к-во итераций более 50
GenerateLikelihoods();
CreateNewPopulation();
if (fitness = CreateFitnesses())
{
printf("iterations %d \n",iterations);
return fitness;
}
iterations++;
}
return -1;
}
5.6 Функция Main
Рассмотрим код главной функции:
#include <iostream.h>
#include <conio.h>
#include "diophantine.h"
void main() {
CDiophantine dp(1,2,3,4,30);
int ans;
ans = dp.Solve();
if (ans == -1) {
cout << "Solution not found." << endl;
} else {
gene gn = dp.GetGene(ans);
cout << "The solution set to a+2b+3c+4d=30 is:\n";
cout << "a = " << gn.alleles[0] << "." << endl;
cout << "b = " << gn.alleles[1] << "." << endl;
cout << "c = " << gn.alleles[2] << "." << endl;
cout << "d = " << gn.alleles[3] << "." << endl;
} getch();
}
Заключение
Изложенный подход является эвристическим, т. е. показывает хорошие результаты на практике, но плохо поддается теоретическому исследованию и обоснованию. Естественно задать вопрос -- следует ли пользоваться такими алгоритмами, не имеющими строгого математического обоснования? Как и в вопросе о нейронных сетях, здесь нельзя ответить однозначно. С одной стороны, в математике существует достаточно большой класс абсолютно надежных (в смысле гарантии получения точного решения) методов решения различных задач. С другой стороны, речь идет о действительно сложных практических задачах, в которых эти надежные методы часто неприменимы. Нередко эти задачи выглядят настолько необозримыми, что не предпринимается даже попыток их осмысленного решения. Например, фирма, занимающаяся транспортными перевозками, в современных условиях российского бизнеса скорее предпочтет нанять лишних водителей и повысить цены на свои услуги, чем оптимизировать маршруты и расписания поездок. На западном рынке, где уже давно действуют законы более или менее честной конкуренции, оптимальность деятельности компании значительно влияет на ее доходы и даже может стать решающим фактором для ее выживания. Поэтому любые идеи, позволяющие компании стать «умнее» своих конкурентов, находят там широкое применение. Генетические алгоритмы -- реализация одной из наиболее популярных идей такого рода. Эта популярность вызвана, по-видимому, исключительной красотой подхода и его близостью к природному механизму. Подобным образом популярность нейросетевой технологии подогревается во многом ее сходством с работой мозга. По-настоящему активное развитие эвристических подходов, как мы видим, непосредственно связано с развитием свободного рынка и экономики в целом.
Список использованной литературы
Кантор И.А.(перевод) Введение в ГА и Генетическое Программирование -http://www. algolist.manual.ru
Скурихин А.Н. Генетические алгоритмы . Новости искусственного интеллекта - 1995, №4, с. 6-46.
Хэзфилд Р. , Кирби Л. Искусство программирования на C - К .:DIAsoft ,2001.
Поспелов Д.А. Информатика. Энциклопедический словарь для начинающих - М:Педагогика-Пресс, 1994, - 350 с.
Курс лекций по предмету "Основы проектирования систем с искусственным интеллектом" / Сост. Сотник С.Л. -URL:http://www.neuropower.de
Кузнецов О.П. О некомпьютерных подходах к моделированию интеллектуальных процессов мозга - Москва, Институт проблем управления РАН
Самоорганизующиеся нейронные сети и их применение - URL:http://www.chat.ru/~neurolab
Редько В.Г. Курс лекций "Эволюционная кибернетика" - URL:http://inet.keldysh.ru/BioCyber/Lectures.html
Головко В.А. Нейроинтеллект: Теория и применения Книга 1 Организация и обучение нейронных сетей с прямыми и обратными связями - Брест:БПИ, 1999, - 260 с.
Головко В.А. Нейроинтеллект: Теория и применения Книга 2 Самоорганизация, отказоустойчивость и применение нейронных сетей - Брест:БПИ, 1999, - 228 с.
А.Н. Генетические алгоритмы . Новости искусственного интеллекта - 1995, №4, с. 6-46.
С.А. Исаев Генетические алгоритмы - эволюционные методы поиска -URL: http://rv.ryazan.ru/~bug/library/ai/isaev/2/part1.html
Д.И. Батищев, С.А. Исаев Оптимизация многоэкстремальных функций с помощью генетических алгоритмов -URL:http://bspu.secna.ru/Docs/~saisa/ga/summer97.html
Group Method of Data Handling - URL: http://www.inf.kiev.ua/GMDH-home
Береснев В. Л., Гимади Э. Х., Дементьев В. Т. Экстремальные задачи стандартизации.- Новосибирск: Наука, 1978.
Гэри В., Джонсон Д. Вычислительные машины и труднорешаемые задачи.- М.: Мир, 1982.
Лима-ле-Фариа А. Эволюция без отбора: Автоэволюция формы и функции.- Москва, "Мир", 1991.
Приложение А
Текст main.cpp
#include <iostream.h>
#include <conio.h>
#include "diophantine.h"
#define MAXPOP 25
void main() {
CDiophantine dp(1,2,3,4,30);
int ans;
ans = dp.Solve();
if (ans == -1) {
cout << "Solution not found." << endl;
} else {
gene gn = dp.GetGene(ans);
cout << "The solution set to a+2b+3c+4d=30 is:\n";
cout << "a = " << gn.alleles[0] << "." << endl;
cout << "b = " << gn.alleles[1] << "." << endl;
cout << "c = " << gn.alleles[2] << "." << endl;
cout << "d = " << gn.alleles[3] << "." << endl;
} getch();
}
Приложение Б
Текст Diophantine.h
#include <stdlib.h>
#include <time.h>
#include<stdio.h>
//#define MAXPOP 25
struct gene
{
int alleles[4];
int fitness;
float likelihood;
// Тест на равенство
operator==(gene gn)
{
for (int i=0;i<4;i++)
{
if (gn.alleles[i] != alleles[i]) return false;
}
return true;
}
};
class CDiophantine
{
public:
CDiophantine(int, int, int, int, int); // Конструктор с коэффициентами при а,b,c,d
int Solve(); // Вычисляет решение уравнения
gene GetGene(int i)
{ return population[i];}
protected:
int ca,cb,cc,cd; // Коэффициенты при а,b,c,d
int result;
gene population[MAXPOP]; // Массив из генов - популяция
int Fitness(gene &); // Функция приспособленности
void GenerateLikelihoods(); // Вычисляет вероятности воспроизведения
float MultInv();
int CreateFitnesses();
void CreateNewPopulation();
int GetIndex(float val);
gene Breed(int p1, int p2);
};
CDiophantine::CDiophantine(int a, int b, int c, int d, int res) : ca(a), cb(b), cc(c), cd(d), result(res) {}
int CDiophantine::Solve()
{
int fitness = -1;
// Создаем начальную популяцию
srand((unsigned)time(NULL));
for(int i=0;i<MAXPOP;i++)
{ // Аллели хромосом заполняем
// произвольными числами от 0 до result
for (int j=0;j<4;j++)
{
population[i].alleles[j] = rand() % (result + 1);
}
}
if (fitness = CreateFitnesses())
{
return fitness;
}
int iterations = 0;
while (fitness != 0 || iterations < 50)
{ // Считаем до тех пор пока решение
// не будет найдено или к-во итераций более 50
GenerateLikelihoods();
CreateNewPopulation();
if (fitness = CreateFitnesses())
{
printf("iterations %d \n",iterations);
return fitness;
}
iterations++;
}
return -1;
}
int CDiophantine::Fitness(gene &gn) // Вычисляет коэффициет
// приспособленности для данного гена
{
int total = ca * gn.alleles[0] + cb * gn.alleles[1] + cc * gn.alleles[2] + cd * gn.alleles[3];
return gn.fitness = abs(total - result);
}
int CDiophantine::CreateFitnesses() // Возвращает номер гена в популяции ,
{ // кот. явл. решением данного ур-я
float avgfit = 0;
int fitness = 0;
for(int i=0;i<MAXPOP;i++)
{
fitness = Fitness(population[i]);
// avgfit += fitness;
if (fitness == 0)
{
return i;
}
}
return 0; //Возвращает 0 ,если среди генов данной
// популяции не нашлось решения
}
float CDiophantine::MultInv()
{
float sum = 0;
for(int i=0;i<MAXPOP;i++)
{
sum += 1/((float)population[i].fitness);
}
return sum; //Сумма обратных коэффициентов
// приспособленности всех генов в популяции
}
void CDiophantine::GenerateLikelihoods() //Генерирует вероятности воспроизведения
{
float multinv = MultInv();
float last = 0;
for(int i=0;i<MAXPOP;i++)
{
population[i].likelihood = last = last + ((1/((float)population[i].fitness) / multinv) * 100);
}
}
int CDiophantine::GetIndex(float val) // По данному числу от 0 до 100 возвращает
{ // номер необходимого гена в популяции
float last = 0;
for(int i=0;i<MAXPOP;i++)
{
if (last <= val && val <= population[i].likelihood) return i;
else last = population[i].likelihood;
}
return 4;
}
gene CDiophantine::Breed(int p1, int p2)
{
int crossover = rand() % 3+1; // Число от 1 до 3 - генерируем точку кроссовера.
int first = rand() % 100; // Какой родитель будет первым ?
gene child = population[p1]; // Инициализировать ребенка первым родителем
int initial = 0, final = 4;
if (first < 50) initial = crossover; // Если первый родитель р1(вероятность этого 50%) -
// начинаем с точки кроссовера
else final = crossover; // Иначе - заканчиваем на точке кроссовера
for(int i=initial;i<final;i++)
{ // Кроссовер
child.alleles[i] = population[p2].alleles[i];
if (rand() % 101 < 5) child.alleles[i] = rand() % (result + 1);// 5% - мутация
}
return child; // Возвращаем ребенка
}
void CDiophantine::CreateNewPopulation() {
gene temppop[MAXPOP];
for(int i=0;i<MAXPOP;i++)
{
int parent1 = 0,parent2 = 0, iterations = 0;
while(parent1 == parent2 || population[parent1] == population[parent2])
{
parent1 = GetIndex((float)(rand() % 101));
parent2 = GetIndex((float)(rand() % 101));
if (++iterations > MAXPOP) break; // В этом случае
// родителей выбираем случайно
}
temppop[i] = Breed(parent1, parent2); // Процесс размножения
}
for(i=0;i<MAXPOP;i++)
population[i] = temppop[i];
}
Размещено на Allbest.ru
Подобные документы
Определенная (ненаследственная) и неопределенная (наследственная) изменчивость. Генетические различия между особями. Мутации как элементарный эволюционный материал. Роль мутантных изменений в эволюции организмов. Категории гомологической изменчивости.
презентация [503,0 K], добавлен 15.12.2013Главная особенность организации живых материй. Процесс эволюции живых и неживых систем. Законы, лежащие в основе возникновения всех форм жизни по Дарвину. Молекулярно-генетический уровень живых организмов. Прогрессия размножения, естестенный отбор.
реферат [15,0 K], добавлен 24.04.2015Первая классификация живых организмов, предложенная Карлом Линнеем. Три этапа Великих биологических объединений. Концепция эволюции органического мира Жан-Батиста Ламарка. Основные предпосылки возникновения теории Дарвина. Понятие естественного отбора.
реферат [762,6 K], добавлен 06.09.2013Объекты биологического познания и структура биологических наук. Гипотезы возникновения жизни и генетического кода. Концепции начала и эволюции жизни. Системная иерархия организации живых организмов и их сообществ. Экология и взаимоотношения живых существ.
реферат [52,9 K], добавлен 07.01.2010Совокупность всех живых организмов Земли. Восстановительный, слабоокислительный и окислительный этапы в эволюции биосферы. Выход жизни на сушу, вымирание динозавров, появление гоминид. Появление человека, овладение огнем и появление цивилизации.
реферат [77,5 K], добавлен 01.02.2013Понятие и принцип работы генетического алгоритма. Вычисление функций приспособленности для особей популяции. Модель "эволюционного процесса". Основные операции генетических алгоритмов. Восстановление генов, выпавших из популяции в ходе операции выбора.
презентация [8,4 M], добавлен 25.06.2013Выявление и общая характеристика движущих сил биологической эволюции как необратимого процесса исторического развития органического мира. Ч. Дарвин и теории приспособления и изменения генетического состава организмов. Анализ значения факторов эволюции.
реферат [12,3 K], добавлен 20.01.2012Основные положения теории эволюции Ж.-Б. Ламарка и Ч. Дарвина. Неоламаркизм: сторонники автогенетических концепций. Синтетическая теория эволюции. Экологические и генетические основы эволюции. Естественный отбор, формы и способы видообразования.
реферат [54,1 K], добавлен 12.02.2011Методы изучения эволюционного процесса: палеонтологические, биогеографические, морфологические, эмбриологические, генетические, биохимические и паразитологические. Введение исследователями Цукер-Кандлем и Поллингом понятия "молекулярных часов эволюции".
презентация [2,5 M], добавлен 21.02.2014Понятие биосферы, ее сущность и особенности, состав и элементы. Истрии я возникновения и формирования сообществ живых организмов, путь их становления и эволюции. Понятие биогеоценоза, его структура, отличия от биоценоза. Факторы среды и их интенсивность.
реферат [2,0 M], добавлен 09.02.2009