Algorithm Scala:如何从添加到第三个列表的两个列表的加权差创建新列表
作为算法实现的一部分,我需要实现“变异”步骤:Algorithm Scala:如何从添加到第三个列表的两个列表的加权差创建新列表,algorithm,list,scala,random,Algorithm,List,Scala,Random,作为算法实现的一部分,我需要实现“变异”步骤: 从总体中随机选择三个成员,它们必须彼此不同,也必须与给定成员不同 通过将两个向量的加权差与第三个向量相加来计算供体成员 这就是我想到的: // Algorithm types type Member = List[Double] type Generation = Vector[Member] def mutate(index: Int, generation: Generation): Member = { // Create a rand
// 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)
}
}
(我实现了所解释的算法)
现在我的问题,;有没有更好的方法来实施这一步骤?我一直试图找到一种更好的方法,从一个向量中选择3个列表并将它们压缩在一起,但除了手动将所选列表放入元组之外,我找不到其他方法。scala编译器给出了一个警告,即不应使用mates(0)
而应使用mates.head
,这表明可以以更优雅的方式实现
提前谢谢 您可以
转置您的配偶
,然后用Seq
提取器在其上映射
:
mates.transpose map {
case Seq(e1, e2, e3) => e1 + F * (e2 - e3)
}
这将是一个流[Double]
,因此要获得成员
,您必须在其上调用toList
,或者使用mates.toList.transpose…
您可以转置您的mates
,然后使用提取程序将映射到它上面:
mates.transpose map {
case Seq(e1, e2, e3) => e1 + F * (e2 - e3)
}
这将是一个流[Double]
,因此要获得成员
,您必须在其上调用toList
,或使用mates.toList.transpose…
谢谢!太棒了,我希望能有这样的东西。只是一个简单的问题,为什么我们可以使用Seq
来匹配Stream
?@WilcoSeq
提取器的参数是Seq
的任何子类,而Stream
是。提取器归结为def unplyseq[A](x:Seq[A]):Option[Seq[A]=Some(x)
,因此它接受任何子类,然后unplyseq
执行提取和检查元素的任务。谢谢!太棒了,我希望能有这样的东西。只是一个简单的问题,为什么我们可以使用Seq
来匹配Stream
?@WilcoSeq
提取器的参数是Seq
的任何子类,而Stream
是。提取器归结为def unplyseq[A](x:Seq[A]):Option[Seq[A]=Some(x)
,因此它接受任何子类,然后unplyseq
执行提取和检查元素的任务。