浅谈多因子进化算法(MFEA)

浅谈多因子进化算法(Multifactorial Evolutionary Algorithm)

前言

​ 多因子进化算法是多任务进化算法的一种范式,旨在利用单个种群来同时解决多个优化任务,是南洋理工大学的Yew-Soon Ong教授于2016年提出来的[1],简称MFEA(或MFO,Multifactorial Optimization)。MFEA利用的是基于种群搜索的隐式并行性,尝试去发掘不同任务之间的隐性关联并借此加快各个问题的收敛。本文将从一个初学者的角度,简单地探讨一下MFEA。

​ 阅前提示:阅读本文需要有一定的进化算法与多目标优化的基础知识,若无相关基础,可先阅读参考文献2。

MFEA的定义

​ 首先,我们定义一个具有a个不等式约束条件与b个等式约束条件的最小值优化任务T为

\[\begin{cases} min & f(x)\\ s.t. & g_a(x) \leq 0,& a=1,2,...,q\\ & h_b(x) = 0,&b=1,2,...,p \end{cases} \]

​ 为了使算法具有普适性,假设待优化的各个任务之间相互独立,即不给出任何各个任务之间的依赖关系的先验知识。同时,假设所有任务都是求最小值(求最大值的可以转换为求最小值),定义第j个任务为\(T_j\),其搜索空间为\(X_j\),目标函数定义为\(f_j:X_j \rightarrow R\),则MFEA旨在找到如下的一组解:

\[{\{x_1,x_2,...,x_{K-1},x_K\}}=argmin{\{f_1(x),f_2(x),...,f_{K-1}(x),f_{K}(x)\}} \]

​ 其中为\(x_j\)搜索空间\(X_j\)上的可行解,K为任务的数量,该复合问题被称为K因子问题(K-factorial problem)。

​ 为了方便解决问题,有如下定义:

定义1:因子代价(Factorial Cost):个体\(p_i\)在任务\(T_j\)上的因子代价\(\Psi^{i}_{j}\)定义为:

\[\Psi^{i}_{j}=\lambda \cdotp \delta^i_j+f^i_j \]

​ 其中,\(\lambda\)为一个较大的惩罚系数,\(f^i_j\)\(\delta^i_j\)分别为\(p_i\)\(T_j\)的目标值和总约束违背量。若\(p_i\)\(T_j\)是可行的(即零约束违背,符合所有的约束条件),则有\(\Psi^{i}_{j}=f^i_j\)

定义2:因子等级(Factorial Rank):个体\(p_i\)在任务\(T_j\)上的因子等级\(r^i_j\)定义为该个体在种群中的索引,种群中所有个体的索引按因子代价\(\Psi^{i}_{j}\)从小到大排列后确定。当多个个体具有相同的因子代价时,采用random tie-breaking方法选择。

定义3:适应度标量(Scalar Fitness):个体\(p_i\)的适应度标量\(\varphi_i\)定义为:\(\varphi_i=1/min {\{r^i_j}\}\),其中\(j\in{\{1,2,...,K}\}\).

定义4:技能因子(Skill Factor):个体\(p_i\)的技能因子\(\tau_i\)为该个体在所有任务中表现最好的任务的索引,即:

\[\tau_i=arg min_j{\{r^i_j}\},j\in{\{1,2,...,K}\} \]

定义5:多因子最优解(Multifactorial Optimality):个体\(p^*\)的目标值为\({\{f^*_1,f^*_2,...,f^*_K \}}\),当且仅当存在一个\(j\),使\(f^*_j \leq f_j{(x_j)}\)对于所有的\(x_j \in X_j\)都成立时,称为多因子最优解,其中\(j\in{\{1,2,...,K}\}\).

​ 根据定义3,当两个个体的适应度标量关系为\(\varphi_a >\varphi_b\)时,称为个体\(p_a\)支配\(p_b\),记作\(p_a \gg p_b\)

多任务优化与多目标优化的区别

​ 多任务优化(MFO)与多目标优化(MOO)有很多相似的地方,比如都是利用单个种群同时优化多个问题,但这两种算法上其实在本质上是有所不同的。从其定义可知,多任务优化当中,不同优化任务的约束条件不同,即各个任务不在同一搜索空间(当然,MFEA中将所有的任务映射到了统一的搜索空间,但其本质上还是在不同的搜索空间对各个任务进行求解)。而对于多目标优化,所有的优化问题都有统一的约束条件。在多任务优化中,我们假设各个优化任务之间没有显示的关系,但多目标优化中的各个问题往往存在一些冲突。并且,多任务优化的目的是并行地找到所有问题的最优解,单个个体只需要关心它最擅长的任务,而多目标优化则是寻找一个面向所有问题的折衷的解(Pareto最优解)。为了更好地展示两种范式的区别,我们借用下图进行说明。

