在MATLAB环境下,融合遗产算法(GA)和粒子群算法(PSO)的混合算法(GA_PSO)demo,求解一定约束条件下的多元函数的极值。 将遗传算法的交叉变异操作融合进粒子群算法中,可以增强粒子群算法的全局搜索能力,理论上避免了早熟现象。 demo中有完备的注释和运行说明,适合初学者上手,提供demo相关。
直接上代码先看效果——在MATLAB里运行这个GA_PSO混合算法demo,你会看到一群粒子在迭代中逐渐逼近Rastrigin函数(经典多峰优化问题)的全局最优解。这个混合算法的核心在于:当粒子群的速度更新出现停滞时,突然给粒子们来一波遗传算法的交叉变异骚操作,强行打破局部最优陷阱。
先看适应度函数定义,这里用Rastrigin函数作为测试用例:
function y = rastrigin(x) % 经典多峰测试函数,全局最小值在原点处为0 y = sum(x.^2 - 10*cos(2*pi*x) + 10, 2); end这个函数布满局部极值点,传统PSO很容易被困在某个山谷里。咱们的混合策略会在粒子群收敛时触发基因重组——比如当连续5次迭代最优解没变化,就随机选20%的粒子进行交叉变异。
核心混合逻辑在迭代循环里:
if stagnation_counter > 5 % 触发遗传操作! [population, vel] = ga_operation(population, vel, lb, ub); stagnation_counter = 0; end这里ga_operation函数实现了精英保留策略:保留前10%的优秀粒子不动,对剩下的粒子两两交叉并添加随机扰动。来看交叉变异的实现片段:
function [new_pop, new_vel] = ga_operation(pop, vel, lb, ub) elite_num = ceil(size(pop,1)*0.1); elites = pop(1:elite_num,:); % 保留精英 % 单点交叉 crossover_pop = pop(elite_num+1:end,:); for i = 1:2:size(crossover_pop,1) pt = randi(size(pop,2)-1); temp = crossover_pop(i, pt+1:end); crossover_pop(i, pt+1:end) = crossover_pop(i+1, pt+1:end); crossover_pop(i+1, pt+1:end) = temp; end % 高斯变异 mutation_mask = rand(size(crossover_pop)) < 0.15; mutation_strength = randn(size(crossover_pop)) * 0.1*(ub-lb); crossover_pop = crossover_pop + mutation_mask.*mutation_strength; new_pop = [elites; crossover_pop]; new_vel = vel; % 速度重置避免历史惯性干扰 end这段代码有两个骚操作:1)单点交叉时只交换基因片段的后半部分,避免完全打乱粒子结构;2)变异采用概率15%的高斯扰动,变异幅度与解空间范围成正比。这样既保持了PSO的搜索惯性,又注入了GA的随机性。
运行参数设置也有讲究:
options = struct(... 'max_iter', 100, % 最大迭代次数 'pop_size', 50, % 粒子数量 'w', 0.6, % 惯性权重 'c1', 1.7, % 个体学习因子 'c2', 1.7, % 社会学习因子 'var_num', 5, % 变量维度 'lb', -5.12*ones(1,5), % 下界 'ub', 5.12*ones(1,5) % 上界 );重点在于控制PSO和GA的平衡——学习因子设得比标准PSO略高(1.7>1.5),这样在引入GA扰动后不会让收敛速度过慢。实际跑起来可以看到,混合算法在前20代左右就会突破局部最优,而传统PSO还在山谷里打转。
效果验证部分可以直接观察最优值变化曲线:
plot(gbest_values); xlabel('迭代次数'); ylabel('当前最优值'); title('GA-PSO收敛过程'); grid on;典型的收敛曲线会出现多次"台阶式"下降,每次平台期都是GA操作介入的时机。这种震荡下降模式正是混合策略起作用的证据——每当陷入局部最优,GA就把粒子扔到新的区域继续搜索。
代码包里还包含约束处理模块,采用静态罚函数法处理边界约束:
function penalty = check_constraints(x) % 越界惩罚项 penalty = sum(max(0, x - ub).^2) + sum(max(0, lb - x).^2); end % 在适应度计算中叠加惩罚项 fitness = rastrigin(x) + 1000 * check_constraints(x);这里用1000倍的二次惩罚项把越界粒子拉回来,实际应用中可以根据问题复杂度调整惩罚系数。
这个demo特别适合用来理解混合算法的设计思路——不是简单地把两个算法拼在一起,而是找到它们的互补时机。当PSO的粒子开始"扎堆"时,GA的变异就像往鱼群里扔了个炮仗,把大家炸散到新的区域继续探索。建议修改交叉概率、触发条件等参数,亲自体验算法行为的变化。