【发布时间】:2016-01-15 06:12:09
【问题描述】:
作为Differential Evolution 算法实现的一部分,我需要实现“突变”步骤:
- 从总体中随机选择三个成员,他们必须彼此不同,也必须与给定成员不同
- 通过将两个向量的加权差与第三个向量相加来计算捐赠者成员
This 是我想出的:
// Algorithm types
type Member = List[Double]
type Generation = Vector[Member]
def mutate(index: Int, generation: Generation): Member = {
// Create a random number stream with distinct values
val selector = Stream.continually(Random.nextInt(N)).distinct
// Select 3 mates from the generation
val mates = selector.filter(_ != index).take(3).map(generation(_))
// Calculate the donor member
(mates(0), mates(1), mates(2)).zipped map {
case (e1, e2, e3) => e1 + F * (e2 - e3)
}
}
(我按照here的解释实现了算法)
现在我的问题;有没有更好的方法来实现这一步?我一直在尝试找到一种更好的方法来从向量中选择 3 个列表并将它们压缩在一起,但是除了手动将所选列表放入元组之外,我找不到任何其他方法。 scala 编译器发出警告,应该使用mates.head 而不是mates(0),这表明这可以以更优雅的方式实现。
提前致谢!
【问题讨论】:
标签: algorithm list scala random