【发布时间】:2011-09-10 16:12:06
【问题描述】:
我尝试为我的项目学习和实现一个简单的遗传算法库。此时,进化、种群选择已经准备就绪,我正在尝试用 Java 和 Scala 为我的基因进化引擎实现一个简单的好变异算子,例如 Gaussian mutation operator (GMO)。
我在论文 A mutation operator based on a Pareto ranking for multi-objective evolutionary algorithms (P.M. Mateo, I. Alberto) 第 6 和 7 页中找到了一些关于高斯变异算子 (GMO) 的信息。
但是我有一些问题要找到关于如何在 Java 中实现这个高斯变异算子和这个算子的其他有用变体的其他信息。我该怎么办?
我使用的是random Java util的random.nextGaussian()函数,但是这个方法只返回一个0到1之间的随机数。
所以,
a) 在这种情况下如何修改返回数字的精度? (例如,我想得到一个介于 0 和 1 之间的随机双数,步长等于 0.00001。)
b) 以及如何为这个函数指定 mu 和 sigma,因为我想在本地搜索我的基因组的值,而不是在 -1 和 1 之间。我怎样才能调整我周围的本地研究基因组价值?
经过研究,我找到了 b) 问题的答案。看来我可以像这样置换高斯随机数:
newGenomeValue = oldGenomeValue + (( gaussiandRndNumber * sigma ) + mean )
mean = 我的基因组值。
(参见How can I generate random numbers with a normal or Gaussian distribution?中的底部页面方法。)
【问题讨论】:
-
“返回数字的精度”到底是什么意思?
-
你想以什么方式“修改”“逗号后面的数字”?
nextGaussian给你一个double。您是说这还不足以满足您的需求吗? -
我在模拟中使用这个数字来校准概率定律。我需要介于 0,01 和 0.00000001 之间的数字,所以如果我在 coma 之后添加一个只有一个数字精度的双精度数(例如 0.11111 0.255525 0.114182 等),这是有问题的,因为我需要像这样添加随机数:0.001、0.001252、0 ,000352 等
-
您的评论实际上包含了您所需要的一切。该论文中的 z、z_k、z_k' 都是 0 均值、stddev 1 随机变量(就像您从 nextGaussian() 获得的一样),您只需要以与论文中相同的方式缩放它们(即, x_k 的平均值, x_k 的 sigma_k 的 stddev 和 sigma 的乘法更新的 exp(tau'z+tauz_k)。
标签: java random artificial-intelligence genetic-algorithm gaussian