고래 최적화 알고리즘 WOA 최적화 BP 신경망(WOA-BP) 회귀 예측 - Matlab 코드 구현

1. 고래 최적화 알고리즘 WOA

Whale Optimization Algorithm(Whale Optimization Algorithm, WOA)은 2016년         Mirjalili 등이 제안한 새로운 휴리스틱 최적화 알고리즘 입니다. WOA 알고리즘은 혹등고래의 사냥 행동에서 영감을 얻었습니다. 사회적인 포유동물로서 사냥할 때 상호 협력하여 먹이를 모읍니다. 고래는 집단 사냥에서 에워싸고 운전하는 두 가지 행동을 합니다. 고래가 먹이를 둘러싸고 원을 그리며 헤엄치고 거품을 내뿜어 거품망을 만들어 먹이를 쫓아내는 독특한 사냥법을 거품망 채집이라고 합니다. WOA 알고리즘의 핵심 아이디어는 혹등고래의 특수한 거품망 채집 방법에서 파생된 것으로 무작위 또는 최적 탐색 에이전트를 통해 고래의 사냥 행동을 시뮬레이션하고 나선형을 통한 거품망 채집의 공격 메커니즘을 시뮬레이션합니다. 최적화의 목적. WOA 알고리즘은 조작이 간단하고 조정 매개변수가 적으며 로컬 최적점을 뛰어넘는 강력한 능력이 있다는 장점이 있습니다 . WOA의 알고리즘 흐름은 다음과 같습니다.

(1) 고래 개체군의 크기, 최대 반복 횟수 및 고래 개체군의 위치를 ​​초기화하는 것을 포함하여 WOA 매개변수를 초기화합니다.

(2) 고래 개체군의 적합도를 계산하고 적합도에 따라 초기 고래 개체수를 선택합니다.

(3) 개인의 체력을 계산하고 현재 최적의 위치를 ​​선택합니다.

(4) 차세대 고래 그룹의 위치를 ​​반복적으로 업데이트합니다.

(5) 종료 조건에 도달하면 최적 개체가 출력된다. 즉, 전역 최적해를 찾는다.

2. WOA-BP 예측모델 구축

        WOA 알고리즘은 BP 신경망의 초기 가중치 임계값을 최적화하여 안정적인 WOA-BP 예측 모델을 설정하고 예측 정확도 및 일반화 능력을 향상시킵니다. 구체적인 프로세스는 다음과 같습니다.

(1) 데이터 정규화, BP 신경망 구축, 토폴로지 결정, 네트워크 가중치 및 임계값 초기화

(2) WOA 매개변수를 초기화하고 WOA 알고리즘의 결정 길이를 계산하고 평균 제곱 오차를 최적화된 목적 함수로 선택합니다.

(3) 알고리즘 정지 기준을 설정하고 WOA를 사용하여 BP 신경망의 가중치 임계값 매개변수를 최적화합니다.

(4) WOA 알고리즘의 최적화된 가중치 임계값 매개변수를 BP 신경망에 할당, 즉 최적의 WOA-BP 모델이 출력되고 WOA-BP는 학습 및 예측에 사용되며 이전의 BP 네트워크와 비교됩니다. 최적화.

코드 획득: 여기를 클릭하여 바로 이동

3. 키 코드

%% 建立BP模型
net=newff(inputn,outputn,hiddennum_best,{'tansig','purelin'},'trainlm');

% 设置BP参数
net.trainParam.epochs=1000;        % 训练次数
net.trainParam.lr=0.01;            % 学习速率
net.trainParam.goal=0.00001;       % 训练目标最小误差
net.trainParam.show=25;            % 显示频率
net.trainParam.mc=0.01;            % 动量因子
net.trainParam.min_grad=1e-6;      % 最小性能梯度
net.trainParam.max_fail=6;         % 最高失败次数

%% 设置WOA参数
popsize=30;    %初始种群规模
maxgen=50;     %最大进化代数
dim=inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+outputnum;    %自变量个数
lb=repmat(-3,1,dim);    %自变量下限
ub=repmat(3,1,dim);     %自变量上限
%初始化位置向量和领导者得分
Leader_pos=zeros(1,dim);
Leader_score=10^20;   

