这样select `parent` 像`赌博轮盘赌` 可行吗?

Is this way to select `parent` like `gambling roulette ` workable?

我想到使用 随机数 到 select parents 就像 gambling roulette 也许 workalbe.Let 我解释一下使用find the max value of function中的示例。示例如下所示:

我的想法是

select得到XjXk的几率是g(Xj)*g(Xk)/n^2,和gambling roulette类似。考虑到两个几率的分母都是常数值,它们在某种程度上是相等的。

            double randomNumToJudge=Math.random();//generate a random number to judge with the fitness 
            int randomMother=(int)(Math.random()*1000);
            int randomFather=(int)(Math.random()*1000);//random generate parents
            if((randomNumToJudge<=individualArray[generation][randomFather].fitnessValue)
            &&(randomNumToJudge<=individualArray[generation][randomMother].fitnessValue))
            //if the number is less than both fitness of parents,they are permited to reproduce.
            {
                Individual childIndividual=individualArray[generation][randomFather].crossOverAndMutate(individualArray[generation][randomFather], individualArray[generation][randomMother]);
                //Crossover and mutate and generate child individual
                individualArray[generation+1][counter]=childIndividual;//add childIndividual to tha Array.
                counter++;//the count of individual number in child generation
            }

我这样测试在一个java code.The函数中是x + 10sin(5x) + 7cos(4x), x∈[0,10)。我生成100代,一个代中的个体数是1000。

结果正确。

在某次执行中,第100代,我发现最好的个体是7.856744175554171,最好的函数值是24.855362868957645。 我测试了10个times.Every结果在第100代精确到小数点后10位

那么这种方式可行吗?这种方式是否已经被其他人想到了?

如有任何意见,我们将不胜感激^@^

PS:原谅我可怜的人english-_-

请注意我已经编辑了这个答案。

从第 2 点开始,我假设您的目标适应度为 1。您的算法可能永远不会完全收敛(找到局部最小值)。这是因为即使你的适应度改变了,你的随机值范围(0~>1)也不会改变。

请注意,这并不意味着没有创建更好的适应性;他们会。但是由于您正在检查适应度(随机 0~>1),因此创建更好适应度的速度会急剧下降。

考虑这个例子,其中所有适应度都收敛为高:

[0.95555, 0.98888, 0.92345, 0.92366]

这里,所有的值都极有可能满足randomNumToJudge<=fitness。这意味着 任何 个值被选为 parent 的可能性相同。您不希望这样 - 您希望 最佳 值有更高的机会被选中。

如果您将 randomNumToJudge 的范围设置为(人口中的适应度中值 ~> 1),您的算法可能会被修改为正确收敛,尽管这仍然不是最优的。

替代方法

我建议实施经典的 roulette wheel 方法。

轮盘赌方法根据每个人 "fit" 的表现,为每个人分配被选为 parent 的概率。从本质上讲,适应度越大,个体占据的轮子的切片就越大,随机数在轮子上选择这个位置的机会就越大。

Example Java code for roulette wheel selection