​ 如图,在多目标优化中,常常认为解\(\{p_2,p_3,p_4,p_5\}\)之间没有孰优孰劣,但都优于解\(\{p_1,p_6\}\),即\(\{p_2,p_3,p_4,p_5\}\)支配\(\{p_1,p_6\}\)。而在多任务优化中,则会认为解\(\{p_1,p_2,p_5,p_6\}\)优于解\(\{p_1,p_6\}\),即\(\{p_1,p_2,p_5,p_6\} \gg \{p_1,p_6\}\)。因为\(p_5\)\(p_6\)在任务1上表现很好,\(p_1\)\(p_2\)在任务1上表现很好,我们不关心它们在其他任务上的表现如何。

详解MFEA

​ MFEA不仅受到了达尔文主义的启发,还受到了拉马克主义的启发,因此文献[1]的作者认为MFEA属于模因计算(memetic computation)领域,父代将通过交配、变异和垂直文化传播把基因和模因(又称文化基因)传给后代,具体细节将在接下来的部分中进行介绍。首先,给出MFEA的基本结构的伪代码

算法1:MFEA的基本结构:
1、生成一个多个体种群并将其储存在current-pop(P)中。
2、在多任务环境中,对每一个优化任务进行评估。
3、计算每个个体的技能因子t(skill factor)。
4、while (不满足终止条件) do
	(1)、在current-pop上应用遗传算子来生成offspring-pop (C),参见下文的算法2。
	(2)、仅对选定的优化任务评估offspring-pop中的个体,见下文算法3。
	(3)、合并offspring-pop与current-pop,生成intermediate-pop (P∪C)。
	(4)、更新intermediate-pop中每个个体的标量适应度(scalar fitness)和技能因子			 (skill factor)。
	(5)、在intermediate-pop中选择适应度最高的个体,组成新的种群current-pop(P)。
5、end while

1、种群初始化

​ 假设K个优化任务同时执行,其中第j个任务的维数由\(D_j\)给出。据此,我们定义一个统一的搜索空间,该空间的维度\(D_{multitask}=max_j{\{D_j\}}\)。种群初始化时,每个个体随机生成一个\(D_{multitask}\)维的随机向量,向量中的每个元素的取值在区间[0,1)上,这个随机向量代表个体的染色体。在统一的搜索空间上,第i维用一个随机键值\(y_i\)表示,固定的范围表示统一搜索空间的约束。在处理第j个任务\(T_j\)时,我们使用个体染色体的第\(D_j\)个随机键值,然后将该变量映射到任务\(T_j\)上。假设某个实际任务的第i个变量在区间\([L_i,U_i]\)内,则通过如下公式,将统一搜索空间的随机键值\(y_i\)映射到对该任务有意义的输入\(x_i\)

\[x_i=L_i+(U_i-L_i)\cdotp y_i \]

2、遗传机制

​ 首先需要知道的是,在MFEA中,父代之间的交配并不随机,它们会倾向与自己文化背景相同(即技能因子\(\tau\)相同)的进行交配,而对于文化背景不同的两个个体,它们之间交配的概率由随机交配概率rmp(random mating probability)决定。rmp用于平衡局部搜索空间的开发和全局搜索空间的探索。若设定rmp为1,则意味着个体之间的交配是完全随机的,rmp为0则意味着完全不允许不同文化背景的个体进行交配,这容易陷入局部最优解。因此需要选择一个合适的rmp,使算法能在局部搜索与全局搜索之间达到良好的平衡。在本文中,设定rmp为0.3。当两个个体不满足如上的交配条件时,则会通过变异来产生后代。该过程的伪代码如下:

算法2:选择性交配
从current-pop中随机选择两个父代个体pa和pb。
1、产生一个[0,1]之间的随机数rand。
2、if (ta == tb) or (rand < rmp) then
	(1)、父代个体pa与pb交叉,产生后代ca和cb。
3、else
	(1)、父代pa轻微变异产生后代ca。
	(2)、父代pb轻微变异产生后代cb。
4、end if

​ 在上述过程中,使用的是两种较为流行的遗传算子,即模拟二进制交叉(Simulated Binary Crossover,简称SBX)和高斯变异(Gaussian Mutation)。

3、选择性评估

