1.多目标群体进化软件模块聚类方法,其特征主要包括以下步骤:
步骤1:面向对象语言编写的软件系统中,构造方法依赖图表示软件系统中方法之间的调用关系:顶点代表代码中的方法,边代表方法之间的调用关系;使用矩阵表示方法依赖图:若系统有n个方法,用集合F={f1,f2,…,fj,…,fn}表示,fj代表软件系统中的第j个方法,则软件系统方法依赖图用一个n×n的矩阵B来表示,若方法fi调用fj,则矩阵B的第i行第j列的元素值为1,即bij=1,若方法fi未调用方法fj,则B的第i行第j列的元素值为0,即bij=
0,矩阵B表示为:
其中i和j都为1到n之间的任意整数值;
步骤2:编码;模块聚类是软件系统方法集合的一个划分,假设模块聚类数量为m,聚类结果可以用集合C={c1,c2,...ck,...cm}表示,k为1到m之间的任意一个整数值,ck表示软件系统经过模块聚类后的第k个聚类,假设初始群体规模为N,群体中的第w个个体用Pw表示,则群体可以用集合P={P1,P2,...,Pw,...,PN}表示,w为1到N之间的任意一个整数值,该软件系统模块聚类方案可以用一个m×n的二维矩阵A编码,矩阵A的每一列代表一个方法,每一行代表一个模块聚类,则第w个个体在迭代到第t步时软件系统的模块聚类结果由 中每一个元素 的值决定,若方法fj属于ck聚类,则 中的第k行第j列的元素值为1,即而第j列的其它元素值为0,则第w个个体在迭代到第t步时的模块聚类编码表示为:t为迭代步数,其中t为正整数;
步骤3:构造软件模块聚类目标:软件模块质量MQ和逆向边数fit_derection,软件模块质量MQ:软件模块聚类后,第x个聚类和第y个聚类之间的耦合性用εx,y表示:第x个聚类的内聚性用μx表示:
x,y分别表示第x个聚类和第y个聚类,其中x,y为1到m之间的任意一个整数值,Fx和Fy分别表示第x个聚类和第y个聚类中的方法个数,Ex,y表示聚类x到聚类y的方法的引用次数,Mx表示聚类x内部方法之间的引用次数,将内聚性和耦合性结合起来用软件模块质量,第w个个体的软件模块质量MQw为:模块聚类的逆向边数fit_derection:
其中Vq代表第q个模块聚类集合,Vq补集 表示集合Vq和其补集合
之间逆向边数, 表示集合Vq和其补集合 之间逆向边数的最
小值;bij是方法依赖图矩阵B第i行和第j列的值;
步骤4:群体初始化,设定最大迭代次数r,初始化帕累托非支配解集为空,对群体每个个体代表的聚类方案确定模块聚类中心:根据软件系统的方法依赖图,计算每个顶点的度dc,顶点Vc作为聚类中心的概率值probc:每个顶点以probc概率被选做聚类中心,每个个体代表的聚类选取m个不重复的中心,其他方法随机选择一个聚类加入,由此初始化个体,其中c为1到n之间的任意整数值,顶点Vc代表第c个顶点,dc是第c个顶点的度,n是软件系统的方法个数;
步骤5:群体进化操作;对于个体w,首先计算其模块质量MQ和逆向边数fit_derection这两个聚类目标值,然后计算个体w中方法fj属于聚类g的概率Pwjg:其中1≤g≤m,MQjg方法fj属于聚类g时聚类g的聚类质量,fit_derectionjg表示方法fj属于聚类g时的聚类逆向边数;比较计算出的概率Pwjg,选取最大概率Pwmax=max(Pwj1,Pwj2,…,Pwjg)对应的聚类作为方法fj最终的聚类结果,对个体w中每个方法按此方式计算概率,取其最大概率对应的聚类作为其聚类,对群体中的每个个体都采用步骤5的进化操作更新每个个体的模块聚类;
步骤6:更新帕累托非支配解集;根据每个个体的聚类目标值:软件模块质量MQ和逆向边数fit_derection,由个体间非支配关系更新帕累托非支配解集:如果当前个体被帕累托非支配解集中某个解支配,则当前个体不用加入帕累托非支配解集;如果当前个体支配了帕累托非支配解集中某个解,则删除帕累托非支配解集所有被支配的解,并把当前个体加入帕累托非支配解集;如果当前个体和帕累托非支配解集中所有解都不存在支配关系,则并把当前个体加入帕累托非支配解集;
步骤7:重复迭代进行步骤5和步骤6,若达到最大迭代次数r,则结束整个步骤,帕累托非支配解集中的个体对应的聚类方案就是本软件模块聚类结果,输出聚类结果,否则重复执行步骤5到步骤6的操作,直到达到最大迭代次数。