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

一文搞清楚遗传算法(Genetic Algorithm,GA)详解,附带应用及源码

遗传算法(Genetic Algorithm, GA)是一种模拟达尔文生物进化过程的优化算法,通常用于解决复杂的优化问题,由美国的 John holland于20世纪70年代提出,它基于自然选择和遗传学的原理,通过模拟自然界中的生物进化过程来搜索最优解或近似最优解。

算法基本原理

遗传算法的基本原理借鉴了自然界中的生物进化过程,主要包括选择(Selection)、交叉(Crossover)和变异(Mutation)三大操作。这些操作模拟了自然选择和遗传变异的过程,帮助算法在搜索空间中逐步逼近最优解。通过模拟自然进化过程来搜索最优解的优化算法,其基本原理是将问题的解表示为一个染色体,然后通过选择、交叉和变异等操作来优化染色体。步骤如下:
1、参数及种群初始化:设置种群大小、最大迭代次数、搜索空间维度等,并随机初始化种群。
2、解码与适应度计算:对种群中的个体进行解码并计算适应度值。
3、选择、交叉与变异:选择父代个体,进行交叉和变异操作,生成子代。
4、结束条件判断:检查是否满足结束条件,如达到最大迭代次数或找到满意的解。
5、输出最优解:输出全局最优解。

种群初始化

种群(Population):由一组个体(Individual)组成,每个个体代表一个潜在解。个体通常用染色体(Chromosome)表示,即基因(染色体)是由一定长度的0或1组成。
初始化:随机生成一组初始解的染色体构成初始种群,种群的大小一般设为固定值。遗传算法的编码方式包括二进制编码、格雷编码、实数编码、排列编码等。其中二进制编码是应用最为广泛的一种编码方式。在二进制编码中,每个基因的取值为0或1,染色体长度由基因数目决定。

%% 编码函数
function ret=Code(lenchrom,bound)
%本函数将变量编码成染色体,用于随机初始化一个种群
% lenchrom   input : 染色体长度
% bound      input : 变量的取值范围
% ret        output: 染色体的编码值flag=0;
while flag==0pick=rand(1,lenchrom);ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; %线性插值flag=test(lenchrom,bound,ret);             %检验染色体的可行性
end
end

NO.3|选择(Selection)

根据个体的适应度值选择父代个体,适应度高的个体被选中的概率较大。轮盘赌选择:根据个体的适应度值分配选择概率,属于随机抽样方式的一种。随机竞争选择:选择两个个体,保留适应度值较高的个体。

NO.4|交叉(Crossover)

单点交叉:在染色体的某一点进行交换。
多点交叉:在染色体的多个点进行交换。
均匀交叉:在整个染色体范围内进行交换
具体应用

通过一个具体的例子来说明如何使用这个遗传算法来进行参数识别 Q ^{\mathrm{Q}} Q。假设我们要识别一个简单的二次函数 f ( x ) = a ⋅ x 2 + b ⋅ x + c f(x)=a\cdot x^2+b\cdot x+c f(x)=ax2+bx+c的参数a、b和c,使得这个函数尽可能接近给定的一组数据点, 运行结果附后
(1)问题描述
我们有一组数据点 ( x i , y i ) (x_i,y_i) (xi,yi) ,希望找到参数a、b和c使得拟合函数 f ( x ) = a ⋅ x 2 + b ⋅ x + c f(x)=a\cdot x^2+b\cdot x+c f(x)=ax2+bx+c的预测
y ^ i \hat{y}_i y^i与实际值 y i y_i yi的误差最小。
(2)数据点
假设我们有以下数据点: { ( 1 , 2 ) , ( 2 , 3 ) , ( 3 , 5 ) , ( 4 , 7 ) , ( 5 , 11 ) } \{(1,2),(2,3),(3,5),(4,7),(5,11)\} {(1,2),(2,3),(3,5),(4,7),(5,11)}
(3)目标函数
使用均方误差 (Mean Squared Error, MSE) 作为目标函数:
M S E ( a , b , c ) = 1 n ∑ i = 1 n ( y i − ( a ⋅ x i 2 + b ⋅ x i + c ) ) 2 \mathrm{MSE}(a,b,c)=\frac1n\sum_{i=1}^n\left(y_i-(a\cdot x_i^2+b\cdot x_i+c)\right)^2 MSE(a,b,c)=n1i=1n(yi(axi2+bxi+c))2
(4)遗传算法实现
完整的代码,包括数据点、适应度函数和遗传算法的实现:

