Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Генетический алгоритм C++ в C#

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Генетический алгоритм C++ в C#
Имя
Сообщение << Старые топики   Новые топики >>
Генетический алгоритм C++ в C# - 2012-01-11 22:26:15.176666   
Aksiom

Сообщений: 12
Оценки: 0
Присоединился: 2011-11-23 23:12:25.660000
Стали интересны генетические алгоритмы, но на C# пока не встречал простых примеров, чтобы разобраться в сути. Нашёл простой пример для C++ , но как оказалось сам не в состоянии его перевести. Поммогите перевести вот этот код на C#, спасибо!

#include &lt;iostream&gt; // для cout и т.п. #include &lt;vector&gt; // для класса vector #include &lt;string&gt; // для класса string #include &lt;algorithm&gt; // для алгоритма сортировки #include &lt;time.h&gt; // для случайных величин #include &lt;math.h&gt; // для 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&lt;ga_struct&gt; ga_vector; // для краткости void init_population(ga_vector &population, ga_vector &buffer ) { int tsize = GA_TARGET.size(); for (int i=0; i&lt;GA_POPSIZE; i++) { ga_struct citizen; citizen.fitness = 0; citizen.str.erase(); for (int j=0; j&lt;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&lt;GA_POPSIZE; i++) { fitness = 0; for (int j=0; j&lt;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 &lt; 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&lt;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&lt;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() &lt; GA_MUTATION) mutate(buffer[i]); } } inline void print_best(ga_vector &gav) { cout &lt;&lt; "Best: " &lt;&lt; gav[0].str &lt;&lt; " (" &lt;&lt; gav[0].fitness &lt;&lt; ")" &lt;&lt; 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&lt;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; } Код не мой, взят с Хабра.
Post #: 1
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Генетический алгоритм C++ в C#







Связаться:
Вопросы по сайту / xakep@glc.ru

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