java - 这种选择像“赌博轮盘”这样的“父母”的方式可行吗?
问题描述
我突然想到使用随机数来选择parents
类似的东西gambling roulette
可能是可行的。让我用一个例子来解释它find the max value of function
。例子如下所示:
- 1.假设我们已经生成了
n
随机individual
数并计算了它们function value
。我们将个体命名为'j'Xj
,它的函数值名称是f(Xj)
。我们找到并命名最大函数值maxValue
。 - 2. 很明显
fitness of individual j
是f(Xj)/maxValue
。我们可以命名它g(Xj)
。然后我们计算个体的所有适应度。 - 3.下一步是找到
parents
。(我们放弃适应度值小于0的个体)。经典的方法是。选择和的gambling roulette
机会是。Xj
Xk
g(Xj)*g(Xk)/[g(X1)+g(X2)+...+g(Xn)]^2
我的想法是
- 1.选择两个随机个体
Xj
和Xk
- 2.生成一个0~1范围内的随机数
rn
。 - 3.
rn
如果小于g(Xj)
andg(Xk)
(and的thefitness
ofXj
andXk
),那么它们能够繁殖。然后交叉和变异。 - 4.判断我们是否产生了足够多的子个体,如果是,结束。否则,重复
1-3
。
选择Xj
和的机会Xk
是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代码中测试了这种方式。功能是x + 10sin(5x) + 7cos(4x), x∈[0,10)
。我生成100代,一代中的个体数为1000。
它的结果是正确的。
在某次执行中,在第 100 代中,我发现最好的个体是7.856744175554171
,而最好的功能值是24.855362868957645
。我已经测试了 10 次。第 100 代每个结果都精确到小数点后 10 位。
那么这种方式可行吗?这种方式是否已经被其他人想到了?
任何意见表示赞赏^@^
PS:原谅我英语不好-_-
解决方案
请注意我已经编辑了这个答案。
从第 2 点开始,我假设您的目标适应度为 1。您的算法可能永远不会完全收敛(找到局部最小值)。这是因为即使您的适应度发生变化,您的随机值范围 (0~>1) 也不会改变。
请注意,这并不意味着没有创建更好的适应度;他们会。但是由于您正在检查适应度(随机 0~>1),创建更好适应度的速度会急剧下降。
考虑这个所有适应度都很高的例子:
[0.95555, 0.98888, 0.92345, 0.92366]
在这里,所有值很可能满足randomNumToJudge<=fitness
。这意味着任何值都同样可能被选为父级。你不希望这样 - 你希望最好的值有更高的被选中的机会。
randomNumToJudge
如果您将您的算法设置为具有(人口中的中位数~> 1)的范围,则可以修改您的算法以正确收敛,尽管这仍然不是最佳的。
替代方法
我建议实施经典的轮盘赌方法。
轮盘赌方法根据每个人的“适合”程度为每个人分配被选为父母的概率。从本质上讲,适应度越大,个人将占据的轮盘越大,随机数选择轮盘上这个位置的机会就越大。
推荐阅读
- spring - 名称为“configServicePropertySource”的 bean 定义无效
- angular - 使用键盘事件导航列表
- android - Angular 7 Cordova 8 后退按钮覆盖不起作用
- python - Changing a string by finding a specific string and replacing a following string
- python - Python-通过 UDP 通信发送一个字节
- python - 如何检查字典中的键是否是两次或更多?
- azure - 如何使用 PowerShell 为 Azure-AD 设备对象添加扩展属性?
- javascript - 将两个 MySQL 行放入 PHP 数组
- java - 如何让 Ant 知道包的位置?
- c++ - 具有每个元素相同的最大子序列大小的序列