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


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

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

    目录

    一、问题与模型 

    (1)求解问题

    (2)模型建立思路

    二、代码实现

    (1)BP神经网络训练

    (3)适应度函数

    (4)遗传算法主函数


    一、问题与模型 

    (1)求解问题

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

    eq?y%3Dx_%7B1%7D%5E%7B2%7D+x_%7B2%7D%5E%7B2%7D

         函数的图像为:

    157543bae12e437c87c29b16b59ca4fe.jpeg

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

    (2)模型建立思路

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

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

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

    二、代码实现

    (1)BP神经网络训练

    1. clc
    2. clear
    3. tic
    4. load data1 input output
    5. k=rand(1,4000);
    6. [m,n]=sort(k);
    7. input_train=input(n(1:3900),:)';
    8. output_train=output(n(1:3900),:)';
    9. input_test=input(n(3901:4000),:)';
    10. output_test=output(n(3901:4000),:)';
    11. [inputn,inputps]=mapminmax(input_train);
    12. [outputn,outputps]=mapminmax(output_train);
    13. net=newff(inputn,outputn,5);
    14. net.trainParam.epochs=100;
    15. net.trainParam.lr=0.1;
    16. net.trainParam.goal=0.0000004;
    17. net=train(net,inputn,outputn);
    18. inputn_test=mapminmax('apply',input_test,inputps);
    19. an=sim(net,inputn_test);
    20. BPoutput=mapminmax('reverse',an,outputps);
    21. figure(1)
    22. plot(BPoutput,':og')
    23. hold on
    24. plot(output_test,'-*');
    25. legend('预测输出','期望输出','fontsize',12)
    26. title('BP网络预测输出','fontsize',12)
    27. xlabel('样本','fontsize',12)
    28. ylabel('输出','fontsize',12)
    29. error=BPoutput-output_test;
    30. figure(2)
    31. plot(error,'-*')
    32. title('神经网络预测误差')
    33. figure(3)
    34. plot((output_test-BPoutput)./BPoutput,'-*');
    35. title('神经网络预测误差百分比')
    36. errorsum=sum(abs(error))
    37. toc
    38. save data net inputps outputps

    输出结果:

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

    864ac257a7854cf29fe846eab724ca88.jpeg

             BP神经网络预测误差图: 

    94acd20cec764f1ca3cccbeb8ee5898f.jpeg

             BP神经网络预测结果图: 

    2e9f8ae0e248435c9f47f1e49aa657cd.jpeg

            验证集均方误差迭代图: 

    b6857b9180b84a31a878766d2991bcac.jpeg

    (3)适应度函数

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

    1. function fitness = fun(x)
    2. load data net inputps outputps
    3. x=x';
    4. inputn_test=mapminmax('apply',x,inputps);
    5. an=sim(net,inputn_test);
    6. fitness=mapminmax('reverse',an,outputps);

    (4)遗传算法主函数

    1. clc
    2. clear
    3. %% 初始化遗传算法参数
    4. %初始化参数
    5. maxgen=100; %进化代数,即迭代次数
    6. sizepop=20; %种群规模
    7. pcross=[0.4]; %交叉概率选择,0和1之间
    8. pmutation=[0.2]; %变异概率选择,0和1之间
    9. lenchrom=[1 1]; %每个变量的字串长度,如果是浮点变量,则长度都为1
    10. bound=[-5 5;-5 5]; %数据范围
    11. individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]); %将种群信息定义为一个结构体
    12. avgfitness=[]; %每一代种群的平均适应度
    13. bestfitness=[]; %每一代种群的最佳适应度
    14. bestchrom=[]; %适应度最好的染色体
    15. %% 初始化种群计算适应度值
    16. % 初始化种群
    17. for i=1:sizepop
    18. %随机产生一个种群
    19. individuals.chrom(i,:)=Code(lenchrom,bound);
    20. x=individuals.chrom(i,:);
    21. %计算适应度
    22. individuals.fitness(i)=fun(x); %染色体的适应度
    23. end
    24. %找最好的染色体
    25. [bestfitness bestindex]=min(individuals.fitness);
    26. bestchrom=individuals.chrom(bestindex,:); %最好的染色体
    27. avgfitness=sum(individuals.fitness)/sizepop; %染色体的平均适应度
    28. % 记录每一代进化中最好的适应度和平均适应度
    29. trace=[avgfitness bestfitness];
    30. %% 迭代寻优
    31. % 进化开始
    32. for i=1:maxgen
    33. i
    34. % 选择
    35. individuals=Select(individuals,sizepop);
    36. avgfitness=sum(individuals.fitness)/sizepop;
    37. %交叉
    38. individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);
    39. % 变异
    40. individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,[i maxgen],bound);
    41. % 计算适应度
    42. for j=1:sizepop
    43. individuals.fitness(j)=fun(x);
    44. end
    45. %找到最小和最大适应度的染色体及它们在种群中的位置
    46. [newbestfitness,newbestindex]=min(individuals.fitness);
    47. [worestfitness,worestindex]=max(individuals.fitness);
    48. % 代替上一次进化中最好的染色体
    49. if bestfitness>newbestfitness
    50. bestfitness=newbestfitness;
    51. bestchrom=individuals.chrom(newbestindex,:);
    52. end
    53. individuals.chrom(worestindex,:)=bestchrom;
    54. individuals.fitness(worestindex)=bestfitness;
    55. trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度
    56. end
    57. %进化结束
    58. %% 结果分析
    59. [r c]=size(trace);
    60. plot([1:r]',trace(:,2),'r-');
    61. title('适应度曲线','fontsize',12);
    62. xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

          输出结果:

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

    dbc4a7bd290148ef84745abb6be4a265.jpeg

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


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

    若有问题可邮箱联系:1736732074@qq.com 

    博主的WeChat:TCB1736732074

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

  • 相关阅读:
    超短脉冲的时空特性
    MySQL数据xtrabackup物理备份方法
    [附源码]计算机毕业设计JAVA大学生心理健康评估系统
    基于C++和QT开发实现的2048小游戏
    【git 使用】使用 git rebase -i 修改任意的提交信息/合并多个提交
    【CSS】伪类和伪元素
    一篇文章教你学会ASP.Net Core LINQ基本操作
    BL808:【M1s DOCK开发板】与LVGL 使用体验
    蔟/块/页/扇区
    【前端】学习笔记1.JavaScript书写位置、注释、结束符、输入输出、字面量
  • 原文地址:https://blog.csdn.net/qq_45856698/article/details/134306085