rey*_*n64 13 java random artificial-intelligence gaussian genetic-algorithm
我尝试为我的项目学习并实现一个简单的遗传算法库.在这个时候,人口的进化,选择已经准备就绪,我正在尝试为Java和Scala中的遗传进化引擎实现一个简单的好变异算子,如高斯变异算子(GMO).
我在基于多目标进化算法的Pareto排名(PM Mateo,I.Alberto),第6页和第7页的论文A变异算子中找到了关于高斯变异算子(GMO)的一些信息.
但我有一些问题需要找到有关如何在Java中实现此高斯变异算子和此运算符的其他有用变体的其他信息.我该怎么办?
我正在使用random.nextGaussian()随机Java util 的功能,但此方法仅返回0到1之间的随机数.
所以,
a)在这种情况下,如何修改返回编号的精度?(例如,我想获得一个介于0和1之间的随机双数,步长等于0.00001.)
b)我如何指定mu和sigma使用这个函数,因为我想在本地搜索我的基因组的值,而不是在-1和1之间.我怎样才能调整我的基因组价值的本地研究?
经过研究,我找到了b)问题的答案.我似乎可以取代高斯随机数,如下所示:
newGenomeValue = oldGenomeValue + (( gaussiandRndNumber * sigma ) + mean )
Run Code Online (Sandbox Code Playgroud)
其中mean=我的基因组价值.
(参见底部的方法如何生成具有正态或高斯分布的随机数?)
要回答问题a,您所要做的就是四舍五入到0.00001,以这些单位获得答案。例如:
step = 0.00001;
quantized_x = step * Math.rint(x / step);
Run Code Online (Sandbox Code Playgroud)
现在,对于b部分,您有了正确的想法,所提供的代码应该可以正常工作。您需要做的就是将变量重新缩放到所需范围。我唯一可以添加的是,该方法起作用的根本原因是微积分中的变量定理的更改:http : //en.wikipedia.org/wiki/Integration_by_substitution
如果在高斯分布的情况下计算出该公式,其中高斯分布的均值为0,标准差为1,则通过线性移位和重新定标来转换,那么您会发现所写的确实是正确的。
综上所述,下面的代码应该可以解决问题:
double next_gaussian()
{
double x = rng.nextGaussian(); //Use whichever method you like
//here to generate an initial [-1,1] gaussian distribution
y = (x * 0.5) + 0.5; //Rescale to [0,1]
return Math.rint(y * 100000.0) * 0.00001; //Quantize to step size 0.00001
}
Run Code Online (Sandbox Code Playgroud)