万有引力搜索算法(GSA)的matlab实现

简介: 引力搜索算法将所有粒子当作有质量的物体,能够作无阻力运动。每个粒子会受到解空间中其它粒子的万有引力的影响,并产生加速度向质量更大的粒子运动。由于粒子的质量与粒子的适度值相关,适度值大的粒子其质量也会更大,因此,质量小的粒子在朝质量大趋近的过程中逐渐逼近优化问题中的最优解。本文基于matlab编程实现了引力搜索算法,并在5个不同的测试函数进行算法性能的测试,将迭代的过程可视化呈现。.........

参考文献:万有引力搜索算法的分析与改进_范炜锋

一、算法原理

引力搜索算法将所有粒子当作有质量的物体,能够作无阻力运动。每个粒子会受到解空间中其它粒子的万有引力的影响,并产生加速度向质量更大的粒子运动。由于粒子的质量与粒子的适度值相关,适度值大的粒子其质量也会更大,因此,质量小的粒子在朝质量大趋近的过程中逐渐逼近优化问题中的最优解。万有引力搜索算法的特点在于粒子不需要通过环境因素来感知环境中的情况,而是通过个体之间的万有引力的相互作用来实现优化信息的共享,因此,在没有环境因素的影响下,粒子也感知全局的情况,从而对环境展开搜索。

假设在一个D维搜索空间中包含N个粒子,第i个粒子的位置为:

其中表示第i个粒子在第k个维度上的位置。

1.惯性质量计算

每个粒子的惯性质量是由粒子所在位置所求得的适应值有关,在时刻t,粒子Xi的质量用Mi(t)来表示。由于惯性质量根据其相应的适应度值的大小来计算,因此,惯性质量越大的粒子表明越接近于解空间中的最优解,对其它粒子的吸引力越大。质量Mi(t)的计算公式如下:


其中表示粒子Xi的适应度函数。best(t)表示时刻 t中的最佳解,worst(t)表示时刻t中的最差解,如果是求最小值的问题,best对应粒子适应度的最小值,worst对应最大值;如果是求最大值问题,那么正好相反。

2.引力计算

在时刻t,物体j在第k维上受到物体i的引力如下:


其中: 表示一个非常小的常量; Maj(t)表示粒子j的惯性质量,而Mpi(t)表示粒子i的惯性质量。G(t)表示 t时刻的万有引力常数,会随着时间增加而会变小,计算公式如下:


Rij表示粒子i和粒子j的欧式距离,计算公式如下:


综上,在t时刻,第k个维度上作用于粒子i的合力的计算公式为:


另外,为了增强算法的收敛速度,还可以在计算粒子i受到的合力时,只考虑适应度值排名靠前粒子的影响,但这样有可能会导致算法陷入局部最优。

3.位置更新

当粒子受到其它粒子的引力作用后就会产生加速度,则粒子i在第k个维维度上获得的加速度为其作用力与惯性质量的比值:


在每一次迭代过程中,粒子根据计算得到的加速度来更新速度和位置,更新方式如下:


4.算法步骤

标准引力搜索算法的具体步骤如下:

1.初始化算法中的所有粒子的位置与加速度,并设置迭代次数与算法中的参.

数。

2.对每个粒子计算该粒子的适应值,并更新重力常数。

3.由计算得到的适应值计算每个粒子的质量,进一步计算每个粒子的加速度。

4.根据公式更新每个粒子的速度,然后更新粒子的位置。

5.如果未满足终止条件,返回步骤2;否则,输出此次算法的最优解。

二、测试函数

1.Sphere函数


其中x的取值范围为[-5.12,5.12],最优解在[0 0...0]处取得,最优值为0。

function fitness=Sphere(pop)
    %取值范围[-5.12,5.12],最优解在[0 0...0]处取得,最优值为0
    fitness=sum(pop.^2);
end

image.gif

2.Griewank函数


其中,x的取值范围在[-600,600],最优解在[0 0...0]处取得,最优值为0。

function fitness=Griewank(pop)
    %取值范围[-600,600],最优解在[0 0...0]处取得,最优值为0
    fitness=sum(pop.^2)/4000-prod(cos(pop)./sqrt(1:length(pop)))+1;
end

image.gif

