在看进化算法的时候,看到一个东东,就是要根据轮盘赌法,选择可以交配的个体
它的代码是这样的
/** 在计算完种群适应度之后,我们需要使用转盘赌法选取可以产生下一代的个体,这里有个条件就是只有个人的适应度不小于平均适应度才会长生下一代(适者生存) */ private Chromosome getParentChromosome() { double slice = Math.random() * totalScore; double sum = 0; for (Chromosome chro : population) { sum += chro.getScore(); // 转到对应的位置并且适应度不小于平均适应度 if (sum > slice && chro.getScore() >= averageScore) { return chro; } } return null; }
其中slice是一个随机数,由于Math.random 的范围在0.0~1.0的闭区间,设想每个个体的score是1,有10个个体,totalScore=10,所以 slice的值最终在[0,10]
第一次for循环, sum+=chro.getScore 之后等于1,假设slice=5,这时候if中的条件
sum > slice && chro.getScore() >= averageScore
1>5 && 1>=1
不成立,直到sum=5的时候,才能通过。
当然这是score都为1的,易于理解的设想。可以理解,如果某个个体的分数比较高,那么它更容易通过if条件,这就是轮盘赌算法的本质:自己的分数与被选择的概率成正比