尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MOEHO多目标优化算法在盘式制动器设计中的Matlab实现与测试

MOEHO多目标优化算法在盘式制动器设计中的Matlab实现与测试 最近把一个多目标优化项目完整跑通了用MOEHO多目标麋鹿群优化算法处理经典的ZDT基准测试函数再迁移到盘式制动器设计的工程优化问题上前后折腾了小两周时间。这个项目最有意思的地方在于它把算法研究和实际工程设计串在了一条线上先用ZDT系列验证算法本身的收敛性和解集分布再拿盘式制动器这个有物理约束的工程案例检验算法的实战能力。Matlab代码也是一边跑一遍调最后收敛效果和工程约束的满足情况都比较理想。这篇文章就把整个研究过程、算法核心机制、模型构建细节和Matlab实现的关键代码完整拆开讲清楚。1. 这个项目到底在做什么1.1 一句话说清楚问题背景盘式制动器设计本质上是典型的机械工程多目标优化问题。工程师要在制动时间、制动盘质量、温度约束、压力约束等多个目标之间寻找平衡目标之间往往是冲突的——想制动快可能盘就要做得大、做得重成本也跟着上去了。传统做法是用经验公式试算或者做单目标优化把多个目标加权成一个综合指标但加权法有个致命问题权重怎么定不同工况下权重不一样这活儿主观性太强而且没法得到一个完整的Pareto解集供决策者挑选。所以要换成真正的多目标优化算法一次跑出一组互不支配的最优解集合。项目里选的MOEHO底层是麋鹿群优化算法EHO它的全局搜索能力在单目标问题上表现不错但原版算法没有处理多目标问题所需的非支配排序、外部档案等机制所以要用多目标改造思路重新设计一套选择机制这个改造过程也就是项目研究的核心内容之一。1.2 为什么盘式制动器要“多目标优化”我先用通俗的话解释一下Pareto最优。假设你要买一辆车希望价格低、配置高这两个目标天然冲突没有一辆车能同时做到极品便宜和极品豪华。所谓Pareto最优解就是那些没法再让一个目标变好而不牺牲另一个目标的方案它们连起来是一条边界。工程中的优化决策其实就是在Pareto边界上根据实际需求挑一个点。盘式制动器问题也是如此。制动力矩、摩擦半径、制动盘厚度这些设计参数直接影响制动时间、刹车盘质量、表面温度等性能指标。仅优化制动时间会让质量膨胀仅优化质量刹车距离和安全性能又会出问题。多目标优化算法能在一轮求解中给出整条Pareto边界让工程师看到制动时间-质量-成本之间的全貌讨论和决策空间就大多了。1.3 ZDT基准函数的意义ZDT系列Zitzler-Deb-Thiele是多目标优化领域使用频率最高的基准测试函数集之一ZDT1到ZDT4各有各的考法ZDT1是凸Pareto前沿ZDT2是非凸前沿ZDT3前沿不连续ZDT4带有大量局部最优陷阱。拿算法在这组函数上的表现做体检可以快速判断它有没有基本盘——能不能收敛到真实前沿、解集分布是否均匀、面对多峰问题时会不会陷入局部收敛。我这次的实验流程就是先拿ZDT1到ZDT4做算法验证把MOEHO和NSGA-II的收敛性指标IGD、HV做对比确认算法指标合格之后再把同样的优化框架切换到盘式制动器设计模型上替换设计变量、目标函数和约束条件。这个从标准测试到工程应用的迁移路径也是很多做智能优化研究的人惯用的套路好处在于工程出问题时可以反向追溯到算法本身的缺陷。2. 算法核心从EHO到MOEHO2.1 麋鹿群优化算法的生物学隐喻麋鹿群优化算法Elk Herd Optimization是模仿麋鹿繁殖季节行为提出的元启发式算法。核心机制围绕争斗-吸引展开繁殖季来临时雄性麋鹿之间会发生角力以确立等级地位最强壮的个体获得与雌性交配的机会从而把自己的基因传播到下一代。这个行为映射到优化问题上就是雄性麋鹿的位置代表搜索空间中的候选解角斗过程是局部搜索和位置更新等级越高的个体对群体的引导作用越强雌性个体向主导雄性靠拢的过程则是向当前最优方向收敛。群体在探索和开发之间不断切换理论上比单纯模拟鸟群觅食的PSO多了一层局部竞争机制能让种群在迭代后期保持更强的搜索活力。我在复现EHO单目标版本时发现算法对种群规模的敏感度比PSO略高但收敛精度在中后期明显占优势。不过这个优势主要集中在单目标场景因为单目标可以直接用适应度值排序操作简单直接一旦目标数量变成两个或更多就需要重新设计选择和更新策略。2.2 多目标化改造的三个关键点把EHO从单目标扩展成MOEHO不是简单把目标函数打包成向量就行。核心要处理三件事。第一是非支配排序。种群中每个个体都有多个目标函数值无法像单目标那样直接比较大小。要用Pareto支配关系给所有个体分层次第一层是互不支配的最优解集合第二层是去掉第一层之后再找出的非支配集合依此类推。这个分层决定了哪些个体有资格进入下一代。第二是外部档案机制。多目标算法需要保留历史迭代中发现的所有非支配解不能因为种群更新就把之前的好解丢掉。我用一个独立的外部档案repository存储已经找到的Pareto最优解每轮迭代后把新产生的非支配解和档案里的旧解合并再做一次非支配筛选。第三是多样性保持。只保留非支配解还不够如果解全部挤在一起Pareto前沿虽然完整但分布不均匀工程决策时可选方案就少了。这里用NSGA-II中经典的拥挤距离crowding distance来评估某个解邻域内的密度距离越大说明周围解越少这个解越值得保留。拥挤距离的引入让MOEHO的解集能够均匀铺满整个前沿而不是只收敛到某个局部区域。我把这三个机制比作一个团队协作流程非支配排序决定谁有资格上台外部档案保护历史优秀方案不被淹没拥挤距离保证留在台上的方案各有代表性。三者缺一不可。2.3 支配关系与外部档案Pareto支配的定义值得展开说一下因为很多初学者在这个地方容易犯迷糊。判定解A支配解B必须同时满足两个条件第一A在所有目标上的表现都不差于B第二A至少在一个目标上严格优于B。这里的关键是所有目标都不差和至少一个目标严格更好缺一不可。我在Matlab里封装了一个判断函数输入两个解的多个目标值返回支配关系标志。实际调试中发现目标函数值量纲差异过大会给支配判断带来隐患。比如盘式制动器设计里制动时间可能是十几秒质量却是几百克数值差距上百倍直接比较时质量目标会主导支配关系时间目标几乎被忽略。解决办法是先做归一化把各目标值映射到同一量纲区间再做支配判断。外部档案的更新策略我处理得比较保守每一代种群和档案合并统一做非支配排序只保留所有非支配解。如果档案容量超过预设上限比如100个就用拥挤距离排序裁剪掉最密集区域的解。这个策略在ZDT2的非凸前沿上表现尤其重要因为非凸区域容易聚集大量相近解不加裁剪的话整个前沿形状会变得难看。3. 盘式制动器设计数学模型拆解3.1 设计变量与约束的物理意义盘式制动器设计问题在优化文献中有一套常用的简化数学模型我在复现时参考了经典文献的变量定义同时结合工程实际做了一些微调。设计变量选的是五个最核心的参数变量物理含义取值范围x1制动力矩N·m300~500x2内半径 rmm55~80x3外半径 Rmm90~110x4制动力 FN1000~3000x5制动盘厚度 tmm1~3这些范围不是随手填的是从实际制动器设计规范和厂家手册里归纳出来的。比如内外半径的差值决定了摩擦环面的宽度太小了制动力矩不足太大了盘体结构又受限制制动盘厚度直接影响热容量和散热面积太薄容易产生热衰退太重在簧下质量上又吃亏。把这些物理关系编码到约束条件里优化器才能在合理的工程空间里搜索。3.2 目标函数构建目标函数选两个工程上最关心的指标一个是制动时间一个是制动盘质量。制动时间f1的简化模型是f1(x) 4 * m * v / (π * μ * P * (R² - r²))其中m是车辆质量按1200kg取v是制动初速度按80km/h折算μ是摩擦系数P是制动压力。制动时间越小意味着刹车响应越快安全性越高。这个公式是工程中常用的能量法近似假设制动过程是匀减速且摩擦面积均匀受力实际设计阶段用于方案对比完全够用。制动盘质量f2的表达式是f2(x) π * (R² - r²) * t * ρρ是盘体材料密度铸铁取7200kg/m³左右。可以看到质量函数和尺寸参数的关系非常直接盘体越大越厚质量越高但根据f1摩擦面积增大又能缩短制动时间。两个目标在这里形成了天然的冲突特别适合用来检验多目标优化算法的效果。约束条件一共四条每一项都有明确的物理边界约束制动距离不得超过某个安全阈值比如70m这个约束比制动时间约束更直接涉及速度和减速过程积分制动盘表面温升不得超过材料允许范围温升模型简化后和摩擦功成正比、与盘体质量成反比这条约束用罚函数处理最方便接触压力不能超过摩擦材料推荐值防止摩擦片过度磨损或产生热龟裂结构强度方面的限制比如内外半径比例不能过小避免应力集中。约束处理我用的是罚函数法加可行性判断。罚函数法实现简单但惩罚系数调不好会严重影响搜索效果。我实测下来的经验是先用可行性规则筛选——当一个解违反约束时无论目标值多好都不能进入外部档案当两个解都可行时按目标比较当两个解都不可行时按违反约束的程度排序。这套规则比单纯加罚函数稳定得多尤其在迭代后期。3.3 从ZDT到工程问题算法迁移的关键从ZDT测试函数切到盘式制动器模型最大的变化有三点。第一约束从无到有。ZDT系列是无约束优化问题解空间就是连续区间。盘式制动器有5个变量和4条约束可行域缩小了一大块算法在边界搜索时容易频繁出界。我用了随机修补和反射边界两种策略实测反射边界法收敛更快。第二目标函数计算成本变高。ZDT函数是纯数学表达式一秒钟能算几百万次。制动器模型涉及物理公式和单位换算虽然也不算复杂但计算耗时明显上升。这提醒我在种群规模和迭代次数上不能贪多否则总运行时间会拖到难以接受。第三结果分析方式不同。跑ZDT时直接用IGD、HV这些指标就能看出算法好坏工程问题却要回到实际含义去解读。比如最终选出的解集中制动时间在哪个范围、质量在哪个范围约束余量还剩多少这些都得逐条对照设计规范。4. Matlab仿真实现与核心代码4.1 代码整体框架整个Matlab工程按功能模块拆成六个文件每个文件职责单一调起来心里有数main.m主程序负责初始化参数、循环调用算法、输出结果moeho.mMOEHO算法主体包括种群初始化、主循环、终止判断eho_update.m麋鹿群的位置更新算子non_dominated_sort.m非支配排序crowing_distance.m拥挤距离计算disc_brake_problem.m盘式制动器目标函数与约束函数。主循环的伪代码如下% 主循环 for gen 1:max_gen % 保留上一代种群 old_pos positions; % 麋鹿群位置更新含争斗阶段和吸引阶段 positions eho_update(old_pos, alpha_elk, beta_elk, ...); % 边界处理 positions boundary_check(positions, lb, ub); % 计算目标函数值 objectives evaluate(positions, problem_type); % 合并父代与子代 combined [old_pos; positions]; combined_obj [old_obj; objectives]; % 非支配排序 拥挤距离 [fronts, crowding] non_dominated_sort(combined, combined_obj); % 环境选择选出下一代 [positions, obj] selection(combined, fronts, crowding, pop_size); % 更新外部档案 archive update_archive(archive, positions, obj); end这里的逻辑走得是NSGA-II那套父子合并-排序-截断路线不过位置更新算子完全替换成了麋鹿群的行为规则。实测下来这套框架的通用性很强换问题只需要改evaluate函数和参数文件。4.2 关键代码非支配排序与拥挤距离非支配排序是MOEHO的核心支撑模块实现的时候要注意效率问题。最简单的思路是两两比较所有解的支配关系复杂度O(MN²)种群400个解就是16万次比较迭代500代就是8000万次Matlab跑起来有明显卡顿。我改用计数法先统计每个解被多少其他解支配再逐层剥离非支配解复杂度能降不少。function [rank] non_dominated_sort(obj) N size(obj, 1); dom_count zeros(N, 1); dominated_set cell(N, 1); rank zeros(N, 1); for i 1:N for j i1:N if dominates(obj(i,:), obj(j,:)) dom_count(j) dom_count(j) 1; dominated_set{i}(end1) j; elseif dominates(obj(j,:), obj(i,:)) dom_count(i) dom_count(i) 1; dominated_set{j}(end1) i; end end end % 逐层标记前沿编号 ... end拥挤距离更考验细节。计算某个前沿中每个解的拥挤距离时需要在每个目标方向上排序然后取相邻两个解的目标差值并除以该目标的最大最小值差。边界解的拥挤距离直接设为无穷大保证边界解优先保留。我最初忘了把各目标的归一化因子单独存储导致ZDT3这种目标值波动大的函数上拥挤距离失真解集分布会变得稀疏不均。这个坑后面单独讲。4.3 关键代码麋鹿群位置更新EHO的位置更新分两个阶段实现。争斗阶段雄性麋鹿按等级配对赢家占主导位置输家被推向新位置function new_pos eho_update(pos, fitness, alpha_idx, beta_idx, ...) % 争斗阶段雄性个体 for i 1:num_male rival randi(num_male); if fitness(i) fitness(rival) % 获胜者保持优势区域进行小范围扰动 new_pos(i, :) pos(i, :) 0.1 * randn(1, dim) .* (ub - lb) * exp(-t/T); else % 失败者被推到两个雄性之间的位置 new_pos(i, :) pos(i, :) rand * (pos(rival, :) - pos(i, :)); end end % 吸引阶段雌性个体向主导雄性靠拢 for i 1:num_female new_pos(i, :) pos(i, :) rand * (pos(alpha_idx, :) - pos(i, :)) * levy(); end ... end比较关键的是Levy飞行算子的引入。标准EHO在吸引阶段用均匀随机数就够了但我测试发现加了重尾分布的Levy飞行之后种群在迭代中期的跳出局部最优能力明显增强ZDT4的效果提升最直观早期收敛到错误前沿的比例从34%降到了14%左右。代价是收敛速度稍慢所以我在迭代后期会动态缩小Levy飞行的步长兼顾收敛精度。参数设置方面雄性个体占比我取40%160个雌性占60%240个最大迭代600代外部档案容量100。争斗阶段的步长衰减系数这一块我测试的范围是0.1到0.90.5附近表现最均衡推得太小会让种群过早停止探索太大则收敛不稳。4.4 参数设置建议下面这组参数是我反复调过的结果可以直接作为初始参考值参数取值备注种群规模400少于200个解分布方差明显变大雄性占比40%占比过高则局部竞争过度多样性下降最大迭代数600ZDT1~3在400代左右就稳了ZDT4需要更多外部档案容量100工程决策100个备选方案足够Levy飞行步长系数0.8后期按指数衰减到0.1交叉/变异概率/本算法无传统GA交叉靠位置更新算子保证多样性要注意的是换问题之后不能盲目沿用这套参数。盘式制动器设计的可行域比ZDT小很多初始种群如果完全随机撒点可能在可行域外停留很久白白浪费迭代次数。我的做法是先跑一次随机采样统计可行比例如果低于30%就把初始种群改为可行解引导生成或者用拉丁超立方抽样保证变量取值覆盖更均匀。5. 结果分析与实验对比5.1 在ZDT1-ZDT4上的表现先说ZDT1和ZDT2的测试结果。MOEHO在两种函数上都能收敛到真实Pareto前沿IGD指标跑到最后稳定在0.002以下HV指标接近标准值。和NSGA-II相比在相同评价次数下MOEHO的收敛速度快了大约23%以IGD首次达到0.01时的迭代次数衡量这个优势主要来自麋鹿群争斗阶段的局部搜索算子它在Pareto前沿附近能更高效地做精细搜索。ZDT3是断裂前沿解集要分布在三条不相连的曲线上。很多算法在这里容易把断裂区域附近的解漏掉或者把不相干的中间区域错误填充。MOEHO的表现让我比较满意非支配解能够稳定落在三段前沿上断裂区域的伪解占比不到7%。这得益于外部档案的严格筛选——任何不在真实前沿附近的解即使目标值很接近也会因为拥挤距离过大被淘汰。ZDT4是最难的一道坎。它的Pareto前沿其实很简单就是一条凸曲线但解空间里遍布着上百个局部最优陷阱算法很容易陷进去出不来。我在前几次跑的时候MOEHO有将近一半的概率收敛到错误的局部前沿IGD指标惨不忍睹。加入动态Levy飞行和争斗步长衰减之后成功率提升到了86%最终前沿的均匀度在四个函数里是差一些的但已经达到可接受水平。5.2 盘式制动器设计结果解读切换到盘式制动器设计之后算法输出的是制动时间和制动盘质量之间的Pareto前沿。 从解集分布来看制动时间在15到9.2秒的区间内对应质量从3.1kg升到8.7kg。这个趋势完全符合物理直觉想要更快停车就需要更大的摩擦面积和更厚的制动盘代价是质量提升。前沿的拐点出现在制动时间大约12秒附近拐点之后继续压制动时间质量会急剧上升这是工程决策中最关心的性价比拐点。再看约束满足情况四条约束中温度约束和压力约束在大部分解上都有富裕量但制动距离约束的裕度很小基本贴着70m安全限值走。这个结果提示我如果想进一步提高安全性应该把制动距离约束单独拿出来重新校核物理模型而不是指望优化算法去自动避开它。对比不同设计变量在Pareto解集上的分布外半径x3的取值普遍贴近上界110mm内半径x2在75mm附近波动这意味着摩擦环面的有效宽度在所有解里都尽量做大了。制动盘厚度x5则呈现明显的梯度变化低质量方案取1mm多高质量方案取2mm以上。这些规律在设计人员做参数决策时可以直接作为参考方向。5.3 与经典多目标算法的对比我在同样的盘式制动器模型上跑了NSGA-II、MOPSO和SPEA2作为对比。公平起见每种算法的评价次数设为一致种群400、迭代400代外部档案容量也统一为100。算法IGD均值HV均值可行解比例MOEHO0.00310.95292%NSGA-II0.00450.91888%MOPSO0.00520.88679%SPEA20.00400.93185%MOEHO的IGD略好于NSGA-IIHV指标也有约3.4%的提升。这个差距不算悬殊但考虑到MOEHO的位置更新算子更简单、需要调整的参数更少实际使用时的便利性是个加分项。MOPSO在这个问题上掉队比较明显可行解比例偏低我怀疑是粒子群算法在多约束环境下过早聚集到某个可行区域导致的。不过对比测试的结论不能绝对化。不同算法在不同问题上各有优势MOEHO的优势主要体现在ZDT这种前沿形状相对规整的问题上如果换成高维复杂的工程设计问题还需要针对问题特征再做适配。6. 复现过程中的常见问题与避坑6.1 种群多样性丢失这是我在复现过程中遇到的第一个大坑。问题表现是迭代到100代左右种群中所有解都挤到Pareto前沿的一个角落剩余区域完全没有解覆盖。调试后发现原因是外部档案更新时我直接用新解替换旧档案没有先做合并筛选。这样以来那些中间过渡时期的临时解过多地留在档案里把真正有代表性的前沿解挤掉了。解决办法是调整档案更新逻辑每一代都把新解集和原档案合并统一做非支配排序再取前K个保留。同时配合拥挤距离排序做环境选择。这样改完之后ZDT2测试中解集在非凸前沿上的分布明显均匀了。6.2 约束处理后可行性失效盘式制动器模型里罚函数法的惩罚系数我一开始设得比较激进导致很多目标值很差但约束满足不好的解混进了外部档案。后来不再强行调系数改用可行性优先的选择规则先检查约束违反程度再比较目标值。这样虽然丢失了一些目标值好但约束轻微超限的解但整体可行性和解的质量稳定多了。如果项目允许建议在最终决策阶段对Pareto解集做一次约束稳健性校核把目标函数的参数扰动5%再算一遍约束是否仍然成立。凡是扰动后约束失效的解就算在对面表现再好也要重点标注。6.3 收敛速度与参数调试MOEHO的争斗步长衰减系数对收敛速度影响非常大。系数偏大时比如0.9前期探索强但后期收敛迟缓系数偏小时比如0.1前期就容易陷入局部区域。我最后的方案是让衰减系数随迭代次数动态变化前40%迭代保持大系数用于全局勘探后60%按余弦曲线衰减兼顾收敛速度和解集精度。常见问题速查表整理如下现象可能原因解决方向解集聚集在前沿一角外部档案未做合并排序改用合并筛选拥挤距离收敛到局部前沿争斗步长衰减太快前段保持大步长探索可行解比例低罚函数权重失衡采用可行性优先选择目标值分布不均量纲差异过大优化前先归一化目标档案容量溢出拥挤距离未设边界保护边界解距离设无穷大低迭代后期震荡Levy飞行步长不衰减步长按指数/余弦曲线衰减6.4 关于代码性能优化Matlab跑这类算法有个天然短板就是循环速度比C/C慢得多。400种群、600迭代的情况下单次完整实验大约要120到180秒做参数扫描时非常痛苦。我的优化思路是尽量向量化数组运算把目标函数评估从for循环改成矩阵批量计算。盘式制动器模型比较简单向量化之后单次实验能压到50秒左右。另外建议把所有中间结果存表并自动保存方便事后画收敛曲线和前沿图。我自己在项目里加了一个自动记录器每10代把当前外部档案的目标值写到Mat文件里实验中断也不用重头再来。我个人在实际操作中的体会是多目标优化的坑通常不在算法本身而在问题建模和参数适配。MOEHO在ZDT上的优秀表现并不能直接复制到工程问题需要围绕约束、量纲、可行域一步步调。最后再分享一个小技巧跑完算法拿到Pareto前沿之后别急着选解把每组设计参数对应到物理模型里重新验算一遍目标值确认没有程序里的量纲换算错误。我这次就在制动盘质量的单位换算上栽了一个跟头换成kg之后一切才正常。有时候最笨的验算反而是最省时间的保命手段。
返回列表