zoukankan      html  css  js  c++  java
  • MATLAB神经网络(4) 神经网络遗传算法函数极值寻优——非线性函数极值寻优

    4.1 案例背景

    [y = {x_1}^2 + {x_2}^2]

    4.2 模型建立

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

    网络结构:2-5-1

    训练数据:3900,测试数据:100

    4.3 编程实现

    %% 基于神经网络遗传算法的系统极值寻优
    %% 清空环境变量
    clc
    clear
    
    input=2*randn(2,2000);
    output=sum(input.*input);
    
    [inputn,inputps]=mapminmax(input);
    [outputn,outputps]=mapminmax(output);
    
    %% BP网络训练
    % %初始化网络结构
    net=newff(inputn,outputn,[10,5]);
     
    % 配置网络参数(迭代次数,学习率,目标)
    net.trainParam.epochs=500;
    net.trainParam.lr=0.1;
    net.trainParam.goal=0.000004;
     
    %网络训练
    net=train(net,inputn,outputn);
    %% 初始化遗传算法参数
    %初始化参数
    maxgen=200;                         %进化代数,即迭代次数
    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,inputps,outputps,net);   %染色体的适应度
    end
    %找最好的染色体
    [bestfitness bestindex]=min(individuals.fitness);
    bestchrom=individuals.chrom(bestindex,:);  %最好的染色体
    avgfitness=sum(individuals.fitness)/sizepop; %染色体的平均适应度
    % 记录每一代进化中最好的适应度和平均适应度
    trace=[avgfitness bestfitness]; 
    %% 迭代寻优
    % 进化开始
    for i=1:maxgen
        if(mod(i,10)==0)
            i
        end
        % 选择
        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
            x=individuals.chrom(j,:); %解码
            individuals.fitness(j)=fun(x,inputps,outputps,net);   
        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
    function fitness = fun(x,inputps,outputps,net)
    % 函数功能:计算该个体对应适应度值
    % x           input     个体
    % fitness     output    个体适应度值
    
    %数据归一化
    x=x';
    inputn_test=mapminmax('apply',x,inputps);
    
    %网络预测输出
    an=sim(net,inputn_test);
     
    %网络输出反归一化
    fitness=mapminmax('reverse',an,outputps);
    %% 结果分析
    [r,c]=size(trace);
    plot(trace(:,2),'r-');
    title('适应度曲线','fontsize',12);
    xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);
    axis([0,200,0,1])

    x=bestchrom;
    disp([bestfitness x]);

    fun([0,0],inputps,outputps,net)
    
    ans =
    
        0.0507

    在遗传算法中没有$y = {x_1}^2 + {x_2}^2$函数的原型,由于神经网络的误差,最后的计算值离真实值有一定偏差。

    若将fun函数改为fitness=sum(x.*x);,则可以看到遗传算法取得良好效果,因此能用函数原型就一定要用,如果要用神经网络一定要有充足的训练数据,并指定足够小的误差。

  • 相关阅读:
    居中方法
    12个css实用技巧
    display元素来布局
    伪元素::before与:after
    弹性布局
    输入框下拉菜单
    HTMLinput日期输入类型
    模块XXXX可能与您正在运行的Windows版本不兼容。检查该模块是否与regsvr32.exe的x86(32位)x64(64位)版本兼容。
    Epoll为我们带来了什么
    C内存管理相关内容--取自高质量C++&C编程指南
  • 原文地址:https://www.cnblogs.com/dingdangsunny/p/12329161.html
Copyright © 2011-2022 走看看