模拟退火算法优化bp

news/2024/3/29 16:08:11/文章来源:https://blog.csdn.net/Liang_1_/article/details/129211638

%% 基于模拟退火遗传算法优化BP神经网络的钢带厚度预测
clear
clc
close all
format short
%% 加载训练数据
Xtr=xlsread('train_data.xlsx');
DD=size(Xtr,2);
input_train=Xtr(:,1:DD-1)';% 
output_train=Xtr(:,DD)';% 
%% 加载测试数据
Xte=xlsread('test_data.xlsx');
input_test=Xte(:,1:DD-1)';% 
output_test=Xte(:,DD)';% 
%% BP网络设置
%节点个数
[inputnum,N]=size(input_train);%输入节点数量
outputnum=size(output_train,1);%输出节点数量
hiddennum=20; %隐含层节点
%% 数据归一化
[inputn,inputps]=mapminmax(input_train,0,1);
[outputn,outputps]=mapminmax(output_train,0,1);% 归一化到【0 1】之间
%% GA算法参数初始化
D=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;
net=newff(inputn,outputn,hiddennum);
%参数定义
maxgen=20;                         %进化代数,即迭代次数
sizepop=10;                        %种群规模
fselect='roulette';                 %染色体的选择方法,您可以选择:锦标赛法- 'tournament';轮盘赌法-'roulette'
fcode='float';                       %编码方法,您可以选择:浮点法-'float';grey法则--'grey';二进制法-'binary' 
pcross=0.7;                       %交叉概率选择,0和1之间
fcross='float';                   %交叉方法选择,您可以选择: 浮点交叉-'float';单点交叉-'simple';均匀交叉-'uniform'
pmutation=0.1;                    %变异概率选择,0和1之间
fmutation='float';                 %变异方法选择,您可以选择:浮点法-'float';单点法-'simple';
lenchrom=ones(1,D);%[1 1];          %每个变量的字串长度,如果是浮点变量,则长度都为1
% bound=[-2.048,2.048;-2.048 2.048];
%% 优化参数的取值范围
ub=3*ones(1,D); % 参数取值上界
lb=-3*ones(1,D); % 参数取值下界
bound=[lb' ub'];
 
for i=1:sizepop
    %随机产生一个种群
    individuals.chrom(i,:)=Code(lenchrom,fcode,bound);    %编码(binary和grey的编码结果为一个实数,float的编码结果为一个实数向量)
    x=Decode(lenchrom,bound,individuals.chrom(i,:),fcode);%解码(binary和grey的解码结果为一个二进制串,float的解码结果为一个实数向量)
    %计算适应度
    individuals.fitness(i)=objfun_BP(x,inputnum,hiddennum,outputnum,net,inputn,outputn);%计算适应度
end
 
%找最好的染色体
[bestfitness bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:);  %最好的染色体
avgfitness=sum(individuals.fitness)/sizepop; %染色体的平均适应度
trace=[avgfitness bestfitness];
% 进化开始
for i=1:maxgen
    disp(['迭代次数:' num2str(i)])
    % 选择
    individuals=Select(individuals,sizepop,fselect); 
    avgfitness=sum(individuals.fitness)/sizepop;
    %交叉
    individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,fcross,[i maxgen],fcode,bound,individuals.fitness,bestfitness,avgfitness);
    % 变异
    individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,fmutation,[i maxgen],fcode,bound,individuals.fitness,bestfitness,avgfitness);
    % 计算适应度 
    for j=1:sizepop
        x=Decode(lenchrom,bound,individuals.chrom(j,:),fcode); %解码
       individuals.fitness(j)=objfun_BP(x,inputnum,hiddennum,outputnum,net,inputn,outputn);%计算适应度  
    end
  %找到最小和最大适应度的染色体及它们在种群中的位置
    [newbestfitness,newbestindex]=min(individuals.fitness);
    [worestfitness,worestindex]=max(individuals.fitness);
    % 代替上一次进化中最好的染色体
    if bestfitness>newbestfitness
        bestfitness=newbestfitness;
        bestchrom=individuals.chrom(newbestindex,:);
    end
    individuals.chrom(worestindex,:)=bestchrom;
    individuals.fitness(worestindex)=bestfitness;
    avgfitness=sum(individuals.fitness)/sizepop;
    trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度
end
 
