一种基于Spark的分布式进化算法岛模型并行化方法与流程

文档序号:14735939发布日期:2018-06-19 20:29阅读:399来源:国知局
一种基于Spark的分布式进化算法岛模型并行化方法与流程

本发明属于进化算法分布式并行领域,涉及一种基于Spark的分布式进化算法岛模型并行化方法。



背景技术:

随着大数据时代的来临,组合优化问题的规模越来越大,传统的进化算法在搜索空间包含大量局部最优解或者单个组合的评价目标函数计算耗时很大时,因受到单机计算资源与串行求解算法的限制,其求解精度与求解效率无法满足现实需求。因此将进化算法分布式并行化对于求解大数据处理中的复杂优化问题具有重要的意义。近年来,基于新兴的云计算与大数据技术,进化算法的分布式并行化也得到了发展,利用分而治之的思想,将进化算法中的整个种群切分并分布于分布式系统中实现分布式进化,成为一个新的研究热点。

相比于MapReduce,Spark作为一个支持迭代计算的分布式内存框架,能大幅提升进化计算这样计算密集型应用的计算效率。Spark中每次进化算法每次执行迭代的数据可以存储在内存中,在下一次迭代中继续被使用,而MapReudce则需要将每次迭代的数据从文件中读取,执行完毕以后,写入文件,这样的文件I/O过程增加了整个计算的耗时。Spark的弹性分布式数据集(RDD)表示缓存在分布式集群内存中的数据,RDD仅支持粗粒度的转换,即对RDD执行转换操作,控制操作或者行动操作,将会将该操作用于所有记录,实现对集群中各个结点所包含的数据集的转换,因此,Spark更适用于粗粒度的并行策略。

而岛模型是分布式进化算法并行模型中一种粗粒度的并行方式,将整个种群分为几个子种群,每一个子种群作为一个独立地岛被一个处理器独立处理,通信只发生在一个子种群中某些个体需要被迁入到另外的子种群。按照对每个子种群所应用的进化参数与进化算子的不同,岛模型分为同质与异质。根据NO-FREE Lunch理论:即便我们有一组控制参数适用于大多数问题,但它依然仅仅依赖这组控制参数去适应任何问题则是危险的。既然岛模型的分布式进化算法中,每个岛在每个子种群上独立进化,可以对每个子种群应用不同地进化参数与算子,甚至不同的进化算法,并在迁移周期内对这些异质子种群之间进行个体交换,以实现对整个空间的搜索与局部搜索的平衡,提高算法的适应性。



技术实现要素:

本发明提供了一种基于Spark的分布式进化算法岛模型并行化方法,解决单机进化算法求解大规模组合优化的效率问题,实现基于岛模型的同质与异质分布式进化算法,其中异质算法能提高种群的多样性,避免未成熟收敛的问题。在Spark集群环境下,实现了多个子种群的同质与异质分布式并行,并通过Spark的广播变量与集中式服务器两种方式实现迁移算子。

本发明的技术方案:

一种基于Spark的分布式进化算法岛模型并行化方法,步骤如下:

步骤1:对所要解决的现实优化问题进行数学建模,定义分布式进化算法中的个体表示方式,初始化生成染色体向量后,根据优化目标,建立染色体向量到目标函数值的映射,初始化目标函数;

所述个体包括染色体向量、所属子种群的标志、目标函数值和是否满足问题约束属性;所述的染色体向量包括染色体向量的编码方式、染色体向量的维数以及每一维的约束,都根据所求实际问题进行定义;所述所属子种群的标志,用于在进行分区间个体交换时,子种群迁出个体到达共享变量后,再根据该标志决定个体迁入的分区;所述的是否满足问题约束属性,即在计算目标函数过程中以及后续的进化算子变化染色体向量时,判别染色体向量是否满足问题约束;

步骤2:定义迁移操作,包括判断迁移条件、制定迁移选择策略,制定迁移替换策略以及迁移拓扑;

所述的迁移拓扑规定了子种群之间进行个体交换的图以及基于拓扑编写的每个子种群从其他子种群迁入个体时所使用的映射函数;其中,个体交换的图包括环状、花环状或立方体状;

迁移拓扑中的每个子种群初始化进化算子,对于同质算法,只需要初始化一个进化算子;对于异质进化,每个子种群应用相同进化算子但进化参数不同的异质,或者子种群应用不同进化算子的异质,或者是子种群应用不同进化算法进化;

步骤3:利用RDD的创建操作,将步骤1产生的个体集合初始化成RDD,RDD的分区数量与迁移拓扑中定义的子种群数量相同,每个子种群相当于RDD的一个分区,RDD执行mapPartitionsWithIndex转换操作,其传入的函数类型表示对RDD分区的进化操作,也就是每个子种群的进化过程;