% 数据点X = [1, 2, 3, 4, 5];
Y = [2.1, 3.9, 7.2, 11.1, 17.2];% 遗传算法参数
populationSize = 50; % 种群大小
maxGenerations = 100; % 最大迭代次数
mutationRate = 0.1; % 变异率% 初始化种群
population = rand(populationSize, 3) * 10; % 初始参数范围可以根据实际情况调整
bestSolution = zeros(1, 3);
bestFitness = Inf;% 收集适应度数据
fitnessHistory = zeros(maxGenerations, 1);% 主循环
for generation = 1:maxGenerations% 计算适应度fitness = zeros(populationSize, 1);for i = 1:populationSizea = population(i, 1);b = population(i, 2);c = population(i, 3);% 计算均方误差predictedY = a * X.^2 + b * X + c;mse = mean((predictedY - Y).^2);fitness(i) = mse;% 更新最佳解if mse < bestFitnessbestFitness = mse;bestSolution = [a, b, c];endend% 收集当前代的最佳适应度fitnessHistory(generation) = bestFitness;% 选择[~, idx] = sort(fitness);population = population(idx, :);% 交叉和变异newPopulation = zeros(populationSize, 3);for i = 1:populationSizeparent1 = population(mod(i, populationSize) + 1, :);parent2 = population(mod(i + 1, populationSize) + 1, :);% 交叉crossoverPoint = randi([1, 3]);child = [parent1(1:crossoverPoint), parent2(crossoverPoint+1:end)];% 变异for j = 1:3if rand < mutationRatechild(j) = child(j) + randn * 0.1; % 根据实际情况调整变异大小endendnewPopulation(i, :) = child;endpopulation = newPopulation;
end% 输出最佳解
fprintf('最佳参数 (a, b, c): %.4f, %.4f, %.4f\n', bestSolution);
fprintf('最小均方误差: %.4f\n', bestFitness);% 绘制收敛图
figure;
plot(1:maxGenerations, fitnessHistory, 'LineWidth', 2);
title('遗传算法收敛过程');
xlabel('迭代次数');
ylabel('最佳适应度 (MSE)');
grid on;

在这里插入图片描述
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 3.k8s:服务发布:service,ingress;配置管理:configMap,secret,热更新;持久化存储:volumes,nfs,pv,pvc
  • MATLAB基础:函数与函数控制语句
  • 【数据结构初阶】单链表经典算法题十二道——得道飞升(上篇)
  • SQLException:Operation not allowed after ResultSet closed
  • 在MATLAB中使用importrobot导入机械臂刚体树时没有找到模型文件,只显示坐标;改为使用loadrobot
  • 文件共享功能无法使用提示错误代码0x80004005【笔记】
  • iOS中的类型推断(Type Inference)
  • [排序]hoare快速排序
  • 为什么多数大数据治理项目都是失败的?Gartner调查失败率超过90%
  • Vue2父传子
  • JNI回调用中不同线程的env无法找到正确的kotlin的class
  • Vite 常用插件配置:自动导入+自动注册组件+动态创建图标+设置组件名
  • C 语言基础概念总结
  • 在没有源程序的情况时,如何通过控制鼠标按钮控制电脑exe程序?
  • Android小技巧:利用动态代理自动切换线程(续)
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【Linux系统编程】快速查找errno错误码信息
  • 2017-09-12 前端日报
  • Angular4 模板式表单用法以及验证
  • AngularJS指令开发(1)——参数详解
  • Bootstrap JS插件Alert源码分析
  • Linux后台研发超实用命令总结
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • MYSQL 的 IF 函数
  • PAT A1017 优先队列
  • PHP 的 SAPI 是个什么东西
  • springboot_database项目介绍
  • SQL 难点解决:记录的引用
  • 产品三维模型在线预览
  • 从重复到重用
  • 基于游标的分页接口实现
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 数据仓库的几种建模方法
  • 算法-插入排序
  • 正则学习笔记
  • nb
  • Hibernate主键生成策略及选择
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • $L^p$ 调和函数恒为零
  • (04)odoo视图操作
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (2)(2.10) LTM telemetry
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (力扣题库)跳跃游戏II(c++)
  • (三分钟)速览传统边缘检测算子
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十) 初识 Docker file
  • (数据结构)顺序表的定义