Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2011, 17:51   #1
air_05
Новичок
Джуниор
 
Регистрация: 26.10.2011
Сообщений: 5
По умолчанию Генетический алгоритм, есть большой вопрос

вопрос по генетическому алгоритму,
объясните пожалуйста, данную программу, что делает на каждом шагу.
заранее спасибо
air_05 вне форума Ответить с цитированием
Старый 26.10.2011, 17:55   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Простите, "данную" - это какую?
Abstraction вне форума Ответить с цитированием
Старый 26.10.2011, 18:01   #3
air_05
Новичок
Джуниор
 
Регистрация: 26.10.2011
Сообщений: 5
По умолчанию

прога с дублирована с соседней темы.
нужно, работа - горит. просто объяснить, как и что делают, функции, как вычитается пригодность популяции.

Код:
#include <iostream>					// для cout и т.п.
#include <vector>					// для класса vector
#include <string>					// для класса string
#include <algorithm>					// для алгоритма сортировки
#include <time.h>					// для случайных величин
#include <math.h>					// для abs()

#define GA_POPSIZE		2048		// размер популяции
#define GA_MAXITER		16384		// максимальное число итераций
#define GA_ELITRATE		0.10f		// элитарность
#define GA_MUTATIONRATE	0.25f			// мутации
#define GA_MUTATION		RAND_MAX * GA_MUTATIONRATE
#define GA_TARGET		std::string("Hello world!")

using namespace std;				

struct ga_struct 
{
	string str;						// строка
	unsigned int fitness;					// пригодность
};

typedef vector<ga_struct> ga_vector;			// для краткости

void init_population(ga_vector &population,
					 ga_vector &buffer ) 
{
	int tsize = GA_TARGET.size();

	for (int i=0; i<GA_POPSIZE; i++) {
		ga_struct citizen;
		
		citizen.fitness = 0;
		citizen.str.erase();

		for (int j=0; j<tsize; j++)
			citizen.str += (rand() % 90) + 32;

		population.push_back(citizen);
	}

	buffer.resize(GA_POPSIZE);
}

void calc_fitness(ga_vector &population)
{
	string target = GA_TARGET;
	int tsize = target.size();
	unsigned int fitness;

	for (int i=0; i<GA_POPSIZE; i++) {
		fitness = 0;
		for (int j=0; j<tsize; j++) {
			fitness += abs(int(population[i].str[j] - target[j]));
		}
		
		population[i].fitness = fitness;
	}
}

bool fitness_sort(ga_struct x, ga_struct y) 
{ return (x.fitness < y.fitness); }

inline void sort_by_fitness(ga_vector &population)
{ sort(population.begin(), population.end(), fitness_sort); }

void elitism(ga_vector &population, 
				ga_vector &buffer, int esize )
{
	for (int i=0; i<esize; i++) {
		buffer[i].str = population[i].str;
		buffer[i].fitness = population[i].fitness;
	}
}

void mutate(ga_struct &member)
{
	int tsize = GA_TARGET.size();
	int ipos = rand() % tsize;
	int delta = (rand() % 90) + 32; 

	member.str[ipos] = ((member.str[ipos] + delta) % 122);
}

void mate(ga_vector &population, ga_vector &buffer)
{
	int esize = GA_POPSIZE * GA_ELITRATE;
	int tsize = GA_TARGET.size(), spos, i1, i2;

	elitism(population, buffer, esize);

	// Mate the rest
	for (int i=esize; i<GA_POPSIZE; i++) {
		i1 = rand() % (GA_POPSIZE / 2);
		i2 = rand() % (GA_POPSIZE / 2);
		spos = rand() % tsize;

		buffer[i].str = population[i1].str.substr(0, spos) + 
			            population[i2].str.substr(spos, esize - spos);

		if (rand() < GA_MUTATION) mutate(buffer[i]);
	}
}

inline void print_best(ga_vector &gav)
{ cout << "Best: " << gav[0].str << " (" << gav[0].fitness << ")" << endl; }

inline void swap(ga_vector *&population,
				 ga_vector *&buffer)
{ ga_vector *temp = population; population = buffer; buffer = temp; }

int main()
{
	srand(unsigned(time(NULL)));

	ga_vector pop_alpha, pop_beta;
	ga_vector *population, *buffer;

	init_population(pop_alpha, pop_beta);
	population = &pop_alpha;
	buffer = &pop_beta;

	for (int i=0; i<GA_MAXITER; i++) {
		calc_fitness(*population);		// вычисляем пригодность
		sort_by_fitness(*population);		// сортируем популяцию
		print_best(*population);		// выводим лучшую популяцию

		if ((*population)[0].fitness == 0) break;

		mate(*population, *buffer);		// спариваем популяции
		swap(population, buffer);		// очищаем буферы
	}

	return 0;
}

Последний раз редактировалось air_05; 26.10.2011 в 18:11.
air_05 вне форума Ответить с цитированием
Старый 26.10.2011, 18:05   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Пригодность считается calc_fitness(ga_vector &population).
В ней для каждого элемента генома каждой особи популяции считается модуль разности с соответствующим элементом цели отбора. Сумма модулей - показатель пригодности (чем больше, тем особь хуже).
Abstraction вне форума Ответить с цитированием
Старый 26.10.2011, 18:08   #5
air_05
Новичок
Джуниор
 
Регистрация: 26.10.2011
Сообщений: 5
По умолчанию

теперь можно узнать по частям проги,
что делает этот кусок программы
Код:
void init_population(ga_vector &population,
ga_vector &buffer )
{
int tsize = GA_TARGET.size();

for (int i=0; i<GA_POPSIZE; i++) {
ga_struct citizen;

citizen.fitness = 0;
citizen.str.erase();

for (int j=0; j<tsize; j++)
citizen.str += (rand() % 90) + 32;

population.push_back(citizen);
}

buffer.resize(GA_POPSIZE);
}

Последний раз редактировалось air_05; 26.10.2011 в 18:12.
air_05 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не большой вопрос ziganurov2011 Паскаль, Turbo Pascal, PascalABC.NET 8 22.07.2011 22:31
задача за деньги (генетический алгоритм с++) Москва pametol Фриланс 3 18.06.2011 16:14
Генетический Алгоритм rust09reg91 Общие вопросы Delphi 2 03.04.2011 16:03
Очень БОЛЬШОЙ вопрос про кодировки в базе Tanuska___:) БД в Delphi 3 02.05.2008 05:36