当执行同质进化时,所有子种群都执行同样的操作;当执行异质进化时,每个分区执行不同的进化算子在该函数内部,根据该函数的Int类型参数,对各个分区映射步骤2中初始化的不同的进化算子,实现异质的分布式进化算法;

步骤4:当进化代数到达步骤2定义的迁移条件,分布式进化算法执行迁移操作,按照步骤2中迁移选择策略选出的个体发送到所有分区共享的变量中,然后每个分区从该集群的共享变量中取出迁入自己分区的个体,根据迁移替换策略替换原有分区上个体,形成新的子种群,继续执行迭代进化;

步骤5:当进化过程到达结束条件,所有分区选择出最优个体;然后对RDD执行collect行动操作,将RDD的每个分区的最优个体返回到Driver节点,以数组的形式保存在Driver的内存中;对得到的数组进行内部排序,得到优化结果。

进一步地,步骤2所述的迁移操作包括基于Spark广播变量实现的迁移操作或基于集中式服务器实现的迁移操作。

本发明的有益效果:

(1)基于Spark平台,分布式进化算法通过分而治之的思想将整个种群分布到集群不同的节点执行独立地进化过程,提升了求解效率,并且因种群在迁移周期内进行子种群交换而提高了整个种群的求解精度。

(2)RDD的操作是粗粒度的,但是通过转换操作中传入函数类型的设计,实现了在Spark平台上基于RDD分区的异质分布式进化算法,对于一些应用问题,异质相比同质实现提升了整个种群的多样性,有助于平衡算法的全局搜索与局部搜索能力。

(3)基于Spark广播变量实现了迁移操作,多个分区可以同时进行迁移操作,但每次迁移操作会产生一个Job。

(4)基于集中式服务器的迁移操作实现,减少了每次迁移操作发生时Driver与Excutors之间的通信量,同时也减少了整个作业运行过程中Job的数量,但需要同步等待时间。

附图说明

图1是本发明的流程图。

图2是迁移拓扑图。

图3是本发明的基于Spark广播变量实现的迁移操作的RDD数据转换图。

图4是可扩展性示意图。

具体实施方式

以下结合技术方案和附图详细叙述本发明的具体实施例。

结合图1~图3,

本图1表示本发明的完整流程包括初始化种群与目标函数,定义分布式进化算法进化算子与迁移拓扑,基于RDD分区实现同质与异质进化,分区之间进行迁移操作。

具体的实施方式分别说明如下:

步骤1.

初始种群与目标函数。每个个体用Individual[Double]对象表示,包含的属性中:染色体向量,用Vector[Double]表示,浮点类型为所使用的基因编码类型。是否满足约束均初始化为true。所属子种群标志在对整个种群进行分区时赋给分区标志。根据整个种群的规模,形成初始种群List[Individual[T]]。初始化目标函数,每个个体的染色体向量作为自变量,因变量为目标函数值。本实施中为了比较异质与同质进化算法的适应性,用标准测试函数中的多峰目标函数f11来验证,f11为:

其最优值均为0,在{0}D,可接受解为1×10-6

步骤2.采用图1所示环状迁移拓扑与对每个子种群所标识的进化算子进化执行异质分布式进化算法。迁移算子使用Migrate类表示,包含子种群之间在迁移周期内进行个体交换的拓扑图用Topology类表示,本例的环状可以使用Topology(1,4)初始化,并在Topology中定义该拓扑下每个子种群从其他子种群迁入个体时所使用的映射函数为:

(index+1)%topology.size

Migrate类还包含迁移率,迁移替换策略函数,迁移选择函数,判断是否到达迁移条件函数。

进化算子用EvolveOperator类表示,实现了图2中异质差分演化算法分实现DE/best/0.9,DE/rand/0.9。同质差分演化算法全部使用DE/best/0.9。所有同类的进化算法的进化算子,都可以扩展EvolveOperator,实现自己的进化操作。

