当前位置: 首页 > news >正文

自组织遗传算法(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+x210cos(2πx)+y210cos(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.1N(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 10StagnantCounti10时,执行:
    Positioni←Random(VarMin,VarMax)\text{Position}_i \leftarrow \text{Random}( \text{VarMin}, \text{VarMax} )PositioniRandom(VarMin,VarMax)
5. 选择机制
[~, sortIdx] = sort([pop.Fitness]);
pop = pop(sortIdx);
pop = pop(1:nPop);  % 保留最优的nPop个个体
  • 精英保留:按适应度升序排序(Rastrigin函数是最小化问题),直接淘汰最差个体,确保最优解不丢失。

三、算法流程总结

SOGA的迭代过程可概括为:

  1. 交叉与变异:生成子代,变异率随迭代衰减;
  2. 选择:合并父代与子代,保留最优个体;
  3. 活性监控:检测停滞个体并重启;
  4. 可视化:实时展示种群分布与最优解轨迹。

四、可视化分析

代码通过三维曲面图和粒子分布实时展示优化过程:

  • 背景曲面:Rastrigin函数的等高线;
  • 红色点:当前种群的位置;
  • 黄色五角星:全局最优解。

随着迭代进行,粒子逐渐向全局最优解(0,0)(0,0)(0,0)聚集,同时自重启机制会在局部区域注入新的搜索点,避免算法停滞。

五、SOGA与传统GA的对比

特性传统遗传算法 (GA)自组织遗传算法 (SOGA)
变异率固定值或手动调整自适应衰减(如指数衰减)
多样性维持依赖参数调优自动检测失活个体并重启
人工干预需要频繁调整参数初始参数后无需干预
局部最优处理可能陷入局部最优通过自重启跳出局部最优
适用场景简单优化问题复杂多峰函数优化

六、总结

SOGA通过自适应变异率个体活性监控两大核心机制,实现了算法参数的自我调节,显著减少人工干预。在Rastrigin函数上的表现证明,该算法能有效平衡全局搜索与局部开发,最终收敛到全局最优解(0,0)(0,0)(0,0)

http://www.dtcms.com/a/304404.html

相关文章:

  • 【Rust并发集合】如何在多线程中并发安全地使用集合
  • 【AI News | 20250728】每日AI进展
  • 接口自动化测试pytest框架
  • 网络原理--HTTPHTTPS
  • JAVA_TWENTY—ONE_单元测试+注解+反射
  • MySQL——MVCC
  • ftp加ssl,升级ftps
  • 解决Spring MVC中@PathVariable参数为null导致的404问题:全面解析与最佳实践
  • Spring MVC数据传递全攻略
  • 架构实战——互联网架构模板(“网络层”技术)
  • WINCC选项组配置
  • Spring Boot 请求限流实战:基于 IP 的高效防刷策略
  • Postgresql 查询使用正则
  • SQL158 每类视频近一个月的转发量/率
  • Java 大视界 -- Java 大数据在智能教育学习社区知识图谱构建与知识传播分析中的应用(370)
  • DeepCompare文件深度对比软件的差异内容提取与保存功能深度解析
  • Go语言新手村:轻松理解变量、常量和枚举用法
  • 论文阅读--射频电源在半导体领域的应用
  • 《从HTTP到IP证书:网络身份验证的下一站革命》
  • 如何使用 Git 钩子 hooks 自动化任务?
  • 【MySQL】数据库的简单介绍
  • [2025CVPR-图象分类]ProAPO:视觉分类的渐进式自动提示优化
  • java基础面试题(6)--Object
  • Jenkins 节点连接故障定位及解决方案总结 - PKIX path validation failed
  • 如何创建一个 Solana 钱包?
  • 在 Ubuntu 下测试单目与双目相机
  • ubuntu 25.04 自带JS引擎gjs运行GTK with JavaScript 应用
  • B+树高效实现与优化技巧
  • 微服务 01
  • FastAPI后台任务:异步魔法还是同步噩梦?