这样select `parent` 像`赌博轮盘赌` 可行吗?
Is this way to select `parent` like `gambling roulette ` workable?
我想到使用 随机数 到 select parents
就像 gambling roulette
也许 workalbe.Let 我解释一下使用find the max value of function
中的示例。示例如下所示:
- 1.Imagine 我们已经生成了
n
随机 individual
并计算了他们的 function value
。我们将个体命名为 'j' Xj
,它的函数值名称是f(Xj)
。我们找到并命名最大值function-value maxValue
。
- 2.It很明显
fitness of individual j
就是f(Xj)/maxValue
。我们可以命名为g(Xj)
。然后我们计算个体的所有适应度。
- 3.The下一步是寻找
parents
。(我们放弃适应度值小于0的个体)。一个经典的方式是gambling roulette
。selecting Xj
和Xk
是g(Xj)*g(Xk)/[g(X1)+g(X2)+...+g(Xn)]^2
。
我的想法是
- 1.select 两个随机个体
Xj
和 Xk
- 2.generate0~1范围内的随机数
rn
。
- 3.if
rn
小于g(Xj)
和g(Xk)
(Xj
和Xk
的fitness
),然后他们能够reproduce.Then交叉和变异。
- 4.judge我们是否产生了足够的child个人,如果是,结束。
否则,重复
1-3
。
select得到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 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 的概率。从本质上讲,适应度越大,个体占据的轮子的切片就越大,随机数在轮子上选择这个位置的机会就越大。
我想到使用 随机数 到 select parents
就像 gambling roulette
也许 workalbe.Let 我解释一下使用find the max value of function
中的示例。示例如下所示:
- 1.Imagine 我们已经生成了
n
随机individual
并计算了他们的function value
。我们将个体命名为 'j'Xj
,它的函数值名称是f(Xj)
。我们找到并命名最大值function-valuemaxValue
。 - 2.It很明显
fitness of individual j
就是f(Xj)/maxValue
。我们可以命名为g(Xj)
。然后我们计算个体的所有适应度。 - 3.The下一步是寻找
parents
。(我们放弃适应度值小于0的个体)。一个经典的方式是gambling roulette
。selectingXj
和Xk
是g(Xj)*g(Xk)/[g(X1)+g(X2)+...+g(Xn)]^2
。
我的想法是
- 1.select 两个随机个体
Xj
和Xk
- 2.generate0~1范围内的随机数
rn
。 - 3.if
rn
小于g(Xj)
和g(Xk)
(Xj
和Xk
的fitness
),然后他们能够reproduce.Then交叉和变异。 - 4.judge我们是否产生了足够的child个人,如果是,结束。
否则,重复
1-3
。
select得到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 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 的概率。从本质上讲,适应度越大,个体占据的轮子的切片就越大,随机数在轮子上选择这个位置的机会就越大。