遗传-粒子群自适应优化算法--MATLAB 两个算法融合且加入自适应变化的权重和学习因子
遗传-粒子群自适应优化算法--MATLAB 两个算法融合且加入自适应变化的权重和学习因子
当遗传算法和粒子群开始组CP,优化界突然有了新的打开方式。这俩算法一个擅长全局撒网,一个精于局部突击,把他们的优势揉碎了重组,再配上自适应参数调节,效果堪比算法界的鸳鸯锅——清汤红汤自由切换。
先看核心的自适应公式设计。权重ω这个调节器要是能自己变聪明,算法就能在勘探和开发模式间丝滑切换:
% 自适应惯性权重计算 omega = omega_max - (omega_max - omega_min) * (iter/Max_iter)^2; c1 = c1_max - (c1_max - c1_min) * iter/Max_iter; c2 = c2_min + (c2_max - c2_min) * iter/Max_iter;这个设计挺有意思——初期让惯性权重保持较大值方便全局探索,随着迭代次数平方衰减,后期收缩更快。社会学习因子c2反向操作,越往后越重视群体经验,避免早熟。
遗传-粒子群自适应优化算法--MATLAB 两个算法融合且加入自适应变化的权重和学习因子
交叉变异操作是遗传算法的精髓,这里用锦标赛选择搭配两点交叉:
% 遗传操作部分 parent1 = pop(randi(pop_size), :); parent2 = pop(randi(pop_size), :); cross_point = sort(randperm(dim,2)); child = [parent1(1:cross_point(1)),... parent2(cross_point(1)+1:cross_point(2)),... parent1(cross_point(2)+1:end)];注意这里交叉点随机选两个位置,比单点交叉能保留更多模式。变异操作加了高斯扰动,标准差随迭代减小:
mutate_gene = rand(1,dim) < mutate_rate; child(mutate_gene) = child(mutate_gene) + sigma*randn(1,sum(mutate_gene));主循环里粒子更新逻辑藏着小心机——每5代来一次群体大换血:
if mod(iter,5) == 0 [~,idx] = sort(fitness); pop(idx(1:replace_num),:) = init_pop(replace_num,dim,lb,ub); end这种周期性重启机制专治各种局部最优卡壳,相当于给算法打强心针。速度更新公式把PSO的经典操作和GA的交叉变异缝合得毫无违和感:
v = omega*v + c1*rand*(pbest - pop) + c2*rand*(gbest - pop); pop = pop + v; pop = max(min(pop,ub),lb); % 越界处理拿Sphere函数试刀,迭代曲线前100代下降迅猛,到300代左右开始精细调参。有意思的是对比纯PSO版本,混合算法在后期仍保持明显震荡,说明全局搜索能力持续在线。
这种混血算法最大的爽点在于:当粒子们开始扎堆内卷时,突然一波遗传变异直接把舒适区掀翻。参数的自适应调整就像自动驾驶,前期广撒网后期精收网,省去了手动调参的玄学操作。
(测试代码可自行替换目标函数,建议先用-5.12~5.12范围的经典测试函数开箱体验。注意交叉概率别超过0.3,变异率控制在0.1以下,否则容易变成布朗运动现场)