步骤3.将步骤1产生的种群生成populationRDD[Individual],并将populationRDD的分区数设置为与迁移拓扑中规定的子种群数相同。对populationRDD执行mapPartionsWithIndex(partionEA:(Int,Iterator[Individual[T]]=>Iterator[Indiviual[T]],preservesPartitioning=true)转换操作,preservesPartitioning=true表示该转换操作保留父分区的分区信息,保证多个子种群的进化是独立的。传入的partitionEA表明populationRDD所有分区执行的进化操作,因为要对每个分区执行带有不同进化算子的进化过程,但所有分区都必须执行该partitionEA函数,于是在partitionEA函数的内部,基于partitionEA传入的Int类型参数,该参数即为分区标志,来映射不同的进化算子到不同的分区,从而实现多个子种群异质进化。

基于Spark广播变量实现的迁移操作的RDD转换图如图2所示。首先对noMigrateRDD进行持久化保存,可以使用cache()或者persist()控制操作,以便得到迁入该分区的个体后,原有的RDD仍在内存中。Spark的广播变量是Spark的一种共享变量的方式,使得任务在各个Executor执行时都有一份该变量的副本,但是该副本是只读的,被广播之后不能再被修改,因此每次迁移操作都需要执行一次共享变量的广播。为了生成该广播变量,对noMigrateRDD的所有分区中根据migrateSelect选出迁出个体,然后对noMigrateRDD执行collect行动操作,将会将所有分区的迁出个体的Array[Individual],返回到Driver,然后Driver广播该集合到每个Excutor。此时原先缓存于内存中的noMigrateRDD可以继续执行迁移替换策略,生成下一代进化的RDD。

基于集中式服务器实现的迁移操作,当分区的进化过程在到达迁移条件的时候,选择出当前分区即子种群要迁出的个体,与主节点进行RPC通信,将要迁出的个体存放到主节点的中的一个Map数据结构里,类型Map[Int,Map[Int,List[Individual]]]。其中第一个Int类型保存发生迁移的代数,所对应的Map[Int,List[Individual]]表示分区与分区迁出个体的映射。分区还需从主节点的Map结构中取出迁入自己分区的个体,如果别的分区还没有将迁入该分区的个体存放到主节点,该分区上的任务就进行线程等待,直到拿到迁入个体为止。分区得到迁移周期迁入的个体以后,根据迁移操作的替换策略,替换原有分区上的某些个体,完成了迁移操作。算法继续进行进化算子,直到达到最大进化代数或者收敛到可接受解为止。

到达结束条件以后,对每个分区执行选择操作,只保留目标函数值最大或最小的个体,然后对RDD执行collect()行动操作。Driver节点再对该数组进行简单的内存排序,就能获得最优值。

基于两种方式实现迁移操作,是因为第一种迁移操作实现方式会在作业中产生大量的Job,因为每次迁移操作为了生成新的广播变量,会触发一次Job的提交执行。而第二种实现方式只会产生一个Job。因为分布式进化算法在求解不同维数,不同的目标优化函数,以及不同迁移间隔等条件下,对于迁移操作实现的需求也是不同的。可以根据当前求解问题的特性,选用适合算法的迁移算子。

本次实验中本发明采用5台普通计算机(CPU:Intel Core i7-7700CPU@3.60Hz*8)RAM:(16G)(固态硬盘:256G)。其中一个为master,其余为slave节点。

在上述目标函数在维数为30维的情况下,比较异质差分演化算法与同质差分演化算法求解f11的精度。三种算法运行30次,所得最大值,最小值,平均值如表1所示:

表1 比较异质差分演化算法与同质差分演化算法求解f11的精度

可看出异质的算法要比同质算法求解的精度要高,因为同质DE/best/0.9更容易陷入局部最优,而异质由于有子个种群执行DE/rand/0.9,提升了种群的多样性。

图4是将标准测试函数的维数扩大到1000维时,随着集群cores增加的情况下,任务执行时间的变化。随着cores的增加,任务执行时间逐渐减少。看出该分布式并行方式的可扩展性,当面对维数更高的优化问题时,可以通过动态增加Spark工作节点提升任务所使用的CPU cores来提升算法的求解效率。

发明基于不同集群变量共享机制,提供了两种迁移操作的实现。

基于Spark广播变量方式实现的迁移操作,广播变量作为一种集群共享变量的方式其只可读,不可写。每次迁移操作需要每一个分区将迁出个体传递给Driver,然后通过P2P的通信方式使得集群中的每一个节点拥有该变量的副本,因此每次迁移会产生一个Job。分区拥有了迁出个体的副本以后,需要原有分区中的数据,但原有分区已经在选出迁出个体之后,对其执行了collect操作,因此需要在迁移操作的开始,需要对原有分区执行持久化操作,以便后续使用。

在集中式服务器中设置一个全局的可读写共享变量实现迁移操作,分区所在节点与该服务器通信,将迁出个体保存在该共享变量中。每个分区从该共享变量中再拿走迁入自己分区的个体,相比广播变量的方式,该方式并不需要将整个种群全部的迁出个体的集合广播到每一个计算节点,减少了集群因迁移操作而发生的通信量,但该方式中存在某些分区到达迁移条件,但要迁入该分区的个体还没到达共享变量中,该分区则需要线程等待一定时间。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1