MATLAB实现遗传算法优化BP神经网络预测数值(GABP)

news2024/11/13 10:29:56

遗传算法(Genetic Algorithm, GA)和反向传播(Back Propagation, BP)神经网络是两种强大的算法,分别用于优化和机器学习。将遗传算法与BP神经网络结合,可以利用遗传算法的全局搜索能力来优化BP神经网络的初始权重和偏置,从而避免BP神经网络陷入局部最优,并提高网络的训练速度和精度。

以下是遗传算法优化BP神经网络的基本步骤和流程:

1.编码:首先,需要将BP神经网络的权重和偏置编码为遗传算法的基因。这通常通过将权重和偏置值以实数的编码来实现。
2.初始化种群:随机生成一组初始解(即一组权重和偏置的编码),每个解代表一个个体,多个个体组成一个种群。种群的大小(即个体的数量)可以根据问题的复杂性和计算资源来确定。
3.适应度函数设计:设计一个适应度函数来评估每个个体的优劣。采用BP神经网络的训练误差。误差越小,个体的适应度就越高。
4.选择操作:根据适应度函数的结果,选择优秀的个体进入下一代。这可以通过轮盘赌选择、锦标赛选择等方法来实现。
5.交叉操作:随机选择种群中的两个个体,以一定的概率进行交叉操作,生成新的个体。交叉操作的方式可以是单点交叉、多点交叉、均匀交叉等。
6.变异操作:以一定的概率对种群中的个体进行变异操作,以增加种群的多样性。变异可以是位反转、位交换、实数变异等方式。
7.迭代进化:重复步骤4-6,直到满足终止条件(如达到预设的进化代数、适应度达到预设阈值等)。
8.解码与BP神经网络训练:将遗传算法得到的最佳个体解码为BP神经网络的初始权重和偏置,然后使用标准的BP算法进行训练。
9.测试与评估:使用测试数据集评估训练好的BP神经网络的性能。

MATLAB主程序如下:

完整代码见:https://download.csdn.net/download/corn1949/89156937

%% 遗传算法 优化BP
clc;close all;clear all;%清除变量
rand('seed',1000);
randn('seed',1000);
format long g;
addpath(genpath('mytoolbox'));

global inputnumber hiddenumber outputnumber input_train output_train input_test P1 P2 T1 T2 inputps outputps indexM N;

X=rand(200,3);
Y=sum(X,2);

Inputdata=X';
Outputdata=Y';

snumber=size(Outputdata,2);
% index200=1:snumber;%顺序样本
index200=randperm(snumber);%随机样本
numberTest=50;%用于测试的样本个数

indextrain=index200(1:end-numberTest);
indextest=index200(end-numberTest+1:end);

% 定义训练集
P1=Inputdata(:,indextrain);
T1=Outputdata(:,indextrain);
% 定义测试集
P2=Inputdata(:,indextest);
T2=Outputdata(:,indextest);
%设置训练集和测试集

%% (2)训练数据归一化
[input_train,inputps]=mapminmax(P1);
[output_train,outputps]=mapminmax(T1);
%测试数据归一化
input_test=mapminmax('apply',P2,inputps);
output_test=mapminmax('apply',T2,outputps);


[k11,k12]=size(input_train);%计算维数
inputnumber=k11;%输入维数
hiddenumber=8;%隐含神经元数
outputnumber=size(output_train,1);%输出维数;%输出维数
S=[hiddenumber*inputnumber,outputnumber*hiddenumber,hiddenumber*1,outputnumber*1];
indexM=S2indexMfun(S);
N=sum(S);% 编码长度

tic;
[x0,ybptest]=myfun2();
bptime=toc;


% 遗传算法参数
popsize=50;%遗传算法种群数
maxgen=100;%遗传算法迭代次数
PM=0.1;%变异概率
PC=0.8;%交叉概率

lb=-3*ones(1,N);
ub=3*ones(1,N);

%% 遗传算法主程序
%性能跟踪
tic;
tracematga=zeros(maxgen,2);
gen=0;
Chrom=genChrome(popsize,N,lb,ub,x0);% 建立种群
Value = decodingFun(Chrom,popsize);% 解码染色体
[vmin,indexmin]=min(Value);
bestValue=vmin;% 记录函数的最优值
bestChrom=Chrom(indexmin,:);% 记录函数的最优染色体

%% 遗传算法优化
%进度条
wait_hand = waitbar(0,'running...', 'tag', 'TMWWaitbar');
while gen<maxgen
    %% 遗传算子
    FitnV=ranking(Value);% 分配适应度值
    Chrom=select('rws',Chrom,FitnV,1);% 选择
    Chrom=mutationGA(Chrom,popsize,PM,N,lb,ub);% 种群变异,单点变异
    Chrom=crossGA(Chrom,popsize,PC,N);% 种群交叉,2点交叉
    Value = decodingFun(Chrom,popsize);% 解码染色体
    
    %% 计算最优
    [vmin,indexmin]=min(Value);
    gen=gen+1;
    
    %% 记录最优
    if bestValue>vmin
        bestValue=vmin;% 记录函数的最优值
        bestChrom=Chrom(indexmin,:);% 记录最优染色体
    end
    tracematga(gen,1)=bestValue;% 保留最优
    tracematga(gen,2)=mean(Value);
    
    waitbar(gen/maxgen,wait_hand);% 每循环一次更新一次进步条
