Page 227 - 《软件学报》2024年第6期
P. 227
钱忠胜 等: 结合 SVM 与 XGBoost 的链式多路径覆盖测试用例生成 2803
2. paths, level_depth←Get path information and compute level depth of test_data;
// 获取路径信息并利用公式 (14) 计算路径层级深度
3. Select the pre-trained model according to the input data type; // 根据数据类型选择预训练模型
4. count = 0; // 统计需训练的子模型数
5. num_model = []; // 保存子模型序列
6. precison_lst = []; // 保存子模型精度
7. sample←test_data; // 初始训练样本
8. WHILE (count < NN): // 插桩路径的所有子模型构建
9. submodel←modelTrain(sample); // 根据公式 (1)–公式 (4) 或公式 (5)–公式 (8) 训练不同子模型
10. precision←preciCompute(submodel); // 根据公式 (9) 计算模型精度
11. precison_lst.append(precision); // 保存子模型精度
12. sample←Update sample by next node; // 将下一个节点加入并更新样本
C-SVMXGBoost 模型. 其中, 第
13. count += 1;
14. IF precision >= SMT:
15. Save submodel;
16. num_model.append(count);
17. END IF
18. END WHILE
19. WHILE len(num_model) < NN: // 某个路径节点还未具有较优子模型
20. IF num_model[i] < > num_model[i+1]–1:
21. count = num_model[i] + 1; // 第 count 个路径节点缺失较优子模型
22. sample←Update sample by test_data and path nodes; // 更新样本
23. Select another pre-trained model to retrain the submodel that does not reach the threshold;
// 选择其他预训练模型来训练未达到阈值的模型
24. Select optimal submodel of the current node by Formula(10); // 通过公式 (10) 选择该路径节点的最优子模型
25. Save submodel;
26. num_model.append(count);
27. END IF
28. END WHILE
29. C-SVMXGBoost←Chain the submodels according to the order of path nodes;
// 根据公式 (11) 按路径节点顺序依次链接子模型
30. Output C-SVMXGBoost;
END
在算法 1 中, 第 1 行和第 2 行为模型训练样本准备阶段, 随机生成测试数据后将其输入插桩程序获取路径, 并
计算其路径层级深度. 在随机生成数据的基础上进一步筛选, 确保样本均衡. 第 3–7 行, 选择预训练模型, 初始化参
数及样本. 第 8–29 行, 构建 8–18 行训练每个路径节点的子模型, 计算模型精度并
更新样本, 统计子模型个数. 若其达到最优子模型阈值, 则将其保存; 若未达到, 将其丢弃. 第 19–28 行主要实现部
分路径节点最优子模型的筛选. 其中, 第 20 行和第 21 行寻找需进行二次训练模型的路径节点; 第 22 行和第
23 行, 设置样本, 选择与训练该路径节点子模型; 第 24–26 行筛选、保存当前路径节点的最优子模型. 第 29 行将
已完成的最优子模型依据路径节点顺序链接, 构建链式模型, 并在第 30 行输出.