我尝试为我的项目学习和实现一个简单的遗传算法库。此时,进化、种群选择已准备就绪,我正在尝试实现一个简单的良好变异算子,如 Gaussian mutation operator。 (GMO) 用于我在 Java 和 Scala 中的基因进化引擎。
我在论文中找到了一些关于高斯变异算子 (GMO) 的信息 A mutation operator based on a Pareto ranking for multi-objective evolutionary algorithms (P.M. Mateo,I. Alberto),第 6 和 7 页。
但我在查找有关如何在 Java 中实现此高斯变异运算符和此运算符的其他有用变体的其他信息时遇到了一些问题。我该怎么办?
我正在使用 random Java util 的 random.nextGaussian()
函数,但此方法仅返回 0 到 1 之间的随机数。
所以,
a) 在这种情况下如何修改返回数字的精度? (例如,我想得到一个介于 0 和 1 之间的随机 double ,步长等于 0.00001。)
b) 以及如何为此函数指定 mu
和 sigma
,因为我想在本地搜索我的基因组值,而不是介于 -1 和 1 之间. 我如何调整围绕我的基因组值(value)的本地研究?
经过研究,我找到了 b) 问题的答案。看来我可以像这样置换高斯随机数:
newGenomeValue = oldGenomeValue + (( gaussiandRndNumber * sigma ) + mean )
其中 mean
= 我的基因组值。
(参见How can I generate random numbers with a normal or Gaussian distribution?中底页方法。)
最佳答案
要回答问题 a,您只需四舍五入到最接近的 0.00001 即可得到这些单位的答案。例如:
step = 0.00001;
quantized_x = step * Math.rint(x / step);
现在对于 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
}
关于java - 如何在 Java 中实现遗传算法的高斯变异算子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6275827/