Page 131 - 《软件学报》2025年第5期
P. 131

孙百才 等: 代理辅助多任务进化优化引导的             MPI 程序路径覆盖测试用例生成                              2031


                 Surr_Model_Set_Train(P ), SurrModelSet(EvoPop j ), Best_Ind_Select(EstFit j ), CovFlag_CTSet_Etc(BestInd j ),  Mod_
                                   ∗



                                   np
                    (iter,CTSet,RealFit j )  的具体实施细节, 将分别在第  2.2–2.4  节中给出.
                 Upd

                 2.2   代理模型训练
                    基于进化优化的       MPI 程序路径覆盖测试用例生成过程中, 进化个体适应值的评价需要重复执行被测                          MPI 程
                 序, 而被测程序的反复执行需要高昂的计算成本. 鉴于此, 训练合理的代理模型, 用于代替                          MPI 程序的实际执行,
                 将能够显著降低      MPI 程序的执行成本.
                    训练代理模型之前, 需采样一定数量具有代表性的测试输入. 考虑到拉丁超立方采样已经成功应用于                                 MPI 程
                 序测试输入采样中, 且证明采样的测试输入集能够满足均匀分布                     [17] , 因此, 这里同样基于拉丁超立方采样, 获取具
                 有代表性的测试输入集, 其实施细节如下: 首先, 平均划分测试输入                   X  中每维变量   x i (i = 1,2,..., M) 的取值范围为
                                  k                                       R (k = 1,2,...,InSize) 内, 采样一个变量
                                                                           k
                 InSize 个区间, 记为   {R |k = 1,2,...,InSize} ; 然后, 在变量   x i  对应的每一区间
                                  i                                        i
                 值, 并把这                                                     InputSet (i = 1,2,..., M) 中, 不放回随
                          InSize 个变量值作为一个集合, 记为
                                                      InputSet  ; 最后, 依次在每一
                                                            i                     i
                 机提取一个变量值, 用以组合成一个测试输入, 直至               InputSet  为空. 至此, 把采样的  InSize 个测试输入作为一个集
                                                               i
                                 k
                 合, 记为  InputSet = {x |i = 1,2,..., M;k = 1,2,..., InSize} , 如公式  (3) 所示.
                                 i
                                                        1     1        1  
                                                        x     x   ...  x
                                                        1     2        M  
                                                                         
                                                                         
                                                                         
                                                                         
                                                        x 2  x 2  ...  x 2  
                                                                         
                                                        1     2        M  
                                                                         
                                              InputSet =    .  .  .  .                            (3)
                                                        .    .    .   .  
                                                                   .     
                                                        .    .        .  
                                                                         
                                                                         
                                                                         
                                                                         
                                                                         
                                                       x InSize  x InSize  ...  x InSize
                                                        1     2        M
                    采样具有代表性测试输入集合后, 需基于每一测试输入执行被测                      MPI 程序, 并计算出该测试输入对目标路径
                                                                                                   k
                 P ∗ np  内每一目标子路径的覆盖程度, 具体操作细节如下: 首先, 依次提取公式                 (3) 中每一行变量值     InputSet (k = 1,
                                                                       k
                             k                                   InputSet  执行一个  MPI 程序, 以此获取该测试输入
                 2,...,InSize) = {x |i = 1,2,..., M} , 即一个测试输入; 然后, 基于
                             i
                 实际遍历该     MPI 程序内每一进程       π j ( j = 1,2,...,N)  的子路径, 表示为  p j (InputSet )  ; 最后, 基于公式  (1), 计算
                                                                                 k
                                                                                   k
                         k                 ∗                k     ∗              Sim  . 相应地, 基于所有测试输
                 p j (InputSet ) 与相应目标子路径   p  的相似度, 即  InputSet  对于   p  的覆盖程度, 记为   j
                                                                  j
                                           j
                 入执行   MPI 程序后, 将计算的面向目标路径           P ∗   内每一目标子路径的覆盖程度矩阵表示为             CovMat = {Sim | j =
                                                                                                     k
                                                      np                                             j
                 1,2,...,N;k = 1,2,...,InSize}  , 如公式  (4) 所示.

                                                     Sim 1  Sim 1  ...  Sim 1  
                                                       1       2         N  
                                                                            
                                                                            
                                                                            
                                                       2       2         2  
                                                                            
                                                     Sim    Sim   ...  Sim  
                                                       1       2         N  
                                                                            
                                                                            
                                           CovMat =    .    .    .     .                          (4)
                                                      .      .     .    .   
                                                      .      .     .    .   
                                                                            
                                                                            
                                                                            
                                                                            
                                                                            
                                                      InSize  InSize    InSize  
                                                     Sim 1  Sim 2  ...  Sim  N
                                                                                        CovMat  内每一列覆
                    获取覆盖程度矩阵        CovMat  后, 需基于测试输入集合       InputSet  内每一行变量值与矩阵
                 盖程度, 形成对应目标路径        P ∗   内每一目标子路径的训练样本集, 其具体实施步骤如下: 首先, 提取                InputSet 内第  k
                                       np
                              k   k                                           CovMat  内第   行和第   列覆盖程
                                                     k
                 行变量值   InputSet = {x |i = 1,2,..., M} , 作为第   个训练样本的输入; 然后, 抽取          k      j
                                  i
                                                                   k
                                                                                           k
                                          j
                                                                                    ∗
                                                       ∗
                 度, 作为第   k 个训练样本面向第   条目标子路径         p  的输出, 即  Sim  ; 接着, 针对  P ∗   内  p  , 形成第   个训练样本, 记
                                                       j           j           np   j
                        k        k   k                                p  的 ∗    个训练样本组成的集合, 记为
                 为  Sample = (InputSet ,Sim )  ; 最后, 重复上述步骤, 直至形成对应        InSize
                        j             j                                j
                                            k
                 SampleSet j ( j = 1,2,...,N) = {Sample |k = 1,2,...,InSize}  .
                                            j
                    基于形成的样本集, 训练代理模型之前, 需选定合适的代理模型类型. 考虑到克里金模型                          (Kriging model) 已经
                 广泛应用于估计进化个体的适应值            [23,28] , 因此, 这里采用克里金模型作为代理模型类型. 随后, 这里将基于形成的
                                                            ∗
                 SampleSet j  , 训练对应目标路径  P ∗   内每一目标子路径   p  的代理模型, 记为    SurrModel j  . 合并所有代理模型, 得到
                                          np                j
                 对应  P ∗   内所有目标子路径的代理模型集合, 记为         SurrModelSet = {SurrModel j | j = 1,2,...,N} .
                      np
                    算法  2  给出了训练代理模型的伪代码, 即          Surr_Model_Set_Train(P ) . 算法  2  的输入为第  np 条目标路径  P ∗   ,
                                                                       ∗
                                                                       np                             np
                 输出为对应    P ∗   内所有目标子路径的代理模型集合          SurrModelSet . 算法  2  首先采样测试输入集合和计算覆盖程度
                           np
   126   127   128   129   130   131   132   133   134   135   136