Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Scala:如何从添加到第三个列表的两个列表的加权差创建新列表_Algorithm_List_Scala_Random - Fatal编程技术网

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
    ?@Wilco
    Seq
    提取器的参数是
    Seq
    的任何子类,而
    Stream
    是。提取器归结为
    def unplyseq[A](x:Seq[A]):Option[Seq[A]=Some(x)
    ,因此它接受任何子类,然后
    unplyseq
    执行提取和检查元素的任务。谢谢!太棒了,我希望能有这样的东西。只是一个简单的问题,为什么我们可以使用
    Seq
    来匹配
    Stream
    ?@Wilco
    Seq
    提取器的参数是
    Seq
    的任何子类,而
    Stream
    是。提取器归结为
    def unplyseq[A](x:Seq[A]):Option[Seq[A]=Some(x)
    ,因此它接受任何子类,然后
    unplyseq
    执行提取和检查元素的任务。