引力搜索算法(GSA)优化BP神经网络及matlab代码

目录

0 引言

1 数学模型

2 优化BP神经网络

3 matlab代码

3.1 伪代码

3.2 GSA主函数代码

3.3 GSA-BP

4 视频讲解

0 引言

引力搜索算法(Gravitational Search Algorithm,GSA)是Esmat Rashedi等人在2009年提出随机性启发式搜索算法,该算法灵感主要来源万有引力定律和运动定律,在GSA算法中,将粒子抽象理解为空间分为内一个解,解之间存在相互吸引力,与粒子质量成正比,距离成反比,质量赋予适应度值进行评估,因此在解空间中,每个粒子由其他粒子对其吸引力获取加速度,质量越大(适应度越小)提高加速度越大,从而向更优解移动。

1 数学模型

SSA算法通过粒子进行万有引力和运动定律实现向优势粒子的运动。以下是GSA数学模型:

1)初始化:定义粒子质量位置

其中i为粒子个数,d为粒子问题维度

2)粒子质量:引力和惯性质量综合用适应度进行评估,以下是其质量的数学模型

式(14)为适应度评估,如果适应度都一样则以1作为输出,不一样进行式(15)、(16)进行质量计算;式(17)和(18)为最小化问题的最优和最差适应度选择;式(19)和(20)为最大化问题的最优和最差适应度选择。

3)重力常数:

式中G0和α为常数,分别取100和20,t为当前迭代次数,T为最大迭代次数

4)重力场中的加速度计算:

式中F为重力,M为质量;其中提高算法的随机特征,F重力通过其他重力随机加权,分为两种i形式:

其中Kbest是具有最佳质量和最大质量的第一个K个代理的集合。式中Fij见下式

式中R为俩个粒子之间的欧式距离。

5)粒子移动:由于引力和加速关系,粒子向优势个体移动。

式中V为移动速度。

2 优化BP神经网络

前篇对BP神经网络原理讲解(BP神经网络原理及matlab代码-CSDN博客),从BP神经网络原理讲解中可以发现预测值主要受权值和阈值调整修正完成。因此结合上述GSA原理介绍,可以将BP神经网络权值和阈值作为粒子的位置,每一个粒子对应BP神经网络的预测值,将这个预测值作为适应度更新上述粒子的位置。

3 matlab代码

3.1 伪代码

3.2 GSA主函数代码

GSA主函数代码:

%% 参数
% max_it 最大迭代次数
% space_bound 边界函数
% SYD 适应度函数
% massCalculation  质量函数
% Gconstant 重力函数
% Gfield 加速度函数
% move 移动函数

%% 主函数

for iteration=1:max_it
    

    %边界检查
    X=space_bound(X,up,low); 
    %适应度. 
    fitness=SYD(X,net);
    net.trainParam.showWindow = 0;
    
    if min_flag==1
    [best best_X]=min(fitness); %最小化
    else
    [best best_X]=max(fitness); %最大化
    end        
    
    if iteration == 1
       Fbest=best;
       Lbest=X(best_X,:);
    end

    if min_flag==1
      if best<Fbest  %最小化
       Fbest=best;
       Lbest=X(best_X,:);
      end
    else 
      if best>Fbest  %最大化
       Fbest=best;
       Lbest=X(best_X,:);
      end
    end
      
BestChart=[BestChart Fbest];
MeanChart=[MeanChart mean(fitness)];

%计算 质量M. 公式 14-20
[M]=massCalculation(fitness,min_flag); 

%公式 13 重力常数的计算。
G=Gconstant(iteration,max_it); 

%重力场中的加速度计算。
a=Gfield(M,X,G,Rnorm,Rpower,ElitistCheck,iteration,max_it);

%移动. eq.11-12
[X,V]=move(X,a,V);
end 

质量函数代码:

%% 创建 "质量计算 "函数
function [M]=massCalculation(fit,min_flag)

Fmax=max(fit); 
Fmin=min(fit); 
Fmean=mean(fit); 
[i N]=size(fit);

if Fmax==Fmin
   M=ones(N,1);
else
    
   if min_flag==1 %最小化
      best=Fmin;
      worst=Fmax; %eq.17-18.
   else %最大化
      best=Fmax;
      worst=Fmin; %eq.19-20.
   end
  
   M=(fit-worst)./(best-worst); %eq.15,
end
M=M./sum(M); %eq. 16.
end

重力常数函数代码:

%% 创建 "G "函数
function G=Gconstant(iteration,max_it)

  alfa=20;
  G0=100;
  G=G0*exp(-alfa*iteration/max_it); %eq. 28.
end

加速函数代码:

%% 创建 "加速度a "函数
function a=Gfield(M,X,G,Rnorm,Rpower,ElitistCheck,iteration,max_it)


