这样选择“赌轮盘”之类的“父母”是否可行?

时间:2018-12-29 07:50:44

标签: java genetic-algorithm

在我看来,使用随机数选择parents之类的gambling roulette可能是可行的。让我用find the max value of function中的示例进行说明。示例如下所示:

  • 1。假设我们已经生成了n随机individual并计算了它们的function value。我们命名了单个'j'Xj,其函数值名称为f(Xj)。然后找到并命名最大函数值maxValue
  • 2。显然fitness of individual jf(Xj)/maxValue。我们可以将其命名为g(Xj)。然后,我们将计算个人的所有适应度。
  • 3。下一步是找到parents。(我们放弃适合度值小于0的个人)。一种分类方式是gambling roulette。选择{{1}的机会},而XjXk

我的想法是

  • 1。选择两个随机个体g(Xj)*g(Xk)/[g(X1)+g(X2)+...+g(Xn)]^2Xj
  • 2。生成一个范围为0〜1的随机数Xk
  • 3。如果rn小于rng(Xj)g(Xk)fitness的{​​{1}}),则他们能够进行复制。然后进行交叉和变异。
  • 4。判断我们是否产生了足够的孩子个体,如果是,则结束。 否则,请重复Xj

选择Xk1-3的机会为Xj,与Xk相似。考虑两个机会的两个分母都是常数,它们在某种方式。

g(Xj)*g(Xk)/n^2

我在Java代码中以此方式进行测试。函数为gambling roulette。我生成了100代,而一代中的个体数为1000。

其结果是正确的。

在某个执行中,在第100代中,我发现最佳个体是 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 } ,最佳函数值是x + 10sin(5x) + 7cos(4x), x∈[0,10)。 我已经测试了10次,每个结果在第100代中都精确到小数点后10位。

这种方法可行吗?其他人是否已经考虑过这种方法?

任何评论都值得赞赏^ @ ^

PS:请原谅我可怜的英语-_-

1 个答案:

答案 0 :(得分:1)

请注意,我已经编辑了此答案。

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

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

请考虑以下示例,其中所有适应性都已达到很高:

[0.95555, 0.98888, 0.92345, 0.92366]

在这里,所有值都很可能满足randomNumToJudge<=fitness。这意味着任何个值均可能被选择为父级。您不希望这样-您希望最佳值被选择的可能性更高。

如果您将randomNumToJudge设置为具有一定范围(人口中位数适中性〜> 1),则可以对算法进行修正以使其收敛,尽管这仍然不是最佳选择。

替代方法

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

轮盘赌法根据每个人的“适合度”为他们分配被选为父母的概率。本质上,适应度越高,个人将占据的车轮部分越大,随机数选择车轮上此位置的机会就越大。

Example Java code for roulette wheel selection