自组织遗传算法(Self-Organizing Genetic Algorithm, SOGA)求解Rastrigin函数优化问题
前言
提醒:
文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。
其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。
内容由AI辅助生成,仅经笔者审核整理,请甄别食用。
文章目录
- 前言
- matlab代码
- 代码分析
- 一、目标函数:Rastrigin函数
- 二、SOGA核心机制解析
- 1. 种群初始化与个体结构
- 2. 遗传操作:交叉与变异
- 3. 自适应变异率衰减
- 4. 个体活性监控与自重启
- 5. 选择机制
- 三、算法流程总结
- 四、可视化分析
- 五、SOGA与传统GA的对比
- 六、总结
matlab代码
clc; clear; close all;
%%SOGA(Self-Organizing Genetic Algorithm,自组织遗传算法)
%%SOGA 的核心是种群的自组织演化,通过设计内部
% 自我调节机制(如个体活性监控、自主重启)维持多样性,减少人工干预。
%% 参数设置
nPop = 50; % 种群大小
nVar = 2; % 变量维度
MaxIt = 100; % 最大迭代次数
pc = 0.8; % 交叉率
pm = 0.3; % 初始变异率
mutationDecay = 0.99; % 变异率递减因子
stagnantLimit = 10; % 判断失活个体的代数阈值VarMin = -5.12; % 变量下界
VarMax = 5.12; % 变量上界%% Rastrigin函数
rastrigin = @(x) 20 + x(1)^2 - 10*cos(2*pi*x(1)) + ...x(2)^2 - 10*cos(2*pi*x(2));%% 个体结构体
empty_ind.Position = [];
empty_ind.Fitness = [];
empty_ind.StagnantCount = 0;%% 初始化种群
pop = repmat(empty_ind, nPop, 1);
%将一个名为 empty_ind 的空个体(或模板)复制 nPop 次,并按列方向堆叠,
% 从而初始化一个包含 nPop 个个体的种群矩阵 pop
for i = 1:nPoppop(i).Position = (VarMax - VarMin) * rand(1, nVar) + VarMin;pop(i).Fitness = rastrigin(pop(i).Position);
end% 初始化最优解
[~, bestIdx] = min([pop.Fitness]);
BestSol = pop(bestIdx);%% 可视化初始化
[xgrid, ygrid] = meshgrid(linspace(VarMin, VarMax, 100));
zgrid = arrayfun(@(x, y) rastrigin([x, y]), xgrid, ygrid);
figure;
contour(xgrid, ygrid, zgrid, 50); hold on;
xlabel('x'); ylabel('y'); title('SOGA 优化过程');
colormap jet;%% 主循环
for it = 1:MaxIt% 交叉offspring = [];for k = 1:2:nPopif rand < pci1 = randi(nPop);i2 = randi(nPop);alpha = rand;child1.Position = alpha*pop(i1).Position + (1-alpha)*pop(i2).Position;child2.Position = (1-alpha)*pop(i1).Position + alpha*pop(i2).Position;child1.Position = max(min(child1.Position, VarMax), VarMin);child2.Position = max(min(child2.Position, VarMax), VarMin);child1.Fitness = rastrigin(child1.Position);child2.Fitness = rastrigin(child2.Position);child1.StagnantCount = 0;child2.StagnantCount = 0;offspring = [offspring; child1; child2]; %#ok<AGROW>endend% 变异for i = 1:nPopif rand < pmmutant = pop(i);mutant.Position = mutant.Position + 0.1 * randn(1, nVar);mutant.Position = max(min(mutant.Position, VarMax), VarMin);mutant.Fitness = rastrigin(mutant.Position);mutant.StagnantCount = 0;offspring = [offspring; mutant]; %#ok<AGROW>endend% 合并种群pop = [pop; offspring];% 选择最优个体[~, sortIdx] = sort([pop.Fitness]);pop = pop(sortIdx);pop = pop(1:nPop);% 更新最优解if pop(1).Fitness < BestSol.FitnessBestSol = pop(1);end% 检测失活个体(自组织重启)for i = 1:nPopif isequal(pop(i).Fitness, rastrigin(pop(i).Position))pop(i).StagnantCount = pop(i).StagnantCount + 1;elsepop(i).StagnantCount = 0;endif pop(i).StagnantCount >= stagnantLimitpop(i).Position = (VarMax - VarMin) * rand(1, nVar) + VarMin;pop(i).Fitness = rastrigin(pop(i).Position);pop(i).StagnantCount = 0;endend% 变异率自适应调整pm = pm * mutationDecay;%迭代初期保持高探索性,% 后期聚焦于局部开发,平衡全局搜索与局部精修% 三维可视化cla;surf(xgrid, ygrid, zgrid, 'EdgeColor', 'none'); hold on;colormap jet;shading interp;% 绘制粒子位置X = [pop.Position];X = reshape(X, nVar, [])';Z = arrayfun(@(i) rastrigin(X(i,:)), 1:size(X,1));plot3(X(:,1), X(:,2), Z, 'r.', 'MarkerSize', 15);% 绘制当前最优粒子zBest = rastrigin(BestSol.Position);plot3(BestSol.Position(1), BestSol.Position(2), zBest, 'kp', 'MarkerSize', 12, 'MarkerFaceColor','y');% 设置视角和标签view(135, 45); % 设置良好的观察视角xlabel('x'); ylabel('y'); zlabel('f(x,y)');title(['迭代次数 = ' num2str(it) ', 最佳值 = ' num2str(BestSol.Fitness, '%.4f')]);axis([VarMin VarMax VarMin VarMax 0 50]);grid on;drawnow;endfprintf('最优解: [%f, %f], 最小值: %f\n', BestSol.Position(1), BestSol.Position(2), BestSol.Fitness);
运行结果
这段代码实现了自组织遗传算法(Self-Organizing Genetic Algorithm, SOGA) 求解Rastrigin函数优化问题。SOGA的核心是通过自适应机制(如个体活性监控、变异率衰减)减少人工干预,维持种群多样性。
代码分析
一、目标函数:Rastrigin函数
Rastrigin函数是典型的多峰函数,具有大量局部极小值,是优化算法的挑战性测试函数:
f(x,y)=20+x2−10cos(2πx)+y2−10cos(2πy)f(x,y) = 20 + x^2 - 10\cos(2\pi x) + y^2 - 10\cos(2\pi y)f(x,y)=20+x2−10cos(2πx)+y2−10cos(2πy)
- 全局最优解:在原点(0,0)(0,0)(0,0),函数值为f(0,0)=0f(0,0) = 0f(0,0)=0。
- 难点:函数表面有密集的局部极小值,传统算法易陷入局部最优。
代码中通过匿名函数定义:
rastrigin = @(x) 20 + x(1)^2 - 10*cos(2*pi*x(1)) + ...x(2)^2 - 10*cos(2*pi*x(2));
二、SOGA核心机制解析
1. 种群初始化与个体结构
pop = repmat(empty_ind, nPop, 1);
for i = 1:nPoppop(i).Position = (VarMax - VarMin) * rand(1, nVar) + VarMin;pop(i).Fitness = rastrigin(pop(i).Position);pop(i).StagnantCount = 0; % 停滞代数计数器
end
- 个体结构:每个个体包含
Position
(位置)、Fitness
(适应度)和StagnantCount
(停滞代数)。 - 初始化:在搜索空间[−5.12,5.12]2[-5.12, 5.12]^2[−5.12,5.12]2内随机生成初始种群。
2. 遗传操作:交叉与变异
% 交叉(算术交叉)
if rand < pcalpha = rand;child1.Position = alpha*pop(i1).Position + (1-alpha)*pop(i2).Position;child2.Position = (1-alpha)*pop(i1).Position + alpha*pop(i2).Position;
end% 变异(高斯扰动)
if rand < pmmutant.Position = mutant.Position + 0.1 * randn(1, nVar);
end
-
算术交叉:生成两个子代,位置为父代的线性组合:
child1=α⋅parent1+(1−α)⋅parent2\text{child}_1 = \alpha \cdot \text{parent}_1 + (1-\alpha) \cdot \text{parent}_2child1=α⋅parent1+(1−α)⋅parent2
child2=(1−α)⋅parent1+α⋅parent2\text{child}_2 = (1-\alpha) \cdot \text{parent}_1 + \alpha \cdot \text{parent}_2child2=(1−α)⋅parent1+α⋅parent2
其中α∼Uniform(0,1)\alpha \sim \text{Uniform}(0,1)α∼Uniform(0,1)。 -
高斯变异:对个体位置添加随机扰动:
mutant=original+0.1⋅N(0,1)\text{mutant} = \text{original} + 0.1 \cdot \mathcal{N}(0,1)mutant=original+0.1⋅N(0,1)
扰动强度由标准差0.1控制。
3. 自适应变异率衰减
pm = pm * mutationDecay; % mutationDecay = 0.99
- 数学表达:变异率随迭代代数ttt指数衰减:
pm(t)=pm(0)⋅λtp_m(t) = p_m(0) \cdot \lambda^tpm(t)=pm(0)⋅λt
其中λ=0.99\lambda = 0.99λ=0.99,初始pm(0)=0.3p_m(0) = 0.3pm(0)=0.3。 - 作用:迭代初期保持高探索性,后期聚焦于局部开发,平衡全局搜索与局部精修。
4. 个体活性监控与自重启
if isequal(pop(i).Fitness, rastrigin(pop(i).Position))pop(i).StagnantCount = pop(i).StagnantCount + 1;
elsepop(i).StagnantCount = 0;
endif pop(i).StagnantCount >= stagnantLimitpop(i).Position = (VarMax - VarMin) * rand(1, nVar) + VarMin;pop(i).StagnantCount = 0;
end
- 停滞检测:若个体适应度连续
stagnantLimit = 10
代未更新,则判定为“失活”。 - 自重启机制:对失活个体重新随机初始化,避免算法陷入局部最优。
数学上,当StagnantCounti≥10\text{StagnantCount}_i \geq 10StagnantCounti≥10时,执行:
Positioni←Random(VarMin,VarMax)\text{Position}_i \leftarrow \text{Random}( \text{VarMin}, \text{VarMax} )Positioni←Random(VarMin,VarMax)
5. 选择机制
[~, sortIdx] = sort([pop.Fitness]);
pop = pop(sortIdx);
pop = pop(1:nPop); % 保留最优的nPop个个体
- 精英保留:按适应度升序排序(Rastrigin函数是最小化问题),直接淘汰最差个体,确保最优解不丢失。
三、算法流程总结
SOGA的迭代过程可概括为:
- 交叉与变异:生成子代,变异率随迭代衰减;
- 选择:合并父代与子代,保留最优个体;
- 活性监控:检测停滞个体并重启;
- 可视化:实时展示种群分布与最优解轨迹。
四、可视化分析
代码通过三维曲面图和粒子分布实时展示优化过程:
- 背景曲面:Rastrigin函数的等高线;
- 红色点:当前种群的位置;
- 黄色五角星:全局最优解。
随着迭代进行,粒子逐渐向全局最优解(0,0)(0,0)(0,0)聚集,同时自重启机制会在局部区域注入新的搜索点,避免算法停滞。
五、SOGA与传统GA的对比
特性 | 传统遗传算法 (GA) | 自组织遗传算法 (SOGA) |
---|---|---|
变异率 | 固定值或手动调整 | 自适应衰减(如指数衰减) |
多样性维持 | 依赖参数调优 | 自动检测失活个体并重启 |
人工干预 | 需要频繁调整参数 | 初始参数后无需干预 |
局部最优处理 | 可能陷入局部最优 | 通过自重启跳出局部最优 |
适用场景 | 简单优化问题 | 复杂多峰函数优化 |
六、总结
SOGA通过自适应变异率和个体活性监控两大核心机制,实现了算法参数的自我调节,显著减少人工干预。在Rastrigin函数上的表现证明,该算法能有效平衡全局搜索与局部开发,最终收敛到全局最优解(0,0)(0,0)(0,0)。