【问题标题】:Implementation of Roulette wheel Selection轮盘选择的实现
【发布时间】:2014-08-27 20:22:56
【问题描述】:

我正在用 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);




}}}

输出返回一个或没有选择的染色体,这不是预期的结果。我想知道这是否是正确的点缀方式??

提前致谢。

【问题讨论】:

  • 你的输入数据是什么?在您的方法中实际考虑的唯一值是每个染色体的适应度。
  • Chromosome 是我定义的一个结构体,它包含:基因数组、适应度和概率。

标签: c genetic-algorithm roulette-wheel-selection


【解决方案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);

【讨论】:

  • 我现在知道了,谢谢,但是我不明白如果我在迭代中只选择一个染色体,我该如何选择其他父母?
  • 恐怕我帮不了你。我不熟悉遗传算法,您显示的代码中没有父母或亲子结构。我刚刚查看了您的代码,并假设您想根据概率选择一条染色体。
  • 你需要重复这个过程来选择每个父节点,所以这可能意味着每次交叉调用选择方法两次,但对于突变只调用一次。
猜你喜欢
  • 2018-07-04
  • 2012-06-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 2010-09-22
  • 2020-08-06
  • 2012-05-06
相关资源
最近更新 更多