%% 初始化种群
for i=1:dim
    ub_i=ub(i);
    lb_i=lb(i);
   Positions(:,i)=rand(popsize,1).*(ub_i-lb_i)+lb_i;
end
curve=zeros(maxgen,1);%初始化收敛曲线

%% 进化过程
h0=waitbar(0,'WOA优化中...');
for t=1:maxgen
    for i=1:size(Positions,1)%对每个个体一个一个检查是否越界
        % 返回超出搜索空间边界的搜索代理
        Flag4ub=Positions(i,:)>ub;
        Flag4lb=Positions(i,:)<lb;
        Positions(i,:)=(Positions(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
       fit(i)=fitness(Positions(i,:),inputnum,hiddennum_best,outputnum,net,inputn,outputn,output_train,inputn_test,outputps,output_test);     
        % 更新领导者位置
        if fit(i)<Leader_score
            Leader_score=fit(i);
            Leader_pos=Positions(i,:);
        end
    end
    
    a=2-t*((2)/maxgen);
    a2=-1+t*((-1)/maxgen);
    %参数更新
    for i=1:size(Positions,1)
        r1=rand();r2=rand();
        A=2*a*r1-a;
        C=2*r2;
        b=1;
        l=(a2-1)*rand+1;
        p = rand();
        for j=1:size(Positions,2)%对每一个个体地多维度进行循环运算
            %收缩包围机制
            if p<0.5
                if abs(A)>=1
                    rand_leader_index = floor(popsize*rand()+1);
                    X_rand = Positions(rand_leader_index, :);
                    D_X_rand=abs(C*X_rand(j)-Positions(i,j));
                    Positions(i,j)=X_rand(j)-A*D_X_rand;
                elseif abs(A)<1
                    D_Leader=abs(C*Leader_pos(j)-Positions(i,j));
                    Positions(i,j)=Leader_pos(j)-A*D_Leader;
                end
            elseif p>=0.5
                distance2Leader=abs(Leader_pos(j)-Positions(i,j));
                Positions(i,j)=distance2Leader*exp(b.*l).*cos(l.*2*pi)+Leader_pos(j);
            end
        end
    end
    curve(t)=Leader_score;
    waitbar(t/maxgen,h0)
end
close(h0)
setdemorandstream(pi);

%% 权重阈值更新
w1=Leader_pos(1:inputnum*hiddennum_best);   
B1=Leader_pos(inputnum*hiddennum_best+1:inputnum*hiddennum_best+hiddennum_best);  
w2=Leader_pos(inputnum*hiddennum_best+hiddennum_best+1:inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum);   
B2=Leader_pos(inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+1:inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+outputnum);  
% 矩阵重构
net.iw{1,1}=reshape(w1,hiddennum_best,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum_best);
net.b{1}=reshape(B1,hiddennum_best,1);
net.b{2}=reshape(B2,outputnum,1);

4. 시뮬레이션 결과

(1) 실험식에 따르면 최적의 은닉층 노드 수는 입력 및 출력 노드의 수를 통해 구합니다.

(2) WOA-BP와 BP의 예측 비교 차트 및 오차 차트

 (3) BP 및 WOA-BP의 다양한 오류 지표 및 예측 정확도

(4) Whale 최적화 알고리즘 WOA 피트니스 진화 곡선

 (5) BP 및 WOA-BP 모델의 회귀 그래프

 (6) BP 및 WOA-BP 모델의 오차 히스토그램

 4. 결론

    고래알고리즘과 BP 신경망은 모두 무작위성을 기반으로 한 알고리즘이므로 동일한 매개변수 집합의 최적화 결과가 다를 수 있으며 모델의 견고성과 신뢰성을 검증하기 위해 반복 실험이 필요하다는 점에 유의해야 한다.

추천

출처blog.csdn.net/baoliang12345/article/details/130493695