我已经为正在研究的遗传算法编写了轮盘赌选择功能,该功能基于我在论坛帖子中找到的示例:
private fun stringMatcherSelection(members: Collection<StringMatcherGenome>,
target: String) : StringMatcherGenome {
val totalFitness = members.sumBy { it.fitness(target) }
val slicePoint = totalFitness * Randomness.value.nextDouble()
var accumulator = 0
members.forEach {
accumulator += it.fitness(target)
if (accumulator >= slicePoint)
return StringMatcherGenome(it.genes)
}
return StringMatcherGenome(members.last().genes)
}
它的作用是对所有成员的适应度值求和,以得出总体适应度。然后,通过将总适应度乘以随机双精度数来选择此总适应度的随机点。此后,它将遍历总体的所有成员,并根据给定的成员适应性来递增累加器变量。一旦累计值超过或等于随机选择的健身切片点,我将当前评估的成员作为所选成员。
但是,我今天才看这个,对我而言不再有意义。此功能如何选择与他们的健康状况成正比的成员?即使我按最低合适度到最高合适度对成员进行排序(在列表的末尾放置较高适应度的成员),我从总适应度中随机选择一个适应度值的事实也将意味着将选择一个随机成员,没考虑他们的比例适合度吗?
或者,换句话说;我认为我生成的随机双精度点具有均匀分布,因此所选的适应度切片点也将具有均匀分布,只是映射在总体适应度上,而不是0.0-1.0。这意味着我是否首先对列表进行排序,结果将始终是统一选择(与适应性不成比例)。除非我完全错过情节。
这是我发现的帖子,似乎是该功能的相当标准的实现:
https://en.wikipedia.org/wiki/Fitness_proportionate_selection(我抄写给Kotlin的那个人)
Fitness proportionate selection (roulette wheel selection) in Python
Efficient Implementation of Fitness-Proportionate "Roulette" Selection
Roulette Selection in Genetic Algorithms
编辑:
阅读本文(第4页第5节)时,似乎在循环之前对列表进行排序称为“等级选择”,而对轮盘赌选择则不对它们进行排序:
http://www.cs.ucc.ie/~dgb/courses/tai/notes/handout12.pdf
但是我仍然不知道这两个函数如何选择与适应度成比例的函数,它看起来像是我的脑袋中的正态分布(我正在努力使我的脑海中的算法形象化……)