多目标粒子群算法MOPSOMatlab实现 测试函数包括ZDT、DTLZ、WFG、CF、UF和MMF等另外附有一个工程应用案例评价指标包括超体积度量值HV、反向迭代距离IGD、迭代距离GD和空间评价SP等粒子群优化算法PSO被塞进多目标优化场景里折腾后摇身一变成了MOPSO。这货最骚的操作就是能让一群粒子在多个互相掐架的目标函数里找到平衡点。今天咱们用Matlab实操一把顺手调戏几个经典测试函数最后拿个天线设计案例收尾。先上段粒子初始化的代码热热身function particles init_swarm(n, dim, lb, ub) particles repmat(struct(pos,[],vel,[],pbest,[]), n, 1); for i1:n particles(i).pos lb (ub-lb).*rand(1,dim); particles(i).vel zeros(1,dim); particles(i).pbest particles(i).pos; end end这段代码里每个粒子都带着随机生成的位置和零初速度开浪。注意这里的pbest个体最优初始化直接用了出生点位跟单目标PSO的套路差不多。边界约束用lb和ub框住防止粒子乱飞出宇宙。速度更新才是重头戏看这段核心操作w 0.6; % 惯性权重 c1 1.7; % 个体学习因子 c2 1.6; % 社会学习因子 for i1:swarm_size % 随机选全局引导者 guide repository(randi(size(repository,1)),:); % 速度更新公式 new_vel w * particle.vel ... c1*rand*(particle.pbest - particle.pos) ... c2*rand*(guide - particle.pos); % 速度钳制 new_vel max(min(new_vel, vmax), -vmax); % 位置更新 new_pos particle.pos new_vel; end注意这里全局引导者是从外部仓库随机挑的这招能有效维持解的多样性。速度更新公式里三个分量掐架——惯性项让粒子保持原方向个体项拽着往自己历史最优跑社会项又往群体最优蹭。这种三角关系让粒子在探索和开发之间反复横跳。多目标粒子群算法MOPSOMatlab实现 测试函数包括ZDT、DTLZ、WFG、CF、UF和MMF等另外附有一个工程应用案例评价指标包括超体积度量值HV、反向迭代距离IGD、迭代距离GD和空间评价SP等测试函数咱们重点玩ZDT1和DTLZ2这两个经典款。ZDT1的Pareto前沿是凸的30维变量折腾起来刚刚好function [f1, f2] ZDT1(x) f1 x(1); g 1 9*sum(x(2:end))/(length(x)-1); f2 g*(1 - sqrt(f1/g)); end而DTLZ2就是个球面分布的前沿扩展性极强想搞多少目标就搞多少function f DTLZ2(x, M) k length(x) - M 1; g sum((x(M:end)-0.5).^2); f zeros(1,M); f(1) (1g) * prod(cos(x(1:M-1)*pi/2)); for i2:M-1 f(i) (1g) * prod(cos(x(1:M-i)*pi/2)) * sin(x(M-i1)*pi/2); end f(M) (1g)*sin(x(1)*pi/2); end评价指标里HV超体积最实在算的是解集在目标空间占据的体积大小。Matlab里可以调用gamultiobj的输出结果做对比验证% 计算HV的骚操作 pareto_front load(DTLZ2_true_PF.dat); % 载入真实前沿 obtained_front [f1; f2]; % 算法得到的解 hv hypervolume(obtained_front, reference_point);注意参考点要选得比所有解都差通常取真实前沿各维最大值的1.1倍。当HV值越接近理论最大值说明解集质量越高。工程案例举个微带天线设计需要同时优化工作频带、辐射效率和尺寸。目标函数这样建模function [bandwidth, efficiency] antenna_design(x) % x包含介质厚度、贴片尺寸等参数 [S_params, farfield] run_cst_simulation(x); % 调用电磁仿真软件 bandwidth calculate_bandwidth(S_params); efficiency radiation_efficiency(farfield); end实际跑的时候要把MOPSO主循环和电磁仿真耦合虽然计算量爆炸但用并行计算加速后还能忍。最终得到的Pareto前沿能让工程师根据实际需求选择参数——要带宽大的还是效率高的随便挑。最后说个坑处理约束条件时千万别直接丢弃违规解。试试这个修复策略if any(x lb | x ub) % 随机重置越界维度 violated x lb | x ub; x(violated) lb(violated) rand(sum(violated),1).*(ub(violated)-lb(violated)); end这比简单截断更有利于保持种群多样性。MOPSO的实现就像炒菜火候参数设置和配料策略选择到位了才能炒出漂亮的Pareto前沿。