Реферат: Генетические алгоритмы и их практическое применение

parent2 = GetIndex((float)(rand() % 101));

if (++iterations > (MAXPOP * MAXPOP)) break;

}

temppop[i] = Breed(parent1, parent2); // Create a child.

}

for(i=0;i<MAXPOP;i++) population[i] = temppop[i];

}

Итак, первым делом мы создаем случайную популяцию генов. Затем делаем цикл по всем генам. Выбирая гены, мы не хотим, чтобы они оказались одинаковы (ни к чему скрещиваться с самим собой, и вообще - нам не нужны одинаковые гены (operator = в gene). При выборе родителя, генерируем случайное число, а затем вызываем GetIndex. GetIndex использует идею кумулятивности вероятностей (likelihoods), она просто делает итерации по всем генам, пока не найден ген, содержащий число:

int CDiophantine::GetIndex(float val) {

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;

}

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

gene CDiophantine::Breed(int p1, int p2) {

int crossover = rand() % 3+1;

int first = rand() % 100;

gene child = population[p1];

int initial = 0, final = 3;

if (first < 50) initial = crossover;

else final = crossover+1;

for(int i=initial;i<final;i++) {

child.alleles[i] = population[p2].alleles[i];

if (rand() % 101 < 5) child.alleles[i] = rand() % (result + 1);

}

return child;

К-во Просмотров: 508
Бесплатно скачать Реферат: Генетические алгоритмы и их практическое применение