%% 画出适应度曲线
figure
plot(trace(:,1),'b--');
hold on
plot(trace(:,2),'r-.');
title(['适应度曲线  ' '终止代数=' num2str(maxgen)]);
xlabel('进化代数');ylabel('适应度');
legend('平均适应度','最佳适应度')
axis tight
disp('适应度                   变量');
x=Decode(lenchrom,bound,bestchrom,fcode);
% 窗口显示
disp([bestfitness x]);
% 把最优初始阀值权值赋予网络预测
%用ABC优化的BP网络进行值预测
w1=x(1:inputnum*hiddennum);
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=B2;
% BP网络训练
% 网络进化参数
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
net.trainParam.mc = 0.8;%动量系数,[0 1]之间
net.trainParam.goal=0.001;
% 网络训练
net=train(net,inputn,outputn);
% BP训练集预测
BP_sim=sim(net,inputn);
% 网络输出反归一化
ABC_sim=mapminmax('reverse',BP_sim,outputps);
% 绘图
figure
plot(1:length(output_train),output_train,'b--','linewidth',1)
hold on
plot(1:length(ABC_sim),ABC_sim,'r-.','linewidth',1)
xlabel('训练样本','FontSize',12);
ylabel('钢带厚度(mm)')
legend('实际值','预测值');
axis tight
title('GASA-BP神经网络')
% BP测试集
% 测试数据归一化
inputn_test=mapminmax('apply',input_test,inputps);
%预测输出
an=sim(net,inputn_test);
ABCBPsim=mapminmax('reverse',an,outputps);
figure
plot(1:length(output_test), output_test,'b--','linewidth',1)
hold on
plot(1:length(ABCBPsim),ABCBPsim,'r-.','linewidth',1)
xlabel('测试样本','FontSize',12);
ylabel('钢带厚度(mm)')
legend('实际值','预测值');
axis tight
title('GASA-BP神经网络')
%% 未优化的BP神经网络
net1=newff(inputn,outputn,hiddennum);
% 网络进化参数
net1.trainParam.epochs=100;
net1.trainParam.lr=0.1;
net1.trainParam.mc = 0.8;%动量系数,[0 1]之间
net1.trainParam.goal=0.001;
% 网络训练
net1=train(net1,inputn,outputn);
% BP训练集预测
BP_sim1=sim(net1,inputn);
% 网络输出反归一化
T_sim1=mapminmax('reverse',BP_sim1,outputps);
%预测输出
an1=sim(net1,inputn_test);
Tsim1=mapminmax('reverse',an1,outputps);
% 绘图
figure
plot(1:length(output_train),output_train,'b--','linewidth',1)
hold on
plot(1:length(T_sim1),T_sim1,'r-.','linewidth',1)
xlabel('训练样本','FontSize',12);
ylabel('钢带厚度(mm)')
legend('实际值','预测值');
axis tight
title('BP神经网络')
figure
plot(1:length(output_test), output_test,'b--','linewidth',1)
hold on
plot(1:length(Tsim1),Tsim1,'r-.','linewidth',1)
xlabel('测试样本','FontSize',12);
ylabel('钢带厚度(mm)')
legend('实际值','预测值');
axis tight
title('BP神经网络')
%% GASA-BP和BP对比图
figure
plot(1:length(output_train),output_train,'b--','linewidth',1)
hold on
plot(1:length(ABC_sim),ABC_sim,'r-.','linewidth',1)
hold on
plot(1:length(T_sim1),T_sim1,'g.-','linewidth',1)
xlabel('训练样本','FontSize',12);
ylabel('钢带厚度(mm)')
legend('实际值','GASA-BP预测值','BP预测值');
axis tight
figure
plot(1:length(output_test), output_test,'b--','linewidth',1)
hold on
plot(1:length(ABCBPsim),ABCBPsim,'r-.','linewidth',1)
hold on
plot(1:length(Tsim1),Tsim1,'g.-','linewidth',1)
xlabel('测试样本','FontSize',12);
ylabel('钢带厚度(mm)')
legend('实际值','GASA-BP预测值','BP预测值');
axis tight
%% 结果评价
Result1=CalcPerf(output_test,ABCBPsim);
MSE1=Result1.MSE;
RMSE1=Result1.RMSE;
MAPE1=Result1.Mape;
disp(['GASABP-RMSE = ', num2str(RMSE1)])
disp(['GASABP-MSE  = ', num2str(MSE1)])
disp(['GASABP-MAPE = ', num2str(MAPE1)])
Result2=CalcPerf(output_test,Tsim1);
MSE2=Result2.MSE;
RMSE2=Result2.RMSE;
MAPE2=Result2.Mape;
disp(['BP-RMSE = ', num2str(RMSE2)])
disp(['BP-MSE  = ', num2str(MSE2)])
disp(['BP-MAPE = ', num2str(MAPE2)])

 

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程间通信(无名/有名管道及System V共享内存)

目录 一、通信的相关概念 二、管道(半双工) 1、管道的概念 三、匿名管道(fork实现,用于父子及血缘关系进程间通信) 1、匿名管道的使用 2、匿名管道的读写情况 3、管道的特征 4、基于匿名管道的进程池 四、命名…

