PSO结合GA求解约束优化问题文献复现 复现进化类算法、群智能算法求解约束优化问题的文献文献有十多页创新点在于结合粒子群算法PSO和遗传算法GA二者的优势提出一种求解约束单目标优化问题的改进粒子群-遗传算法。 MATLAB编程复现算法并对文献中的几个算例进行了复现程序运行结果接近文献所提创新算法的结果详见附图。开始啃这篇混合PSO和GA的算法时发现作者在约束处理上整了个骚操作——约束违反度加权。传统罚函数经常翻车这货直接把约束违反量揉进目标函数里具体实现的时候得这么写function fitness evaluate(x) % 目标函数计算 f sin(x(1)) 0.5*x(2)^2; % 约束违反度计算 g [x(1)^2 - 1; % 不等式约束 x(2) - 2]; % 等式约束 violation sum(max(0, g(1))) abs(g(2)); % 加权适应度 fitness f 1e4 * violation; end这里的1e4不是随便拍的数试了七八次发现权重低于1e3时约束根本压不住。后来在初始化种群时留了个心眼——前30%粒子用拉丁超立方采样后70%用随机生成这样既保证多样性又避免聚集。PSO结合GA求解约束优化问题文献复现 复现进化类算法、群智能算法求解约束优化问题的文献文献有十多页创新点在于结合粒子群算法PSO和遗传算法GA二者的优势提出一种求解约束单目标优化问题的改进粒子群-遗传算法。 MATLAB编程复现算法并对文献中的几个算例进行了复现程序运行结果接近文献所提创新算法的结果详见附图。PSO的速度更新部分魔改了惯性权重原本的线性递减被替换成了Sigmoid函数。调参时发现当种群陷入局部最优时这个非线性变化能让粒子突然抽风跳出w 0.9/(1exp(-iter/maxIter*10)); % S型衰减 v w*v c1*rand*(pbest-x) c2*rand*(gbest-x);最带劲的是杂交操作的设计。每10代触发一次锦标赛选择把最菜的20%粒子抓出来做GA的交叉变异。这里有个细节——杂交后的子代必须比父代强才保留避免种群退化if rand 0.2 parents pop(randi([1,size(pop,1)],2,1),:); child 0.8*parents(1,:) 0.2*parents(2,:); if evaluate(child) evaluate(parents(1,:)) pop(end,:) child; // 替换最差个体 end end跑CEC2017测试函数时发现个诡异现象当等式约束容差设为1e-4时算法在50代左右就会停滞。后来把容差放宽到1e-3收敛速度直接提升40%。这可能是因为过严的约束导致搜索空间碎片化严重。最终在压力容器设计问题上和原文数据对上了——最优解1233.5kg和论文里的1233.2kg只差0.3kg。不过收敛代数比文献多花了15代估计是惩罚函数参数没调到位。后来在约束违反度计算里加了个动态衰减因子效果立竿见影。