3.Rosenbrock函数


其中x的取值范围[-5,10],最优解在[1 1...1]处取得,最优值为0。

function fitness=Rosenbrock(pop)
    %取值范围[-5,10],最优解在[1 1...1]处取得,最优值为0
    fitness=sum((pop(1:end-1).^2-pop(2:end)).^2+(pop(1:end-1)-1).^2);
end

image.gif

4.Ackley函数


其中x的取值范围在[-15,30],最优解在[0 0...0]处取得,最优值为0。原文中有个笔误,没有列出c的取值,c=20。

function fitness=Ackley(pop)
    %取值范围[-15,30],最优解在[0 0...0]处取得,最优值为0
    a=-0.2*sqrt(mean(pop.^2));
    b=mean(cos(20*pop));
    fitness=20+exp(1)-20*exp(a)-exp(b);
end

image.gif

5.Rastrign函数


其中x的取值范围在[-5.12,5.12],最优解在[0 0...0]处取得,最优值为0。

function fitness=Rastrign(pop)
    %取值范围[-5.12,5.12],最优解在[0 0...0]处取得,最优值为0
    fitness=sum(pop.^2-10*cos(2*pi*pop)+10);
end

image.gif

三、matlab部分代码

%% 清理内存空间
clc
clear
close all
%% 粒子参数的设定
index=input('请选择测试函数:1-Sphere,2-Griewank,3-Rosenbrock,4-Ackley,5-Rastrign');
pop_num=100;%粒子数量
dim=2;%问题的维度/决策变量的个数
[x_min,x_max,v_min,v_max]=set_pop(index,dim);%设置粒子位置,速度的上下限
iteration_num=200;%最大迭代次数
fitness=zeros(1,pop_num);%各粒子的适应度函数值
worst=zeros(1,iteration_num);%粒子的最差适应度
best=zeros(1,iteration_num);%粒子的最佳适应度
%% 初始化种群
pop=(x_max-x_min).*rand(pop_num,dim)+x_min;%随机初始化粒子位置
pop_v=zeros(pop_num,dim);%初始化粒子速度
Dij=zeros(pop_num,pop_num);%粒子i和j之间的距离
Fij=zeros(pop_num,pop_num);%粒子i和j之间的引力
F=zeros(pop_num,dim);%粒子受到的合力
Alpha=zeros(pop_num,dim);%粒子的加速度
%% 算法参数的设定
% G0:引力常量
% r:引力公式中的常量
% K:只取适应度前20%的粒子的引力
% dt:每次迭代的时间
[G0,r,K,dt]=deal(100,1,0.2,2);
iteration=1;
%% 迭代求最优解
while iteration<=iteration_num
    省略......
    iteration=iteration+1;
end
figure(2)
plot(1:iteration_num,best)
title('算法收敛情况')
xlabel('迭次次数')
ylabel('适应度函数')

image.gif

四、测试结果

测试图像中始终有一个粒子不会收敛,这是算法中设置的一个全局搜索粒子,目的是避免算法陷入局部最优。为了便于迭代过程的可视化,设定粒子的维度为2,五个测试函数的迭代结果如下:

1.Sphere函数


2.Griewank函数


3.Rosenbrock函数


4.Ackley函数


5.Rastrign函数

image.gif

结果表明,针对上面五个测试函数,采用基本的引力搜索算法就可以迭代求得最优解,而且最终所有粒子都会因引力的作用固定到全局最优的位置上。

