• 【负荷预测】基于蚂蚁优化算法的BP神经网络在负荷预测中的应用研究(Matlab完整代码实现)


    目录

    0 知识回顾

    1 ACO-BP算法

    2 ACO-BP算法基本思路

    3 具体步骤

    4 Matlab代码实现

    5 运行结果

    6 参考文献 

    7 写在最后 


    0 知识回顾

    ACO-BP算法


    传统的BP神经网络训练采用的是误差反向传播学习算法,它的优化目标函数相对复杂,较容易出现陷人局部最优、收敛速度慢等问题[6]。由于BP神经网络的训练算法实质上是对其网络权值和阈值进行迭代调整,因此用蚁群优化算法替代BP算法完成对神经网络权阈值的迭代调整,并最终完成神经网络的训练。

    2 ACO-BP算法基本思路


    蚁群算法解决优化问题的基本思路为:用蚂蚁的行走路径表示待优化问题的可行解,整个蚂蚁群体的所有路径构成待优化问题的解空间。路径较短的蚂蚁释放较多的信息素。经过一定时间,信息素浓度在较短的路径上累计较高,所有选择此路径的蚂蚁也逐渐增多,最终,整个蚁群会在正反馈的作用下集中在最佳路径上,此时对应的便是待优化问题的最优解。
    首先根据权值和阈值的取值池间,将的E义以刘你以S个等长区间,即每个区间的长度被作s等分,将区间的临界值或选择区间中的随机值作为候选值。确定参数个数n,包括网络中所有的权阈值。每个参数Pi(i=1,2,…,n)对应个有S个元素的集合l, ,这些元素为Pi的可能取值。

    3 具体步骤


    1)参数初始化:将所有权值和阈值进行S等分,所有区间初始信息素О,信息素残留系教入,1后尽系代i,前区间信息表为Tabu,最大迭代次数C,网络全局误差E,最大学习次数N;
    2)权值和阈值选择:蚁群m只蚂蚁,对于蚂蚁k依据概率公式(2)的寻路规则进行选择节点所在区间,蚁群迭代一次则完成一次解的构造:

                

    式中\tau _{j}(I_{pi})为集合I_{pi}中第j个元素的信息素值;
    3)蚁群寻优判断:蚁群迭代一次得到的构造解,则是当前迭代后得到误差最小的一组解,计算误差Ec ,判断是否达到蚁群要求,若是则转到4),否则转到5);
    4)网络训练:将蚁群迭代得到的最优构造解,作为初始权值和阈值,选取数据集对网络进行训练,直到满足结束条件即最大学习次数,完成学习。否则,继续学习;
    5)更新信息素:根据式(3)、式( 4)、式(5)对所有区间信息素全局更新,并重置信息表:

                  

    6)蚁群遍历:重复步骤2)到步骤3)。其算法如图1所示。
               

                                    图1 ACO-BP算法流程图

    4 Matlab代码实现

    主函数

    1. %% 清空环境变量
    2. clc
    3. clear
    4. close all
    5. format compact
    6. %% 网络结构建立
    7. %% 清空环境变量
    8. clc
    9. clear
    10. close all
    11. format compact
    12. %% 网络结构建立
    13. %读取数据
    14. data=xlsread('天气_电量_数据.xlsx','C12:J70');%前7列为每个时刻的发电量 最后列为天气
    15. for i=1:58
    16. input(i,:)=[data(i,:) data(i+1,end)];
    17. output(i,:)=data(i+1,1:7);
    18. end
    19. %% 节点个数
    20. inputnum=9;%输入 前一天7个时刻的电量+前一天的天气+预测日的天气
    21. hiddennum=5;
    22. outputnum=7;%预测日7个时刻的发电量
    23. %% 训练数据和预测数据 最后一天用来测试 前面的都拿来训练
    24. input_train=input(1:57,:)';
    25. input_test=input(58,:)';
    26. output_train=output(1:57,:)';
    27. output_test=output(58,:)';
    28. %选连样本输入输出数据归一化
    29. [inputn,inputps]=mapminmax(input_train);
    30. [outputn,outputps]=mapminmax(output_train);
    31. inputn_test=mapminmax('apply',input_test,inputps);
    32. %%
    33. %构建网络
    34. net=newff(inputn,outputn,hiddennum);
    35. %寻优
    36. [bestnest,trace]=antforelm(inputnum,hiddennum,outputnum,net,inputn,outputn);
    37. figure
    38. plot(trace)
    39. title('适应度曲线')
    40. xlabel('迭代数')
    41. ylabel('适应度值')
    42. %% 把最优初始阀值权值赋予网络预测
    43. x=bestnest;
    44. % 用CS优化的BP网络进行值预测
    45. w1=x(1:inputnum*hiddennum);
    46. B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
    47. w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
    48. B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
    49. net.iw{1,1}=reshape(w1,hiddennum,inputnum);
    50. net.lw{2,1}=reshape(w2,outputnum,hiddennum);
    51. net.b{1}=reshape(B1,hiddennum,1);
    52. net.b{2}=B2';
    53. %% BP网络训练
    54. %网络进化参数
    55. net.trainParam.epochs=200;
    56. net.trainParam.lr=0.1;
    57. %net.trainParam.goal=0.00001;
    58. %网络训练
    59. [net,per2]=train(net,inputn,outputn);
    60. %% BP网络预测
    61. %数据归一化
    62. inputn_test=mapminmax('apply',input_test,inputps);
    63. an=sim(net,inputn_test);
    64. test_simu=mapminmax('reverse',an,outputps);
    65. error=test_simu-output_test;
    66. %%
    67. figure
    68. a1=output_test;
    69. a2=test_simu;
    70. plot(a1,'*-');hold on
    71. plot(a2,'O-')
    72. title('各时刻发电量实际值与预测值')
    73. xlabel('')
    74. legend('原始数据','bp预测数据')
    75. set(gca,'XTick',1:7,...
    76. 'XTickLabel',{'9:00','10:00','11:00','12:00','13:00','14:00','15:00'},...
    77. 'TickLength',[0 0]);
    78. grid on
    79. ylabel('发电量(KW)')
    1. %% You can replace the following by your own functions
    2. function error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)
    3. %该函数用来计算适应度值
    4. %x input 个体
    5. %inputnum input 输入层节点数
    6. %outputnum input 隐含层节点数
    7. %net input 网络
    8. %inputn input 训练输入数据
    9. %outputn input 训练输出数据
    10. %error output 个体适应度值
    11. %提取
    12. w1=x(1:inputnum*hiddennum);
    13. B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
    14. w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
    15. B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
    16. %网络进化参数
    17. net.trainParam.epochs=20;
    18. net.trainParam.lr=0.1;
    19. net.trainParam.goal=0.00001;
    20. net.trainParam.show=100;
    21. net.trainParam.showWindow=0;
    22. %网络权值赋值
    23. net.iw{1,1}=reshape(w1,hiddennum,inputnum);
    24. net.lw{2,1}=reshape(w2,outputnum,hiddennum);
    25. net.b{1}=reshape(B1,hiddennum,1);
    26. net.b{2}=B2';
    27. % %网络训练
    28. % net=train(net,inputn,outputn);
    29. an=sim(net,inputn);
    30. % an-outputn
    31. error0=sum(abs(an-outputn));
    32. error=sum(error0);%以均方差作为适应度函数
    1. %% Replace some nests by constructing new solutions/nests
    2. function new_nest=empty_nests(nest,Lb,Ub,pa)
    3. % A fraction of worse nests are discovered with a probability pa
    4. n=size(nest,1);
    5. % Discovered or not -- a status vector
    6. K=rand(size(nest))>pa;
    7. % In the real world, if a cuckoo's egg is very similar to a host's eggs, then
    8. % this cuckoo's egg is less likely to be discovered, thus the fitness should
    9. % be related to the difference in solutions. Therefore, it is a good idea
    10. % to do a random walk in a biased way with some random step sizes.
    11. %% New solution by biased/selective random walks
    12. stepsize=rand*(nest(randperm(n),:)-nest(randperm(n),:));
    13. new_nest=nest+stepsize.*K;
    14. for j=1:size(new_nest,1)
    15. s=new_nest(j,:);
    16. new_nest(j,:)=simplebounds(s,Lb,Ub);
    17. end
    1. function [y,trace]=antforelm(inputnum,hiddennum,outputnum,net,inputn_train,label_train);%蚁群算法%%%%%%%%%%%%%%%%%%%%蚁群算法求函数极值%%%%%%%%%%%%%%%%%%%%%%%
    2. %%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    3. m=5; %蚂蚁个数
    4. G_max=100; %最大迭代次数
    5. Rho=0.5; %信息素蒸发系数
    6. P0=0.5; %转移概率常数
    7. XMAX= 1; %搜索变量x最大值
    8. XMIN=-1; %搜索变量x最小值
    9. d=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;
    10. %%%%%%%%%%%%%%%%%随机设置蚂蚁初始位置%%%%%%%%%%%%%%%%%%%%%%
    11. for i=1:m
    12. X(i,:)=(XMIN+(XMAX-XMIN).*rand(1,d));
    13. Tau(i)=fun(X(i,:),inputnum,hiddennum,outputnum,net,inputn_train,label_train);
    14. end
    15. bestfitness=inf;
    16. bestfitness_position=inf*ones(1,d);
    17. step=0.1; %局部搜索步长
    18. for NC=1:G_max
    19. NC
    20. lamda=1/NC;
    21. [Tau_best,BestIndex]=min(Tau);
    22. %%%%%%%%%%%%%%%%%%计算状态转移概率%%%%%%%%%%%%%%%%%%%%
    23. for i=1:m
    24. P(NC,i)=(Tau(BestIndex)-Tau(i))/Tau(BestIndex);
    25. end
    26. %%%%%%%%%%%%%%%%%%%%%%位置更新%%%%%%%%%%%%%%%%%%%%%%%%
    27. for i=1:m
    28. fun_i=fun(X(i,:),inputnum,hiddennum,outputnum,net,inputn_train,label_train);
    29. %%%%%%%%%%%%%%%%%局部搜索%%%%%%%%%%%%%%%%%%%%%%
    30. if P(NC,i)<P0
    31. temp1=X(i,:)+(rand(1,d))*step*lamda;
    32. else
    33. %%%%%%%%%%%%%%%%全局搜索%%%%%%%%%%%%%%%%%%%%%%%
    34. temp1=X(i,:)+(XMAX-XMIN)*(rand(1,d));
    35. end
    36. %%%%%%%%%%%%%%%%%%%%%边界处理%%%%%%%%%%%%%%%%%%%%%%%
    37. for j=1:d
    38. if temp1(j)<XMIN
    39. temp1(j)=rand;
    40. end
    41. if temp1(j)>XMAX
    42. temp1(j)=rand;
    43. end
    44. end
    45. fun_temp=fun(temp1,inputnum,hiddennum,outputnum,net,inputn_train,label_train);
    46. %%%%%%%%%%%%%%%%%%蚂蚁判断是否移动%%%%%%%%%%%%%%%%%%
    47. if fun_temp
    48. X(i,:)=temp1;
    49. Tau(i)=fun_temp;
    50. end
    51. end
    52. %%%%%%%%%%%%%%%%%%%%%%%更新信息素%%%%%%%%%%%%%%%%%%%%%%%
    53. for i=1:m
    54. Tau(i)=(1-Rho)*Tau(i)+Tau(i);
    55. end
    56. [value,index]=min(Tau);
    57. %%
    58. if value
    59. bestfitness=value;
    60. bestfitness_position=X(index,:);
    61. end
    62. trace(NC)=bestfitness;
    63. end
    64. y=bestfitness_position; %最优变量

    5 运行结果

     

     

    6 参考文献 

    [1]陈智雨,陆金桂.基于ACO-BP神经网络的光伏系统发电功率预测[J].机械制造与自动化,2020,49(01):173-175+187.DOI:10.19344/j.cnki.issn1671-5276.2020.01.047.

    7 写在最后 

    部分理论引用网络文献,如有侵权请联系删除。

    %% 清空环境变量
    clc
    clear
    close all
    format compact 
    %% 网络结构建立
    %% 清空环境变量
    clc
    clear
    close all
    format compact 
    %% 网络结构建立
    %读取数据
    data=xlsread('天气_电量_数据.xlsx','C12:J70');%前7列为每个时刻的发电量 最后列为天气

    for i=1:58
        input(i,:)=[data(i,:) data(i+1,end)];
        output(i,:)=data(i+1,1:7);
    end

    %% 节点个数
    inputnum=9;%输入 前一天7个时刻的电量+前一天的天气+预测日的天气
    hiddennum=5;
    outputnum=7;%预测日7个时刻的发电量

    %% 训练数据和预测数据 最后一天用来测试  前面的都拿来训练
    input_train=input(1:57,:)';
    input_test=input(58,:)';
    output_train=output(1:57,:)';
    output_test=output(58,:)';

    %选连样本输入输出数据归一化
    [inputn,inputps]=mapminmax(input_train);
    [outputn,outputps]=mapminmax(output_train);
    inputn_test=mapminmax('apply',input_test,inputps);
    %%
    %构建网络
    net=newff(inputn,outputn,hiddennum);
    %寻优
    [bestnest,trace]=antforelm(inputnum,hiddennum,outputnum,net,inputn,outputn);
    figure
    plot(trace)
    title('适应度曲线')
    xlabel('迭代数')
    ylabel('适应度值')


    %% 把最优初始阀值权值赋予网络预测
    x=bestnest;
    % 用CS优化的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=200;
    net.trainParam.lr=0.1;
    %net.trainParam.goal=0.00001;

    %网络训练
    [net,per2]=train(net,inputn,outputn);

    %% BP网络预测
    %数据归一化
    inputn_test=mapminmax('apply',input_test,inputps);
    an=sim(net,inputn_test);
    test_simu=mapminmax('reverse',an,outputps);
    error=test_simu-output_test;
    %%
    figure
    a1=output_test;
    a2=test_simu;
    plot(a1,'*-');hold on
    plot(a2,'O-')
    title('各时刻发电量实际值与预测值')
    xlabel('')
    legend('原始数据','bp预测数据')
    set(gca,'XTick',1:7,...                                    
            'XTickLabel',{'9:00','10:00','11:00','12:00','13:00','14:00','15:00'},...
            'TickLength',[0 0]);
    grid on
    ylabel('发电量(KW)')
     

  • 相关阅读:
    华为云云耀云服务器L实例评测|windows系统3389防爆破之安全加固教程
    axios 代理服务器转发 get post
    【kubelet 报错】Failed to activate service ‘org.freedesktop.systemd1‘: timed out
    印度证明离开中国制造,富士康将再没奇迹
    es字段查询加keyword和不加keyword的区别
    遭到全网嘲讽,宋丹丹这次被骂惨了...
    Excel往Word复制表格时删除空格
    华为云Stack首席架构师:打造“称手”的数字化工具,答好政企IT数字化转型这道必选题
    接口自动化和UI自动化的区别
    [架构之路-51]:架构师 - 用系统化、结构化思维解决复杂难搞的软件故障问题 - 马克思主义哲学在软件系统中的应用
  • 原文地址:https://blog.csdn.net/2201_75454341/article/details/128097523