[N,dim]=size(X);
final_per=2; %在最后一次迭代中,只有 2% 的代理对其他代理施力。
% 总力计算
 if ElitistCheck==1
     kbest=final_per+(1-iteration/max_it)*(100-final_per); %eq. 21的kbest  
     kbest=round(N*kbest/100);
 else
     kbest=N; %eq.9.
 end
    [Ms ds]=sort(M,'descend');
 for i=1:N
     E(i,:)=zeros(1,dim);
     for ii=1:kbest
         j=ds;
         if j~=i
            R=norm(X(i,:)-X(j,:),Rnorm); %欧几里得距离
         for k=1:dim 
             E(i,k)=E(i,k)+rand*(M(j))*((X(j,k)-X(i,k))/(R^Rpower+eps));%eq(7)
             
         end
         end
     end
 end

移动函数:

function [X,V]=move(X,a,V)
%movement.
[N,dim]=size(X);
V=rand(N,dim).*V+a; %eq. 11.
X=X+V; %eq. 12.
end

3.3 GSA-BP

1)单输出回归预测:单输出回归预测:引力搜索算法优化BP神经网络模型(GSA-BP)

2)多输出回归预测:多输出回归预测:引力搜索算法优化BP神经网络模型(GSA-BP)

3)分类模型:分类模型:引力搜索算法优化BP神经网络模型(GSA-BP)

4)时间序列:时间序列:引力搜索算法优化BP神经网络模型(GSA-BP)

4 视频讲解

B站搜索:‘ 不想学习的陈成 ’

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引力搜索算法(Gravitational Search Algorithm,GSA)是一种基于引力模拟的优化算法,它模拟天体之间的引力作用,并通过引力和质量的变化来更新搜索代理(代表搜索空间中的潜在解),从而找到优化问题的最佳解。 下面是 Python 实现 GSA 算法代码: ```python import numpy as np import random # 初始化参数 n = 50 # 搜索代理的数量 m = 2 # 目标问题的维度 G0 = 100 # 引力常数 max_iter = 1000 # 最大迭代次数 eps = 1e-6 # 收敛阈值 # 定义目标函数 def f(x): return (x[0] - 2) ** 2 + (x[1] - 1) ** 2 # 初始化搜索代理位置、速度和质量 X = np.random.rand(n, m) * 10 # 位置范围为 [0,10] V = np.zeros((n, m)) # 初始速度为0 M = np.ones(n) # 质量均为1 # 计算每个搜索代理的适应度值(即目标函数值) fitness = np.array([f(x) for x in X]) # 开始迭代 for it in range(max_iter): # 计算每个搜索代理之间的引力 G = G0 / (it + 1) # 引力常数根据迭代次数递减 dist = np.zeros((n, n)) for i in range(n): for j in range(n): if i != j: dist[i, j] = np.linalg.norm(X[i] - X[j]) # 计算欧几里得距离 F = G * np.tile(M.reshape((-1, 1)), (1, n)) * np.tile(M.reshape((1, -1)), (n, 1)) / (dist ** 2 + eps) # F[i,j] 表示第 i 个搜索代理对第 j 个搜索代理的引力大小 # 计算每个搜索代理所受到的引力和产生的加速度 acc = np.zeros((n, m)) for i in range(n): for j in range(n): if i != j: acc[i] += F[i, j] * (X[j] - X[i]) / (np.linalg.norm(X[j] - X[i]) + eps) # 计算加速度 V = np.random.rand(n, m) * V + acc # 更新速度 X_new = X + V # 更新位置 # 判断新位置是否超出边界 X_new = np.clip(X_new, 0, 10) # 计算新位置的适应度值 fitness_new = np.array([f(x) for x in X_new]) # 计算每个搜索代理的质量 M_new = M.copy() for i in range(n): if fitness_new[i] < fitness[i]: M_new[i] *= 1.2 # 适应度提升时质量增加 else: M_new[i] *= 0.8 # 适应度下降时质量减少 # 更新搜索代理的位置、质量和适应度值 X = X_new.copy() M = M_new.copy() fitness = fitness_new.copy() # 输出最终结果 best_index = np.argmin(fitness) print("最优解:", X[best_index]) print("最优目标值:", fitness[best_index]) ``` 在这个例子中,我们寻找 $f(x)=(x_1-2)^2+(x_2-1)^2$ 的最小值,目标函数的输入是一个 $2$ 维向量 $x=(x_1,x_2)$。算法生成 $50$ 个搜索代理,每个搜索代理的位置和速度被初始化为一个 $m=2$ 维的随机向量。随着迭代的进行,搜索代理之间的引力随着 $G_0/(it+1)$ 的递减而减小。每个搜索代理受到的引力和加速度根据上面的公式计算,然后用当前速度更新位置。更新后的搜索代理位置被修剪到区间 $[0,10]$,以确保它们不超出问题的搜索空间。搜索代理的质量在每个迭代中随适应度值的变化而变化。最终,算法输出找到的最优解和最优目标函数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值