【华为OD机试模拟题】用 C++ 实现 - 密室逃生游戏(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

独家 | 6个Python数据科学库正在狂飙,你一定要学来提升文化素养

作者:Bex T翻译:wwl 校对:张睿毅本文约3200字,建议阅读8分钟 计算类数据科学库,已经不再局限在Pandas、NumPy、Scikit-learn之内了!动机2023年的开始,自然需要探索数据科学和机器学习的新趋势。…

【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

Web Spider Ast-Hook 浏览器内存漫游-数据检索

文章目录一、资源下载二、通过npm安装anyproxy模块三、anyproxy的介绍以及基本使用1. anyproxy的功能介绍2. anyproxy的基本使用四、给浏览器挂代理五、实操极验demo案例总结提示:以下是本篇文章正文内容,下面案例可供参考 一、资源下载 Github&#x…

【华为OD机试模拟题】用 C++ 实现 - 符合条件的子串长度(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【华为OD机试模拟题】用 C++ 实现 - 矩阵最值(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【华为OD机试模拟题】用 C++ 实现 - 找数字(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

MIND——Modality independent neighbourhood descriptor 模态无关邻域描述符

参考:https://blog.mbedded.ninja/programming/signal-processing/image-processing/image-registration/modality-independent-neighbourhood-descriptor-mind/《MIND: Modality independent neighbourhood descriptor for multi-modal deformable registration》论…

Elasticsearch7.8.0版本进阶——文档分析 分析器

目录一、文档分析过程二、分析器三、内置分析器3.1、标准分析器3.2、简单分析器3.3、空格分析器3.4、语言分析器四、分析器使用场景五、分析器的测试示例一、文档分析过程 将一块文本分成适合于倒排索引的独立的词条。将这些词条统一化为标准格式以提高它们的“可搜索性”&…

JDBC-

文章目录JDBC1,JDBC概述1.1 JDBC概念1.2 JDBC本质1.3 JDBC好处2,JDBC快速入门2.1 编写代码步骤2.2 具体操作3,JDBC API详解3.1 DriverManager3.2 Connection (事务归我管)3.2.1 获取执行对象3.2.2 事务管理3.3 Stateme…

12.STM32系统定时器-SysTick

目录 1.系统定时器-SysTick 2.SysTick定时时间的计算 3.SysTick结构体 4.SysTick固件库函数 5.SysTick中断优先级 1.系统定时器-SysTick SysTick:24位系统定时器,只能递减,存在于内核嵌套在NVIC中。所有的Cortex-M中都有这个系统定时器。 重装载值…

interrupt多线程设计模式

1. 两阶段终止-interrupt Two Phase Termination 在一个线程T1中如何“优雅”终止线程T2?这里的【优雅】指的是给T2一个料理后事的机会。 错误思路 ● 使用线程对象的stop()方法停止线程(强制杀死) —— stop()方法…

会声会影2023电脑版下载及系统配置要求

平时大家可能会经常听到有人说会声会影,但是很多人都不知道这是什么软件。其实听它的名字就知道这是一款和声音、影像有关系的软件。下面,小编就来给大家具体介绍一下这款软件吧。 会声会影是一套操作简单的DV、HDV影片剪辑软件。会声会影不仅完全符合家…

农业科技发展所带来的好处:提高农作物产量,提高农民收入

农业科技发展所带来的好处::(1)育种技术:通过育种技术,科学家可以在农作物基因中挑选和改变一些特定的性状,例如增加产量、改善耐旱性和抗病性等等,从而提高农作物产量。&#xff08…

el-cascader 级联选择器懒加载的使用及回显 + 点击任意一级都能返回

需要实现的需求 数据渲染使用懒加载点击任意一级都可返回&#xff0c;不需要一直点到最后一级编辑或者查看功能&#xff0c;回显之前选择的数据 实例解析 dom 元素 <el-cascaderv-model"value":options"options":props"props":key"n…

Linux内核段页式内存管理技术

一、概述 1.虚拟地址空间 内存是通过指针寻址的&#xff0c;因而CPU的字长决定了CPU所能管理的地址空间的大小&#xff0c;该地址空间就被称为虚拟地址空间&#xff0c;因此32位CPU的虚拟地址空间大小为4G&#xff0c;这和实际的物理内存数量无关。 Linux内核将虚拟地址空间分…

五种IO模型以及select多路转接IO模型

目录 一、典型IO模型 1.1 阻塞IO 1.2 非阻塞IO 1.3 信号驱动I0 1.4 IO多路转接 1.5 异步IO 多路转接的作用和意义 二、多路转接IO模型&#xff08;select&#xff09; 2.1 接口 2.2 接口当中的事件集合&#xff1a; fd_set 2.2 select使用事件集合&#xff08;位图&am…

174万亿采购,奔向数字化

采购不单纯发生在外部&#xff0c;更发生在内部&#xff0c;只有两者同时进行&#xff0c;才能完成采购中心从成本到利润中心角色的转变。 作者|斗斗 编辑|皮爷 出品|产业家 数字化&#xff0c;让很多企业业务流程发生了质变。 《2022数字化采购发展报告》显示&#x…

破解票房之谜:为何高票房电影绕不过“猫眼们”?

如此火爆的春节档很多&#xff0c;如此毁誉参半的春节档鲜有。2023开年&#xff0c;集齐张艺谋、沈腾的《满江红》&#xff0c;以及有票房前作打底的《流浪地球2》接连两部春节档电影票房进入前十&#xff0c;为有些颓靡的中国电影市场注入了一针“强心剂”。与票房同样热闹起来…