资源下载地址:https://download.csdn.net/download/sheziqiong/85650266
任务一
1.1 描述NSGA-II算法基本流程
NSGA-II算法是十分经典的多目标演化算法框架。他的重要构件如下:
-
解的表示、初始种群:依据具体问题而定,种群大小为N。
-
父代选择:使用Binary Tournament方法。
-
变异、交叉:依具体问题而定。
-
子代生成:共生成与原始种群数量相同的N个。
-
幸存者选择:N+N中选择N个,选择的依据为1.rank大者优先 2.rank相同时更高多样性优先。
此外,该算法中有有两个十分重要的子算法:Fast non-dominated sorting用于确定不同解的rank,Crowding distance assignment用于在相同rank组内对每个个体进行diversity度量。
1.2 描述MOEA/D算法基本流程
MOEA/D算法,将多目标优化问题分解为一系列子优化目标,每一个子优化目标为一个个体,分解的方法主要有“多目标线性加权和(本次采用)”与“切比雪夫分解(多目标与最好目标之差的加权最大值)”。
算法的重要流程有:
-
父代选择:每一个子问题,选择自身以及一些邻居(borrowed)作为父代集合,从集合中选择父代。
-
子代生成:在上述父代中产生子代,每次每个子问题产生自己的1个后代。
-
子代替换:若子代比自己原始解在自己的单一优化目标下要好,则将自身的解换成新子代。同时把子代发送给自己的邻居,让他们分别基于各自的优化目标计算此子代的好坏,并相应进行更新。
1.3 多目标最大割问题
单目标最大割问题:找到无向图G=<V,E>中节点V的一种2划分,使得通过这两个划分分量之间的边的权重总和最大。这样的一种2划分称为最大割。
多目标最大割问题:每一个节点的weight有多个维度,每个维度上都希望分别求解单目标最大割问题。
1.4 演化算法要素在该问题上的应用
-
解的表示:因为是2分割,因此维护其中一个集合的元素作为解的表示,将所有节点采用二进制表示,1为选中,0为未选中。
-
解的评估:在每个维度上可以根据但目标割大小的定义,即求出穿过两个集合的边的权重和。
-
突变算子:适用于binary representation的bit-wise mutation.
-
交叉算子:适用于binary representation的one-point crossover.
任务二
2.1 项目描述
本次项目所有新增文件与预先给定文件均位于同一级目录下。新增文件共有4个,my_NSGA_II.py用于实现NSGA-II算法,my_MOEA_D.py用于实现MOEA/D算法,my_util.py用于存放两个算法通用的超参数以及公用函数,my_MaxCut_test.py将上述算法和给定的测试函数综合使用实现了完整的训练、评测过程。
在my_util.py中指定了如下超参数:1)种群大小20。2)变异率:0.1。3)训练epoch:100轮。
为了复现本项目的结果,只需要运行my_MaxCut_test.py即可,依据测试算法需要相应的注释掉另外一个算法的测试部分(各一半,很好区分)。为了保证随机化算法的结果可以复现,在测试程序的开头已经将numpy、os的随机种子设置为‘2021’。
本项目没有参考任何互联网上的开源代码,仅凭自己对课程ppt的理解以及查阅相关论文完成,因而具体实现细节难免可能与纯正的NSGA-II和MOEA/D存在些微出入,具体实现详见下面的实现描述。
2.2 实现NSGA-II
-
解的表示:如任务一所述,采用二进制表示2分中的一个集合,1代表选中某个点,0代表不选。
-
初始种群:在给定的定义域内按照多维“联合均匀分布”生成每一个个体。
-
父代选择:使用binary-tournament,当需要选择一个父代时,从整个种群中随机选中2个个体,令两者进行适应性比较(这里是多维目标函数直接求和,比较谁更大),然后选择更优的那个作为一个父代返回。
-
遗传与交叉:bit-wise mutation, one-point crossover。
重复执行3)与4),直到产生的子代数量和初始种群数量相当,即20个。此时总共有40个备选解。
-
幸存者选择:首先对这40个解用Fast Non-dominated sorting算法进行rank排序,然后依次将rank最大(这里采用最大而不是最小,是因为我们的目标函数是maximize而不是minimize)的组添加到新种群中。当某个组如果加入种群则会导致总数超过20时,对这一个rank组采用Crosding Distance Assignment算法求解其中每个解得Q_distance值,然后选择其中Q_distance最大(增加了多样性)的数个加入新种群使得种群数量达到20。
-
终止条件:为了公平起见,同时也方便实现,直接采用全局迭代轮数限制作为终止条件。这里是100轮。
更为详细的说明,请参考代码注释。
2.3 实现MOEA/D
-
解的表示:同上,binary representation。
-
初始种群:同上,均匀随机生成。在这里每一个个体看做一个“子任务”,在产生初始种群的同时,还要生成每一个子任务的“权重”以及“邻居”,权重采用联合随机分布生成然后除以归一化系数使其和为1,邻居采用欧氏距离度量不同子问题的“权重靠近程度”并选择最靠近的5个点(自然会包含自己)作为每个子问题的“邻居(以及自己)”。
-
父代选择:在邻居空间内使用binary-tournament选择。即从每个子问题的5个邻居内选择2个解,比较二者的适应性程度(这里是依据2)中的权重对不同维度目标函数做线性加权和)并选更大的。
-
遗传与交叉:同上,bit-wise mutation, one-point crossover。
-
幸存者选择:每个子问题每一轮产生一个子代(这样每个epoch会产生20个子代节点,开销与NSGA-II相当),这个子代将会送给所有的邻居(包括自己)进行更新。这样可以同时兼顾局部性和全局性,对于训练收敛是大有裨益的。
-
终止条件:同上,跑满100轮。
更为详细的说明,请参考代码注释。
2.4 性能评价
非常遗憾由于regret ratio评估一轮的速度过于缓慢(使用cvxopt, 在5d任务中竟然需要一个小时以上!),本次实验并没有能够进行详细的数据统计和绘图。以下表格为一次运行的结果,超参数与复现方法见上节。
算法/维度 | 2d | 3d | 4d | 5d |
---|---|---|---|---|
NSGA-II | 0.382227 | 0.38433845 | 0.39006338 | 0.39418263 |
MOEA/D | 0.307415 | 0.315831 | 0.321141 | 0.33014727 |
算法的性能与参考值相比相对较差,主要的影响因素本人认为是:1)由于时间不足(以及手撸算法不够优化)导致训练没有办法设的太大,在作业中采用100轮,而ppt上的训练轮数动辄10^7,这样的训练量差距难免带来较大的性能损失。2)种群大小较少,无法很好地维护多个可能的最优解。3)MOEA/D算法的权重向量生成,在多维问题上并没有采用ppt上的均匀阶梯排列,而是选择了更容易实现的直接联合随机,这势必导致考虑的优化目标不够全面带来性能现将。
三、结束语
本次实验完整的实现了NSGA-II与MOEA/D在多目标MaxCut上的应用,通过本次实验我对于多目标优化问题的演化算法求解有了更加深入的认识,未来可能会在类似问题上(比如即将到来的数学建模美赛中)尝试使用基于演化算法的方法。
资源下载地址:https://download.csdn.net/download/sheziqiong/85650266