​ 显然,如果每一个个体都要在所有任务上进行评估,算法的时间复杂的会很大,并且这也没有必要,因为在MFO中我们的目的是找到所有任务的最优解,而不是用一个解去解决所有任务。因此MFEA中使用了一种选择性评估的机制,对于个体而言,我们只需要关心它最擅长的那个任务,只评估它表现最好的那个任务即可。当个体产生后代后,后代擅长的任务则首先通过垂直文化传播确定,其过程如算法3所示。

算法3:通过选择模仿的垂直文化传播
对于一个个体c,它会有两个父代(pa和pb)或者只有一个父代(pa或pb)--见算法2。
1、if (c有两个父代) then
	(1)、产生一个0到1之间的随机数rand。
	(2)、if (rand<0.5) then
			c模仿pa -> 该后代仅在任务ta时进行评估(ta为pa的技能因子skill factor)。
	(3)else
			c模仿pb -> 该后代仅在任务tb时进行评估。
	(4)end if
2、else
	c模仿它唯一的一个父代 -> 该后代仅在其父代任务上进行评估。
3、end if
4、人为地将未评估的任务中c的因子损失(Factorial Cost)设置为无穷大。

​ 讲到这里,我们不妨一起来看看MFEA的遗传与垂直文化传播的过程的具体代码,该代码是MFEA的作者给出的Matlab代码,有需要的小伙伴可以点击这里去官网下载。(这里先挖个坑,有空我写个Python版本的供大家学习)

%%%  Chromosome是个体对象
%%%  crossover()为交配函数
%%%  mutate()为变异函数
for i = 1 : pop/2 
    p1 = indorder(i); %前半部分的一个个体
    p2 = indorder(i+(pop/2)); %后半部分的一个个体
    child(count)=Chromosome();
    child(count+1)=Chromosome();
    if (population(p1).skill_factor == population(p2).skill_factor) || (rand(1)<rmp)   % 杂交         
        u = rand(1,D_multitask);
        cf = zeros(1,D_multitask);
        cf(u<=0.5)=(2*u(u<=0.5)).^(1/(mu+1));%SBX的参数
        cf(u>0.5)=(2*(1-u(u>0.5))).^(-1/(mu+1));
        child(count) = crossover(child(count),population(p1),population(p2),cf);
        child(count+1) = crossover(child(count+1),population(p2),population(p1),cf);
        sf1=1+round(rand(1));%随机生成0或1
        sf2=1+round(rand(1));
        if sf1 == 1 %选择性模仿
            child(count).skill_factor=population(p1).skill_factor;
        else
            child(count).skill_factor=population(p2).skill_factor;
        end
        if sf2 == 1
            child(count+1).skill_factor=population(p1).skill_factor;
        else
            child(count+1).skill_factor=population(p2).skill_factor;
        end
    else %变异
        child(count)=mutate(child(count),population(p1),D_multitask,sigma);
        child(count).skill_factor=population(p1).skill_factor;%直接模仿
        child(count+1)=mutate(child(count+1),population(p2),D_multitask,sigma);
        child(count+1).skill_factor=population(p2).skill_factor;
    end
    count=count+2;
end

4、选择操作

​ 如算法1所示,MFEA遵循一种精英选择策略,以保证优秀的个体能够世代相传。

小结

​ 多任务学习(Mulititask Learning)是一个已经提出了很多年的概念,属于机器学习的一个分支,旨在同时学习多个任务。而进化多任务则是近几年才被提出来的概念,进化多任务则是尝试利用进化算法的隐式并行性去同时解决多个任务,本文所阐述的MFEA是进化多任务的一种具体范式,与传统的进化算法相比,该算法首先是将不同的搜索空间映射到统一的搜索空间以实现同时对多个任务进行优化,然后引入技能因子与垂直文化传播的概念,以减少评估次数,加快算法的收敛,该算法在一些经典的优化函数上有比单任务优化更好的结果,更快的收敛速度(见参考文献[1]),可以说是入门进化多任务一个必学的一个算法。

参考文献

[1] A. Gupta, Y. Ong and L. Feng, "Multifactorial Evolution: Toward Evolutionary Multitasking," in IEEE Transactions on Evolutionary Computation, vol. 20, no. 3, pp. 343-357, June 2016, doi: 10.1109/TEVC.2015.2458037.

[2] 公茂果, 焦李成, 杨咚咚,等. 进化多目标优化算法研究[J]. 软件学报, 2009, 20(002):271-289.

posted @ 2021-03-12 15:08  菜鸡刘  阅读(1649)  评论(2编辑  收藏  举报