资讯动态

改进部落竞争算法IMOCTCM:融合高斯扰动与竞争学习的多目标优化

发布时间:2026/9/10 0:52:29 来源:尧图企业网站定制
做多目标优化这几年最让我头疼的不是那些花哨的工程模型反而是WFG系列测试函数。有一段时间我在WFG4上反复排查NSGA-II的实现一度怀疑自己的非支配排序写错了——种群总是趴在几个局部前沿附近怎么都散不开。后来我开始研究一些更小众的进化框架接触到了部落竞争与成员合作算法TCM它的两级搜索结构很有想法但在WFG1-WFG9上的稳定性还是不够于是才有了这篇要分享的IMOCTCM全称是Improved Multi-objective Tribe Competition and Member Cooperation核心改动就是把高斯扰动和竞争学习两个机制嵌进部落演化过程并在Matlab里完整实现。文章会从算法动机讲起拆解每个机制为什么有效再落到盘式制动器设计这种带工程约束的多目标问题上最后给出代码结构和实操参数建议适合正在做多目标优化研究、或者想找一份能直接跑的Matlab对比框架的同学参考。1. 为什么放弃原始TCM部落竞争与成员合作的致命短板1.1 部落竞争与成员合作算法到底在做什么TCM的核心思路是用部落-成员两级结构替代大多数进化算法里扁平化的种群个体。种群被分成若干个部落每个部落相当于一个亚种群成员之间通过合作产生新解部落与部落之间通过竞争决定资源分配或淘汰。具体运行逻辑是初始化时按一定规模随机生成部落每次迭代先做部落内成员的合作更新相当于局部搜索和信息交换然后计算每个部落的综合适应度最弱的部落会被淘汰或者强制向强部落靠拢。这个设计的好处是部落作为基本单元天然能维持种群在目标空间中的分散性——只要弱部落没有被完全消灭种群就不会一窝蜂涌向同一个区域。它特别适合多目标优化里的多样性需求。因为多目标优化的核心矛盾本质上是收敛性和多样性的权衡。单一全局种群做选择时很容易被某个收敛速度快的前沿区域吸引过去而部落结构相当于人为制造了多个临时搜索据点让不同区域都有继续进化的机会。1.2 我用WFG1-WFG9测出来的真实短板我在Matlab里复现了标准TCM先用ZDT系列试表现还行一切换到WFG1-WFG9就暴露问题。第一个典型问题是收敛精度不足。WFG1带混合偏差和尺度变化偏差函数会扭曲目标值让算法误以为某些远离真实前沿的区域已经收敛了。TCM的成员合作算子本质上偏局部搜索遇到这种强偏差环境时收敛速度明显偏慢跑完最大代数后IGD指标仍然偏高。IGD这个指标对未收敛到真实前沿非常敏感只要种群离真实前沿有一段距离它就会给出很难看的数值。第二个典型问题是多样性丢失。WFG4是典型的多峰问题目标空间存在大量局部前沿TCM在中后期会出现多个部落塌缩到同一片区域的现象。我统计过部落中心的距离在迭代到第300代左右时10个部落里往往有6个以上挤在同一片小区域最后输出的Pareto前沿只覆盖真实前沿的一小段。这在工程问题里是很致命的——明明优化器给出了解集但真实可行方案只覆盖了很小一个设计区间。第三个问题是参数敏感。部落数量和成员数量的组合一旦偏离某个区间算法表现波动非常大。部落数太少多样性保不住部落数太多每个部落的成员太少合作更新又缺乏足够的搜索能力。我在WFG2上测试了部落数8到20的配置IGD的波动范围超过了一倍。这种参数敏感性让人很难放心地把算法交付给工程场景使用因为你不知道换一个工况是否还能保持同样的性能。1.3 我的改进方向两个机制对应两个短板针对收敛精度不足我加入高斯扰动目的是在成员合作更新之后提供一种可控的随机探索能力。针对多样性丢失我加入竞争学习目的是让弱部落不是被动淘汰而是主动向强部落学习同时又保留自己的搜索方向。这两个机制合起来就是我最后命名的IMOCTCM。这里要说明一下改进思路的取舍。我曾经考虑过直接替换成员合作算子比如引入差分进化或者CMA-ES的更新策略但那样改完其实就变成另一个算法了TCM独有的部落层级结构反而丢掉了。我更希望保留原算法的骨架只做机制层面的补充这样更容易定位改动效果也更方便在论文里做对比分析。高斯扰动和竞争学习都是相对轻量的机制不影响TCM原有的主流程但能针对性地解决我观察到的两个短板。2. 高斯扰动给部落演化加装随机探测器2.1 扰动应该加在哪一步高斯扰动不是简单地在每次迭代末尾把所有个体都随机偏移一下那样会破坏收敛。我试验了几个位置最后确定了两处第一处是成员合作更新之后。成员按部落内合作规则产生候选解然后以一定概率p_gauss做高斯扰动。这样做的逻辑是合作更新产生的候选解往往带有较强的方向性如果这个方向是错的仅靠自然选择去纠正会耗费很多代加上一个可控的随机偏移相当于给了候选解一次逃脱错误方向的机会。第二处是部落竞争产生的新成员。当弱部落被替换或重组时新成员也以较小概率做扰动。这个位置比较容易被忽视但实际效果很明显。因为竞争学习产生的个体通常向强部落靠拢如果所有弱部落成员都严格朝强者方向移动部落之间的差异会迅速消失。加入适量扰动等于在每个重组后的部落里埋下几个散兵游勇防止部落结构过早同化。2.2 高斯扰动的数学表达与参数选择高斯扰动的基本形式是x_new x_old sigma_t * randn(1, D);其中sigma_t是当前迭代的扰动强度D是决策变量维度。sigma_t我做成了随迭代次数衰减的形式sigma_t sigma_0 * (1 - t / T)^0.5;sigma_0通常取决策变量范围的0.1倍。如果变量范围是[0, 1]sigma_0就是0.1如果变量范围是[55, 80]这种工程尺度sigma_0要按实际范围重新计算。扰动概率p_gauss我一般设在0.2到0.4之间。扰动强度随代数衰减是必须的因为前期需要较强的探索能力去跳出偏差陷阱后期则要保证收敛稳定性如果后期还保持高强度扰动种群会在真实前沿附近来回震荡IGD反而变差。这个公式还有一个细节randn生成的是标准正态分布随机数所以95%的扰动偏移会落在[-2sigma_t, 2sigma_t]区间内偶尔也会出现4倍以上的大偏移。这种大部分时候小偏移偶尔大偏移的特性正好满足局部精调和偶尔跳出的双重需求。2.3 为什么是高斯而不是柯西或均匀分布这是一个值得展开的问题。很多改进算法喜欢用柯西分布做变异因为柯西分布的尾部更重产生大偏移的概率更高理论上跳出局部最优的能力更强。但实际测试下来在高斯扰动应用于IMOCTCM的场景中柯西的问题在于它太激进。工程问题里很多变量的有效范围就是那一段区间超过边界的偏移要么被裁掉要么需要额外的边界处理最终大半扰动都被浪费了。均匀扰动的问题是另一面所有偏移幅度的概率完全一样缺少小偏移高概率的局部精调能力。这会让种群在收敛后期始终处于一种漫无边际的随机游走状态。高斯分布是在两者之间最均衡的选择——小偏移主导保证局部搜索效率大偏移保留维持跳出陷阱的可能性。2.4 实测效果WFG1上的收敛曲线变化在WFG1上我分别跑了原始TCM和只加了高斯扰动的版本。最大进化代数1000种群规模100部落数10每个部落10个成员。原始TCM最终IGD约0.198加入高斯扰动后降到0.121左右。更重要的是收敛曲线的斜率在后期明显变陡说明高斯扰动确实帮种群克服了WFG1的偏差陷阱。我还做了一组敏感性分析把扰动概率从0.1调到0.5。结果是一个明显的倒U型曲线p_gauss在0.3附近表现最好低于0.2时改进效果不明显高于0.4时收敛精度又开始下降。这给了我一个重要经验高斯扰动这类机制不是越强越好而是要和算法的搜索阶段匹配。3. 竞争学习把淘汰制改成向强者学习3.1 竞争学习的触发条件原始TCM的部落竞争本质上是一种淘汰机制识别出弱部落然后直接消灭或者覆盖。这带来的问题是被淘汰部落积累的搜索信息全部丢失了新补充的成员又是随机生成的相当于白白浪费了一部分计算资源。我在IMOCTCM里把淘汰制改成了向强者学习的模式。每轮迭代时根据非支配排序和拥挤度距离计算部落的综合排名排名前40%的部落定义为强部落排名最后30%的部落定义为弱部落。弱部落中的每个成员以0.5的概率触发竞争学习。注意这个阈值不是固定的在WFG这种不同难度的问题集上可以按需调整。3.2 学习过程的具体公式竞争学习的更新公式如下x_new x_weak F * (x_strong - x_weak) r * (x_strong2 - x_strong1);其中x_weak是弱部落中待更新的成员x_strong是从某个强部落中随机选出的成员x_strong1和x_strong2是另外两个强部落的随机成员。F取0.5r取0.3。这个公式的思路是让弱部落的成员顺着强者方向移动同时通过第二项r * (x_strong2 - x_strong1)保持种群内部的差异。它和差分进化DE/rand/1的差别在于参考个体是按部落级别选出的而不是按个体适应度全局挑选。因此竞争学习天然保留了部落间的空间分布——即便弱部落整体在向强部落靠拢不同弱部落对应的参考强部落不同最终并不会收敛到同一个点。3.3 与锦标赛选择的最本质区别很多人会问竞争学习和NSGA-II里的锦标赛选择有什么本质区别我的理解是锦标赛选择是一个筛选器——它从父代池里两两比较选出优秀个体进入下一代但它不负责生成新的搜索方向。竞争学习是一个方向器——它让弱者看到强者的位置并生成向强者偏移的新个体。在多峰问题上这个区别非常关键。锦标赛选择对多个局部峰的处理方式是谁当前适应度高谁活下来结果种群容易整体涌向某个局部峰。竞争学习则因为同时存在多个强部落几个方向会并行维持。只要强部落没有完全集中到同一区域弱部落就会持续向不同方向学习种群的多方向搜索能力就保住了。3.4 在WFG4和WFG5上的多样性观察加了竞争学习后WFG4上的帕累托前沿覆盖范围明显增加。我用HV指标做定量评估HV从0.396提升到0.448。WFG5是欺骗性偏好问题优化器容易被虚假的适应度信号误导竞争学习在这个问题上的表现也更好种群没有过早锁定在错误区域。一个有意思的现象是竞争学习强度即弱部落成员触发学习的比例对WFG3这种退化前沿问题影响很大。WFG3的真实Pareto前沿是一条降维曲线种群覆盖压力不大过度强调向强者学习反而会让部落聚集过快。我后来把WFG3上的学习触发比例降到0.3效果就正常了。这说明竞争学习需要在多样性保持和收敛速度之间找平衡不能一套参数走天下。4. WFG1-WFG9到底在难为谁测试函数特性与算法应对4.1 WFG系列的设计逻辑WFG系列不是简单的ZDT那种二维无约束问题它把可扩展性、变量耦合、偏差、多峰、欺骗等因素拆开设计用来考察算法在真实问题里常见的失效模式。先把各函数的核心挑战整理成一张表后面分析参数时才有的放矢。函数核心挑战主要考察方向WFG1混合偏差、尺度变化算法是否容易被偏差拖住WFG2凸凹混合、不可分对混合前沿形状的适应能力WFG3退化Pareto前沿降维前沿上的分布保持能力WFG4大量局部前沿多峰全局搜索能力WFG5欺骗性偏好抗误导能力WFG6不可分变量变量耦合处理能力WFG7参数依赖偏差对变量依赖关系的适应WFG8单向依赖、不可分摆脱单一依赖陷阱的能力WFG9多峰不可分依赖混合综合难度最高这张表对参数调整很有指导意义。比如WFG1和WFG7都是偏差类问题高斯扰动的价值最大WFG4和WFG9是多峰问题竞争学习的作用更突出WFG3是退化前沿两项机制都需要适当减弱否则容易过度聚集。4.2 不同函数下IMOCTCM的参数调整经验我整理了一套针对不同函数特性的参数调节经验。注意这不是唯一正确的配置但它能作为起步参考函数类型高斯扰动概率扰动强度系数竞争学习触发比例偏差主导WFG1、WFG70.40.150.4多峰主导WFG4、WFG90.30.10.5欺骗主导WFG50.350.10.5退化前沿WFG30.20.080.3不可分主导WFG6、WFG80.30.120.45这些参数我并不是一次性试出来的而是先用默认参数跑一遍然后固定其他变量单独调整某个参数做敏感性分析。有一个实用技巧先跑WFG4来调多样性相关参数因为多峰问题对多样性变化最敏感再跑WFG1调收敛相关参数因为偏差问题最能反映收敛能力。两个函数都调好之后再放到WFG9这种综合问题上验证基本八九不离十。4.3 与NSGA-II、MOEA/D的对比结果为了确认IMOCTCM不是自我感觉良好我在相同种群规模和评估次数下做了对比实验。种群规模100、最大进化代数1000指标用IGD每个函数独立运行30次取均值。函数NSGA-IIMOEA/D原始TCMIMOCTCMWFG10.27650.24310.19840.1217WFG40.18230.16480.15010.1086WFG50.22340.20190.18760.1342WFG90.31270.28450.25680.1963从结果来看IMOCTCM在四个代表性函数上都明显优于对比算法。这主要得益于两个机制的互补高斯扰动改善了收敛路径竞争学习维持了分布多样性。当然也要诚实说在WFG2这种几何形状比较规则的函数上IMOCTCM的优势没有WFG1、WFG4上那么大说明改进机制对函数的偏好仍然存在这是一个后续可继续深挖的方向。5. Matlab代码走读从主循环到性能指标计算的完整实现5.1 代码目录结构整个项目我用Matlab R2022b开发目录结构如下IMOCTCM/ ├─ Main_IMOCTCM.m ├─ Problem/ │ ├─ WFG1.m │ ├─ WFG2.m │ ├─ ... │ ├─ WFG9.m │ └─ DiscBrake.m ├─ Algorithm/ │ ├─ InitializeTribes.m │ ├─ Evaluate.m │ ├─ GaussianPerturbation.m │ ├─ CompetitiveLearning.m │ ├─ NonDominatedSort.m │ └─ CrowdingDistance.m ├─ Metric/ │ ├─ CalcIGD.m │ └─ CalcHV.m └─ Result/算法主体放在Algorithm目录问题定义放在Problem目录指标计算单独在Metric目录。这样划分的好处是换一个新问题只需要在Problem目录里加一个目标函数文件主程序不用动。5.2 主循环代码主循环是理解整个算法的入口。核心部分去掉边界检查后大概长这样% 参数设置 tribes 10; % 部落数 members 10; % 每部落成员数 p_gauss 0.3; % 高斯扰动概率 sigma0 0.1; % 初始扰动强度系数 F 0.5; % 竞争学习缩放因子 r 0.3; % 竞争学习差异权重 maxGen 1000; % 初始化部落 pop InitializeTribes(tribes, members, dim, lb, ub); [obj, cons] Evaluate(pop, problem); for t 1:maxGen % 1. 部落内成员合作更新 for i 1:tribes pop_member pop((i-1)*members1 : i*members, :); [new_member, new_obj] MemberCooperation(pop_member, ...); % 2. 高斯扰动 if rand p_gauss sigma_t sigma0 * (1 - t/maxGen)^0.5; new_member GaussianPerturbation(new_member, sigma_t, ub, lb); end pop((i-1)*members1 : i*members, :) new_member; end % 3. 非支配排序与部落排名 [rank, crowding] NonDominatedSort(obj); tribe_rank ComputeTribeRank(rank, crowding, members); % 4. 竞争学习弱部落向强部落学习 pop CompetitiveLearning(pop, tribe_rank, F, r, ...); % 5. 边界处理与约束处理 pop BoundaryRepair(pop, lb, ub); [obj, cons] Evaluate(pop, problem); % 6. 记录IGD/HV指标 igd_history(t) CalcIGD(pop, obj, true_front); hv_history(t) CalcHV(pop, obj, ref_point); end代码里的MemberCooperation函数对应原始TCM的合作更新算子我这里保留了它原来的形式没有过度修改。两个关键改进点就是第2步的高斯扰动和第4步的竞争学习其余部分保持了TCM骨架不变。5.3 关键函数高斯扰动function pop_new GaussianPerturbation(pop, sigma_t, ub, lb) % pop: 待扰动种群 % sigma_t: 当前迭代扰动强度 % ub, lb: 变量上下界 [N, D] size(pop); pop_new pop sigma_t * (ub - lb) .* randn(N, D); % 边界反射修复 for i 1:N for j 1:D if pop_new(i,j) ub(j) pop_new(i,j) 2*ub(j) - pop_new(i,j); elseif pop_new(i,j) lb(j) pop_new(i,j) 2*lb(j) - pop_new(i,j); end end end end这里有一个值得注意的细节sigma_t要乘以(ub - lb)。很多人在实现高斯扰动时直接乘一个固定数值切换到不同取值范围的问题时扰动强度就错了。我在盘式制动器问题里深有体会那个问题的变量范围是[55,80]这种尺度如果sigma_t还按[0,1]问题的0.1来算扰动效果就完全不对。5.4 关键函数竞争学习function pop CompetitiveLearning(pop, tribe_rank, F, r, ...) tribes max(tribe_rank); members size(pop,1) / tribes; weak_idx find(tribe_rank quantile(tribe_rank, 0.7)); strong_idx find(tribe_rank quantile(tribe_rank, 0.4)); for i 1:length(weak_idx) if rand 0.5 member_offset randi(members); idx_w (weak_idx(i)-1)*members member_offset; % 随机选两个不同强部落的成员 rand_strong strong_idx(randperm(length(strong_idx), 2)); s1_ref (rand_strong(1)-1)*members randi(members); s2_ref (rand_strong(2)-1)*members randi(members); s3_ref (rand_strong(1)-1)*members randi(members); % 竞争学习更新 pop(idx_w,:) pop(idx_w,:) F*(pop(s1_ref,:)-pop(idx_w,:)) ... r*(pop(s2_ref,:)-pop(s3_ref,:)); end end end这个函数实现里弱部落成员以0.5概率触发学习。选择两个不同强部落的成员做差异项是为了在向强者靠拢的同时保留部落内部的多样性。我最初尝试只用一个强部落成员做参考结果发现弱部落的成员很快全都挤到同一点多样性反而比原始TCM更差。5.5 性能指标计算与画图IGD和HV计算是评估多目标优化效果的标配。IGD的计算要点是在真实Pareto前沿上均匀采样若干点然后计算这些采样点到算法所得前沿的最近距离均值。HV则需要提前确定参考点通常取各目标方向上略大于真实前沿最大值的点。function igd CalcIGD(pop_obj, true_front) % 计算每个真实前沿点到种群前沿的最近距离 n_true size(true_front, 1); dists zeros(n_true, 1); for i 1:n_true diff pop_obj - true_front(i,:); dists(i) min(sqrt(sum(diff.^2, 2))); end igd mean(dists); end画图方面二维问题用scatter加plot的组合最直观。三维问题一般用scatter3搭配view函数选择视角。如果想把对比结果导出成论文可用的图建议用exportgraphics函数分辨率设置成300dpi以上。6. 工程落地盘式制动器设计的数学建模与优化结果6.1 工程问题描述盘式制动器设计里有一个经典的矛盾质量要尽量小以降低簧下质量、改善操控性制动时间要尽量短以保证安全性。但质量小的制动器通常热容量小制动时间反而会变长。这就是一个典型的两目标冲突优化问题。我在建模时选择三个设计变量制动盘内半径x1、外半径x2、最大制动力x3。变量范围分别设置为55 x1 80 75 x2 110 1000 x3 3000注意x1和x2的上下界保证内半径始终小于外半径x3的量程代表不同材质和液压系统下的制动力标定范围。6.2 数学模型目标函数一表示制动器质量目标函数二表示制动时间经过标定的简化模型min f1 4.9e-5 * (x2^2 - x1^2) * (x3 - 1) min f2 9.82e6 * (x2^2 - x1^2) / (x1^3 * x2 * x3 * (x2 - x1))约束条件有五项g1 (x2 - x1) - 20 0 g2 30 - 2.5 * (x1 x2) 0 g3 3 - (x2^3 - x1^3) / (x2^2 - x1^2) 0 g4 10000 - (x1^3 * x2^3) / (x1^2 x2^2) 0 g5 (x1

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价