神经网络遗传算法函数极值寻优

news2025/1/16 4:42:07

      大家好,我是带我去滑雪!

       对于未知的非线性函数,仅仅通过函数的输入和输出数据难以寻找函数极值,这一类问题可以通过神经网络结合遗传算法求解,利用神经网络的非线性拟合能力和遗传算法的非线性寻优能力寻找函数极值。

目录

一、问题与模型 

(1)求解问题

(2)模型建立思路

二、代码实现

(1)BP神经网络训练

(3)适应度函数

(4)遗传算法主函数


一、问题与模型 

(1)求解问题

     利用神经网络遗传算法寻找非线性函数极值,该函数的表达式为:

y=x_{1}^{2}+x_{2}^{2}

     函数的图像为:

       通过函数图像,可以较为直观地看出函数的全局最小值为0,对应的坐标为(0,0)。虽然从函数方程和图形中很容易找出函数极值及极值对应坐标,但是在函数方程未知的情况下函数极值及对应坐标就难以找到。

(2)模型建立思路

       神经网络训练拟合根据寻优函数的特点构建合适的BP神经网络,用非线性函数的输入输出数据训练BP神经网络,训练后的BP神经网络就可以预测函数输出。遗传算法极值寻优将训练后的BP神经网络预测结果作为个体适应度值,通过选择、交叉、变异操作寻找函数的全局最优值及对应输入值。

       确定BP神经网络的模型结构为2-5-1,取函数的4000组输入输出数据,从中随机选择3500组数据训练神经网络,100组数据测试神经网络性能,网络训练好后用于预测非线性函数输出。

       遗传算法中个体采用实数编码,由于寻优函数只有两个输入参数,所以个体长度为2。个体适应度值为BP神经网络预测值,适应度值越小,个体越优。设置交叉概率为0.4,变异概率为0.2。

二、代码实现

(1)BP神经网络训练

clc
clear

tic
load data1 input output

k=rand(1,4000);
[m,n]=sort(k);

input_train=input(n(1:3900),:)';
output_train=output(n(1:3900),:)';
input_test=input(n(3901:4000),:)';
output_test=output(n(3901:4000),:)';

[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);

net=newff(inputn,outputn,5);

net.trainParam.epochs=100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.0000004;

net=train(net,inputn,outputn);

inputn_test=mapminmax('apply',input_test,inputps);
an=sim(net,inputn_test);
 
BPoutput=mapminmax('reverse',an,outputps);

figure(1)
plot(BPoutput,':og')
hold on
plot(output_test,'-*');
legend('预测输出','期望输出','fontsize',12)
title('BP网络预测输出','fontsize',12)
xlabel('样本','fontsize',12)
ylabel('输出','fontsize',12)

error=BPoutput-output_test;

figure(2)
plot(error,'-*')
title('神经网络预测误差')

figure(3)
plot((output_test-BPoutput)./BPoutput,'-*');
title('神经网络预测误差百分比')

errorsum=sum(abs(error))

toc

save data net inputps outputps

输出结果:

         BP神经网络预测误差百分比图: 

         BP神经网络预测误差图: 

         BP神经网络预测结果图: 

        验证集均方误差迭代图: 

(3)适应度函数

       将训练好的BP神经网络预测输出作为个体适应度值:

function fitness = fun(x)
load data net inputps outputps
x=x';
inputn_test=mapminmax('apply',x,inputps);

an=sim(net,inputn_test);
fitness=mapminmax('reverse',an,outputps);

(4)遗传算法主函数

clc
clear

%% 初始化遗传算法参数
%初始化参数
maxgen=100;                         %进化代数,即迭代次数
sizepop=20;                        %种群规模
pcross=[0.4];                       %交叉概率选择,0和1之间
pmutation=[0.2];                    %变异概率选择,0和1之间

lenchrom=[1 1];          %每个变量的字串长度,如果是浮点变量,则长度都为1
bound=[-5 5;-5 5];  %数据范围


individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]);  %将种群信息定义为一个结构体
avgfitness=[];                      %每一代种群的平均适应度
bestfitness=[];                     %每一代种群的最佳适应度
bestchrom=[];                       %适应度最好的染色体