end
delete(wait_hand);% 执行完后删除该进度条
gabptime=toc;% 运行时间

% 显示结果
disp('遗传算法优化得到的最优目标函数');
bestValue
% disp('遗传算法优化得到的最优染色体');
% bestChrom


figure;
plot(tracematga(:,1),'r-','linewidth',1);
legend({'种群最优值'},'fontname','宋体');
xlabel('迭代次数','fontname','宋体');
ylabel('目标函数','fontname','宋体');
title('遗传算法优化BP神经网络收敛曲线','fontname','宋体');


%% 以优化得到的权值阀值寻bp神经网络
x=bestChrom;
[y,y_ga_bp_test,net]=myfun(x);

程序结果如下:

遗传算法优化得到的最优目标函数

bestValue =

         0.646362974919631

GA-BP运行时间(s)

gabptime =

                59.1725145

GA-BP预测结果的各项指标

bp运行时间(s)

bptime =

                 6.2069057

BP预测结果的各项指标

outcell =

    '算法'     'R2'                   'MSE'                   'RMSE'                 'MAPE'                'MAD'             

    'GA-BP'    [0.878515453615733]    [0.0382909950102112]    [0.195680849881155]    [9.65913565222882]    [0.151800353400859]

    'BP'       [0.832942552008874]    [0.0724079520899815]    [0.269087257390575]    [  15.68516966661]    [0.213997501340996]

>>


 完整代码见:https://download.csdn.net/download/corn1949/89156937

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1612122.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

stm32中断发送接收数据

配置hal库 1配置时钟 2配置uart 3打开中断 程序结构 uart中断函数 中断接收和发送函数 HAL_UART_Receive_IT()&#xff1a;启动中断驱动的接收过程&#xff0c;当接收到指定数量的字节后会产生中断&#xff0c;并调用HAL_UART_RxCpltCallback()回调函数。 HAL_StatusTypeD…

【MIT6.S081】Lab4: traps(详细解答版)

实验内容网址&#xff1a;https://xv6.dgs.zone/labs/requirements/lab4.html 本实验的代码分支&#xff1a;https://gitee.com/dragonlalala/xv6-labs-2020/tree/traps2/ Backtrace 关键点:trapframe、栈 思路&#xff1a; 这道题的关键是栈结构&#xff0c;先阅读xv6中关于栈…

SpringCloud技术—Docker详解、案例展示

简介&#xff1a;Docker 将应用程序与该程序的依赖&#xff0c;打包在一个文件里面。运行这个文件&#xff0c;就会生成一个虚拟容器。程序在这个虚拟容器里运行&#xff0c;就好像在真实的物理机上运行一样。有了Docker&#xff0c;就不用担心环境问题。 总体来说&#xff0c;…

代码随想录刷题|一刷总结

文章目录 一刷总结一、 成果汇报1、leetcode提交记录2、博客更新记录 二、 经验总结2.1.刷过的所有题型2.1.1、数组2.1.2、链表2.1.3、哈希表2.1.4、字符串2.1.5、栈与队列2.1.6、二叉树2.1.7、回溯2.1.8、贪心2.1.9、动态规划2.1.10、单调栈 2.2、做得好的2.3、做得不好的2.4、…

行业模板|DataEase批发零售大屏模板推荐

DataEase开源数据可视化分析平台于2022年6月发布模板市场&#xff08;https://templates-de.fit2cloud.com&#xff09;&#xff0c;并于2024年1月新增适用于DataEase v2版本的模板分类。模板市场旨在为DataEase用户提供专业、美观、拿来即用的大屏模板&#xff0c;方便用户根据…

AtCoder Beginner Contest 350 ----- F - Transpose ---- 题解

F - Transpose: 题目描述&#xff1a; 思路解析&#xff1a; 如果有一对括号&#xff0c;那么删掉括号对&#xff0c;并且将括号对里的字符串翻转&#xff0c;在翻转过程中&#xff0c;使字符串的字母改变大小写。那我们可以通过预处理找到每个括号对。 例如 A(x(AXB)x)B …

计算机网络——数据链路层(介质访问控制)

计算机网络——数据链路层&#xff08;介质访问控制&#xff09; 介质访问控制静态划分信道动态划分信道ALOHA协议纯ALOHA&#xff08;Pure ALOHA&#xff09;原理特点 分槽ALOHA&#xff08;Slotted ALOHA&#xff09;原理特点 CSMA协议工作流程特点 CSMA-CD 协议工作原理主要…

