Реализация выбора колеса рулетки
Я кодирую генетический алгоритм с нуля в C, я застрял в реализации колеса рулетки, вот как я его кодирую:
void selection(Chromosome * chromosome){
double totalFitness=0;
double totalProbability=0;
double probability=0;
double rndNumber;
double min,max;
int i;
min=0.0;
max=1.0;
for(i=0;i<POPULATION_SIZE;i++){
totalFitness += chromosome[i].fitness;
}
for(i=0;i<POPULATION_SIZE;i++){
chromosome[i].probability = (chromosome[i].fitness)/totalFitness;
printf("Chromosome %d with probability %f\n",i, chromosome[i].probability);
}
srand((unsigned)time(NULL));
for(i=0;i<POPULATION_SIZE;i++){
rndNumber = ((double)rand()/(double)RAND_MAX);
if(chromosome[i].probability >= rndNumber){
printf("Chromosome %d selected \n",i);
}}}
Выходные данные возвращают одну выбранную хромосому или ее отсутствие, что не является ожидаемым результатом. Я удивляюсь, если это правильный способ расставить все точки?
Заранее спасибо.
1 ответ
Решение
Когда вы выбираете хромосому, вы должны определить случайное число только один раз, а затем накопить смещение, чтобы рассмотреть все диапазоны:
| random number
|
X
+--------------+-----+----+--+--++---+-----+
| | | | | || | |
+--------------+-----+----+--+--++---+-----+
0.0 p0 p0+p1 1.0 == sum(p[i])
В коде:
double rndNumber = rand() / (double) RAND_MAX;
double offset = 0.0;
int pick = 0;
for (i = 0; i < POPULATION_SIZE; i++) {
offset += chromosome[i].probability;
if (rndNumber < offset) {
pick = i;
break;
}
}
printf("Chromosome %d selected.\n", pick);