%% 初始化种群计算适应度值
% 初始化种群
for i=1:sizepop
    %随机产生一个种群
    individuals.chrom(i,:)=Code(lenchrom,bound);   
    x=individuals.chrom(i,:);
    %计算适应度
    individuals.fitness(i)=fun(x);   %染色体的适应度
end
%找最好的染色体
[bestfitness bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:);  %最好的染色体
avgfitness=sum(individuals.fitness)/sizepop; %染色体的平均适应度
% 记录每一代进化中最好的适应度和平均适应度
trace=[avgfitness bestfitness]; 

%% 迭代寻优
% 进化开始
for i=1:maxgen
    i
    % 选择
    individuals=Select(individuals,sizepop); 
    avgfitness=sum(individuals.fitness)/sizepop;
    %交叉
    individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);
    % 变异
    individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,[i maxgen],bound);
    
    % 计算适应度 
    for j=1:sizepop
        individuals.fitness(j)=fun(x);   
    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;

    
    trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度
end
%进化结束

%% 结果分析
[r c]=size(trace);
plot([1:r]',trace(:,2),'r-');
title('适应度曲线','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

      输出结果:

      优化过程中最优个体适应度值变化曲线:

     遗传算法得到的最优个体适应度值为0.01,最优个体为(-0.0081,0.0014)。


更多优质内容持续发布中,请移步主页查看。

   点赞+关注,下次不迷路!

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

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

相关文章

香橙派orangepi c#.net霍尔水流量计+485脉冲精准测水流量实操实例-

香橙派 c#.net iot 霍尔水流量计传感器实操实例 用于测量液体流量,包括咖啡机,自助饮料机,农场水肥等流量检测,很便宜,十块钱以内一个 1、设备:流量计-4分水管 2、脉冲计数器 我使用的是国产香橙派 orangepi zero2 接线: 流量计香橙派红线5V黑线GND黄线wPi编码:10香…

WordPress Wpay最简单的付费查看下载wp主题模板开心无限制版

模板简介: wpay基于wppay插件二开,为了就是更简单的实现虚拟资源购买分享 本主题就是为了简单而生,idwons功能太多,许多人搭建起来站点没有用户消费,折腾大半天,不如来个简单的. 首页支持分页模式&#xff…

大学校园安全如何保障?学到了视频监控的神技!

随着科技的不断进步和社会的快速发展,视频监控技术已经成为我们生活中不可或缺的一部分。视频监控系统为我们提供了更广泛、全面的视觉信息,从而改善了安全性、管理效率和生活质量。 客户案例 零售连锁店 福建某大型零售连锁店,面临着商品损…

「Verilog学习笔记」使用函数实现数据大小端转换

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 分析 题目要求使用函数实现4bit数据大小端转换的功能,所谓大端,即数据的高位写在左侧,低位写在右侧。小端则反过来:高位写在…

【C++高阶(一)】二叉搜索树深度剖析

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 这里写目录标题 1. 前言2. 二叉搜索树的概念以及…

阿里云服务器怎么购买价格更便宜?先领优惠券再通过阿里云活动购买最便宜

怎么购买阿里云服务器的价格是最便宜的?如果我们想购买的阿里云服务器价格更便宜的话,首先要确保自己的账号是新用户账号,其次一定要先领取阿里云送的各种优惠券,然后是在实际购买过程中尽量选择阿里云活动中的各种云服务器&#…

电机应用-舵机

目录 舵机 分类 结构 工作原理 控制原理 参数 舵机基本控制实验(MG996R舵机) MG996R舵机规格 硬件电路 TIM4配置 测试环节 舵机 分类 按照舵机的控制电路分类:模拟舵机和数字舵机。 模拟舵机和数字舵机的机械结构是完全相同的。 …

【Linux语音控制 安卓设备刷短视频 orangePi zero2 H616 (已开源) 】.md uptada:23/11/07

文章目录 H616_实现Ubuntu语音控制安卓设备刷短视频小美效果展示H616 ubuntu系统 安装adb智能公元 SU-03T 离线语音模组 固件制作配合串口实现 小美_控制安卓刷抖音 H616_实现Ubuntu语音控制安卓设备刷短视频 注意:orangePi zero2 H616 安装系统为ubuntu 小美效果…

与创新者同行,Apache Doris in 2023

在刚刚过去的 Doris Summit Asia 2023 峰会上,Apache Doris PMC 成员、飞轮科技技术副总裁衣国垒带来了“与创新者同行”的主题演讲,回顾了 Apache Doris 在过去一年所取得的技术突破与社区发展,重新思考了在面对海量数据实时分析上的挑战与机…

Docker两个容器互相请求接口

BEGIN 环境:Docker-Windows-Hyperf 1. 过以下命令查看Docker中的所有网络 docker network ls这个命令会列出所有的Docker网络,包括其ID、名称、驱动以及作用范围 在 Docker 中,容器通过 Docker 网络进行相互通信;在 Docker 中有…

面试题:说一下线程、线程锁与线程池

文章目录 前言一、线程1.线程概念2.线程与进程的关系3.定义4.wait()和sleep()5.线程的状态及其他API 二、线程锁1. 普通锁机制2. Lock 三、线程同步工具类1. CountDowmLatch闭锁:2. CyclicBarrier栅栏:3. Exchanger交换机:4. 信号量 四、线程…

C#文件上传的常用几种方式

1.第一种上传方式,基本通用于.net所有的框架 [HttpPost][Route("Common/uploadFile1")]public string uploads(){HttpContextBase context (HttpContextBase)Request.Properties["MS_HttpContext"];//获取传统contextHttpRequestBase request context.Re…

su root失败 sudo su成功进入root

目录 0.场景 1.su root输入密码kali失败 2.对kali用户暂时提权 3.问题原因 0.场景 刚刚安装好kali,想使用su root切换进入root账户 1.su root输入密码kali失败 2.对kali用户暂时提权 只要你的用户在sudoers里面,就可以输入当前用户密码暂时变成root…

QT学习_14_一种开线程来实现串口通信方法

基于QT的上位机软件,和下位机一般都存在通信。 但如果是在主窗体类里面实现通信,往往会和主线程争抢CPU,导致通信非常容易出现异常。 最好的方式是给通信程序单独开一个线程来实现,而主窗体类(主线程)则主要…

全自动内衣洗衣机什么牌子好?好用又便宜的内衣洗衣机测评

在内衣洗衣机越来越受欢迎的今天,不少朋友都在犹豫要不要买一台内衣洗衣机,专门来清洗一些自身的贴身衣物,这个问题的答案是很有必要的,因为目前市场上的大型洗衣机只是起到了清洁的作用,并不能有效地清洁干净我们的贴…

云渲染3ds Max过程中,本地电脑可以断网或关机吗?

云渲染在近年来被越来越多的设计师所采用,因为它可以显著提高渲染速度,节省大量时间和精力。然而,一些用户不清楚云渲染的工作原理,也不知道在使用3ds Max、Maya等软件进行云渲染时,我们的本地电脑是否可以断网或关机。…

网络爬虫代理ip有什么好处?爬虫工作使用代理IP有哪些优势?

在爬虫工作中,使用代理IP有很多好处,可以帮助爬虫程序更加高效地完成任务。以下是使用代理IP的几个优势: 1. 增加匿名性 使用代理IP可以隐藏爬虫程序的真正IP地址,增加匿名性,避免被目标网站封禁。通过代理IP&#xff…

专门为Web应用程序提供安全保护的设备-WAF

互联网网站面临着多种威胁,包括网络钓鱼和人为的恶意攻击等。这些威胁可能会导致数据泄露、系统崩溃等严重后果。 因此,我们需要采取更多有效的措施来保护网站的安全。其中WAF(Web application firewall,Web应用防火墙&#xff0…

边缘计算多角色智能计量插座:用电监测和资产管理的未来智能化引擎

目前主流的智能插座涵盖了红外遥控(控制空调和电视等带有红外标准的电器),配备着测温、测湿等仓库应用场景,配备了人体红外或者毫米波雷达作为联动控制,但是大家有没有思考一个问题,就是随着对接的深入&…

CentOS7安装Xrdp以便Windows远程桌面连接

Centos7已经安装了桌面环境,想要Windows系统远程连接到桌面。 1,which vncserver 如果返回no vncserver,则需要安装 2,yum -y install tigervnc* 3,安装Xrdp yum install epel* -y yum --enablerepoepel -y install xrdp 4…