快速开发部署平台Replit

Replit 是可以快速搭建开发、部署环境的平台。能够快速将原型进行部署&#xff0c;代码编辑器支持协同开发&#xff0c;他的在线编辑器做的不错&#xff0c;相当于云上提供了一个 vscode&#xff0c;代码实时更新。Replit 底层是基于容器技术的&#xff0c;可以安全的隔离多个用…

最新Java面试题3【2024中级】

互联网大厂面试题 1&#xff1a;阿里巴巴Java面试题 2&#xff1a;阿里云Java面试题-实习生岗 3&#xff1a;腾讯Java面试题-高级 4&#xff1a;字节跳动Java面试题 5&#xff1a;字节跳动Java面试题-大数据方向 6&#xff1a;百度Java面试题 7&#xff1a;蚂蚁金服Java…

【数据结构2-线性表】

数据结构2-线性表 1 线性表-数组2 线性表-单链式结构2.1 前插顺序单链表2.2 后插顺序单链表2.3 循环单链表2.4 双向链表 总结 线性表、栈、队列、串和数组都属于线性结构。 线性结构的基本特点是除第一个元素无直接前驱&#xff0c;最后一个元素无直接后继之外&#xff0c;其他…

Linux应用开发(8):Linux进程间通信(IPC):管道

Linux应用开发&#xff08;7&#xff09;&#xff1a;Linux进程间通信&#xff08;IPC&#xff09;&#xff1a;POSIX消息队列https://blog.csdn.net/tecsai/article/details/137879465 1. 简述 我们在前面已经介绍了进程间通信&#xff08;IPC&#xff09;常用的“消息队列”…

[大模型]TransNormerLLM-7B FastApi 部署调用

TransNormerLLM-7B FastApi 部署调用 1. TransNormer 介绍 TransNormerLLM 是一个基于线性注意力的 LLM&#xff0c;在准确性和效率方面均优于传统的基于 softmax 注意力的模型。它是在包含多达1.4 万亿个令牌的高质量语料库上进行训练的&#xff0c;TransNormerLLM 从之前的…

【Scientific American】【科学美国人杂志】2024年4月号:目录部分

说明&#xff1a; 仅供学习、参考使用&#xff0c;请勿用于商业用途。 本期购于新加坡&#xff0c;封面图&#xff1a; Contents Special Report: What we’re learning from AI The Race to Decode an Ancient Scroll How scientists, students, gamers and Silicon Valle…

在 Linux 中删除文件和文件夹

目录 ⛳️推荐 前言 删除文件 &#x1f3cb;️练习文件删除 小心删除 删除目录 &#x1f3cb;️练习文件夹删除 测试你的知识 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到…

setmapAVL树红黑树

目录 关联式容器树形结构的关联式容器setset的模板参数列表set的构造函数set的迭代器set的容量操作set其他操作 multisetmap键值对map的模板参数列表map的迭代器map中元素的修改map的容量与元素访问 multimap底层结构avl树avl树概念AVL树结点的定义AVL树的插入AVL树的旋转AVL树…

(助力国赛)美赛O奖数学建模可视化!!!含代码3(误差限图、冰柱图、树图)

众所周知&#xff0c;数学建模的过程中&#xff0c;将复杂的数据和模型结果通过可视化图形呈现出来&#xff0c;不仅能够帮助我们更深入地理解问题&#xff0c;还能够有效地向评委展示我们的研究成果。   今天&#xff0c;承接《可视化代码2》&#xff0c;作者将与大家分享《…

我用ADAU1467加5个ADAU1772,做20进10出的音频处理板(一):硬件设计思路和原理图

作者的话 ADAU1467是现阶段ADI支持最多通道的ADAU音频DSP&#xff0c;他配合外部的AD/DA&#xff0c;可以实现最多32路音频通道&#xff0c;接了一个小项目&#xff0c;我拿它做了一块20进10出的板&#xff0c;10个MIC/LINE输入,10个LINE IN输入&#xff0c;10个HPOUT&#xf…

Redis(二) 单线程架构

redis 的单线程架构 我们都知道 redis 作为缓存&#xff0c;读取速度是非常快的&#xff0c;但是大家知道 redis 的线程架构是怎样的呢&#xff1f;也就是说&#xff0c;redis 是多线程架构还是单线程架构呢&#xff1f; 我们通过一个例子来了解&#xff1a; 首先在 redis 服…

基于Web的宠物医院信息管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本宠物医院信息管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

【C++】explicit关键字详解(explicit关键字是什么? 为什么需要explicit关键字? 如何使用explicit 关键字)

目录 一、前言 二、explicit关键字是什么&#xff1f; 三、构造函数还具有类型转换的作用 &#x1f34e;单参构造函数 ✨引出 explicit 关键字 &#x1f34d;多参构造函数 ✨为什么需要explicit关键字&#xff1f; ✨怎么使用explicit关键字&#xff1f; 四、总结 五…