相关文章
|
20天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
4天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于DCT变换和位平面分解的数字水印嵌入提取算法matlab仿真
这是一个关于数字水印算法的摘要:使用MATLAB2022a实现,结合DCT和位平面分解技术。算法先通过DCT变换将图像转至频域,随后利用位平面分解嵌入水印,确保在图像处理后仍能提取。核心程序包括水印嵌入和提取,以及性能分析部分,通过PSNR和NC指标评估水印在不同噪声条件下的鲁棒性。
|
5天前
|
算法 数据安全/隐私保护 C++
基于二维CS-SCHT变换和扩频方法的彩色图像水印嵌入和提取算法matlab仿真
该内容是关于一个图像水印算法的描述。在MATLAB2022a中运行,算法包括水印的嵌入和提取。首先,RGB图像转换为YUV格式,然后水印通过特定规则嵌入到Y分量中,并经过Arnold置乱增强安全性。水印提取时,经过逆过程恢复,使用了二维CS-SCHT变换和噪声对比度(NC)计算来评估水印的鲁棒性。代码中展示了从RGB到YUV的转换、水印嵌入、JPEG压缩攻击模拟以及水印提取的步骤。
|
6天前
|
机器学习/深度学习 算法 数据可视化
基于BP神经网络的32QAM解调算法matlab性能仿真
```markdown - 32QAM解调算法运用BP神经网络在matlab2022a中实现,适应复杂通信环境。 - 网络结构含输入、隐藏和输出层,利用梯度下降法优化,以交叉熵损失最小化为目标训练。 - 训练后,解调通过前向传播完成,提高在噪声和干扰中的数据恢复能力。 ``` 请注意,由于字符限制,部分详细信息(如具体图示和详细步骤)未能在摘要中包含。
|
8天前
|
机器学习/深度学习 算法 网络架构
基于yolov2深度学习网络的单人口罩佩戴检测和人脸定位算法matlab仿真
摘要:该内容展示了一个基于YOLOv2的单人口罩佩戴检测和人脸定位算法的应用。使用MATLAB2022A,YOLOv2通过Darknet-19网络和锚框技术检测图像中的口罩佩戴情况。核心代码段展示了如何处理图像,检测人脸并标注口罩区域。程序会实时显示检测结果,等待一段时间以优化显示流畅性。
|
10天前
|
机器学习/深度学习 算法
m基于GA-GRU遗传优化门控循环单元网络的电力负荷数据预测算法matlab仿真
在MATLAB 2022a中,一个基于遗传算法优化的GRU网络展示显著优化效果。优化前后的电力负荷预测图表显示了改进的预测准确性和效率。GRU,作为RNN的一种形式,解决了长期依赖问题,而遗传算法用于优化其超参数,如学习率和隐藏层单元数。核心MATLAB程序执行超过30分钟,通过迭代和适应度评估寻找最佳超参数,最终构建优化的GRU模型进行负荷预测,结果显示预测误差和模型性能的提升。
27 4
|
10天前
|
机器学习/深度学习 算法 数据可视化
基于BP神经网络的16QAM解调算法matlab性能仿真
这是一个关于使用MATLAB2022a实现的16QAM解调算法的摘要。该算法基于BP神经网络,利用其非线性映射和学习能力从复数信号中估计16QAM符号,具有良好的抗噪性能。算法包括训练和测试两个阶段,通过反向传播调整网络参数以减小输出误差。核心程序涉及数据加载、可视化以及神经网络训练,评估指标为误码率(BER)和符号错误率(SER)。代码中还包含了星座图的绘制和训练曲线的展示。
|
12天前
|
机器学习/深度学习 算法
基于BP神经网络的QPSK解调算法matlab性能仿真
该文介绍了使用MATLAB2022a实现的QPSK信号BP神经网络解调算法。QPSK调制信号在复杂信道环境下受到干扰,BP网络能适应性地补偿失真,降低误码率。核心程序涉及数据分割、网络训练及性能评估,最终通过星座图和误码率曲线展示结果。
|
13天前
|
机器学习/深度学习 算法 计算机视觉
基于yolov2深度学习网络模型的鱼眼镜头中人员检测算法matlab仿真
该内容是一个关于基于YOLOv2的鱼眼镜头人员检测算法的介绍。展示了算法运行的三张效果图,使用的是matlab2022a软件。YOLOv2模型结合鱼眼镜头畸变校正技术,对鱼眼图像中的人员进行准确检测。算法流程包括图像预处理、网络前向传播、边界框预测与分类及后处理。核心程序段加载预训练的YOLOv2检测器,遍历并处理图像,检测到的目标用矩形标注显示。
|
16天前
|
算法
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
MATLAB 2022a仿真实现了LDPC码的性能分析,展示了不同码长对纠错能力的影响。短码长LDPC码收敛快但纠错能力有限,长码长则提供更强纠错能力但易陷入局部最优。核心代码通过循环进行误码率仿真,根据EsN0计算误比特率,并保存不同码长(12-768)的结果数据。
43 9
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长