首页 > 解决方案 > 这种选择像“赌博轮盘”这样的“父母”的方式可行吗?

问题描述

我突然想到使用随机数来选择parents类似的东西gambling roulette可能是可行的。让我用一个例子来解释它find the max value of function。例子如下所示:

我的想法是

选择Xj和的机会Xkg(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代码中测试了这种方式。功能是x + 10sin(5x) + 7cos(4x), x∈[0,10)。我生成100代,一代中的个体数为1000。

它的结果是正确的。

在某次执行中,在第 100 代中,我发现最好的个体是7.856744175554171,而最好的功能值是24.855362868957645。我已经测试了 10 次。第 100 代每个结果都精确到小数点后 10 位。

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

任何意见表示赞赏^@^

PS:原谅我英语不好-_-

标签: javagenetic-algorithm

解决方案


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

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

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

考虑这个所有适应度都很高的例子:

[0.95555, 0.98888, 0.92345, 0.92366]

在这里,所有值很可能满足randomNumToJudge<=fitness。这意味着任何值都同样可能被选为父级。你不希望这样 - 你希望最好的值有更高的被选中的机会。

randomNumToJudge如果您将您的算法设置为具有(人口中的中位数~> 1)的范围,则可以修改您的算法以正确收敛,尽管这仍然不是最佳的。

替代方法

我建议实施经典的轮盘赌方法。

轮盘赌方法根据每个人的“适合”程度为每个人分配被选为父母的概率。从本质上讲,适应度越大,个人将占据的轮盘越大,随机数选择轮盘上这个位置的机会就越大。

轮盘选择的示例 Java 代码


推荐阅读