matlab新手快速上手6(引力搜索算法)

        本文根据一个较为简单的matlab引力搜索算法框架详细分析蚁群算法的实现过程,对matlab新手友好,源码在文末给出

引力搜索算法简介:

        引力搜索算法是一种启发式优化算法,最初于2009年由伊朗的Esmat Rashedi、Hossein Nezamabadi-pour和Saeid Saryazdi提出。这种算法灵感来源于引力的物理现象,其中个体之间的相互吸引力和排斥力决定了它们的运动轨迹,进而影响到最终的优化结果。

        这个算法的核心思想是模拟物体之间的引力和排斥力,以在解空间中搜索最优解。具体来说,每个解(个体)都被视为具有质量的物体,它们之间的相互作用由引力和排斥力来描述。通过计算每个解受到的引力和排斥力,可以更新它们的位置,以期望获得更优的解。

引力搜索算法的一般步骤如下:

  1. 初始化:随机生成初始解(个体)的位置。
  2. 计算适应度:计算每个解的适应度,也就是目标函数的值。
  3. 计算引力和排斥力:根据每个解之间的距离和适应度,计算相互之间的引力和排斥力。
  4. 更新位置:根据引力和排斥力的作用,更新每个解的位置。
  5. 重复迭代:重复执行步骤2到步骤4,直到达到终止条件(如达到最大迭代次数)。
  6. 输出结果:输出最优解或者最优解对应的适应度值。

        引力搜索算法的性能取决于参数的选择、种群大小和迭代次数等因素。这种算法适用于解决各种优化问题,包括连续型和离散型优化问题。

开始编程:

参数与子函数定义:

%============================== 引力搜索算法 ==============================
function GSA
%--------------------------------- 共性参数 -------------------------------
NP=30;                             %种群规模
D=10;                              %变量个数
Max_N=1000;                        %限定代数
G0=100;                            %引力常数
alpha=20;                          %引力常数
K0=NP;                             %更新常数
K1=1;                              %更新常数
%--------------------------------- 个性参数 -------------------------------
MinX=-30; MaxX=30;
%-------------------------------- 设置随机数 -------------------------------
rand('state',round(sum(100*clock)));
%---------------------------------- 初始化 ---------------------------------
X=MinX+(MaxX-MinX)*rand(NP,D);
V=zeros(NP,D);
%子函数(目标函数)
function fun=ackley(X)
fun=20+exp(1)-20*exp(-0.2*(sum(X.^2)/length(X))^0.5)...-exp(sum(cos(2*pi*X))/length(X));

参数定义:

        与前几章相同,NP代表天体个数,D代表解的维度。这里rand('state',round(sum(100*clock)));这行代码表示设置随机数种子,以确保每次运行程序时生成的随机数序列是不同的。

        初始化,生成X矩阵,矩阵维度为NP行D列,元素值为(MinX,MaxX)之间的随机值。V矩阵为NP行D列的元素全为0的矩阵。

子函数(目标函数):

数学公式:

f(x_1, x_2, \ldots, x_n) = 20 + e - 20 \cdot e^{-0.2 \sqrt{\frac{1}{n} \sum_{i=1}^{n} x_i^2}} - e^{\frac{1}{n} \sum_{i=1}^{n} \cos(2\pi x_i)}

函数性质:

        由公式可知,此函数有多个极小值点,但最小值点在原点处,也就是当x(i)都为0时函数最小,为0。 此算法的目标是找到函数的全局最小值点,即找到使函数值最接近0的变量取值。

主函数:

%--------------------------------- 优化开始 -------------------------------
for gen=1:1:Max_NG=G0*exp(-alpha*gen/Max_N);K=round(K0+(K1-K0)*gen/Max_N);for i=1:1:NPF(i)=ackley(X(i,:));end[bestF,bestNo]=sort(F);best=min(F);worst=max(F);if best<worstm=(F-worst-eps)/(best-worst);elsem=ones(1,NP);endM=m/sum(m);
%-------开始引力搜索-------for i=1:1:NPfor k=1:1:DFt(i,k)=0;for j=1:1:Kif bestNo(j)~=itF(i,bestNo(j),k)=G*M(i)*M(bestNo(j))*...(X(bestNo(j),k)-X(i,k))/norm(X(i,:)-X(bestNo(j),:));Ft(i,k)=Ft(i,k)+rand*tF(i,bestNo(j),k);endendendendfor i=1:1:NPa(i,:)=Ft(i,:)/M(i);endV=rand(NP,D).*V+a;X=X+V;%----------------------------- 记录结果 -------------------------------GlobalMin_itr(gen)=best;if mod(gen,100)==0disp(['代数:',num2str(gen),'----最优:',num2str(best),...'----中值:',num2str(median(F)),'----均值:',...num2str(mean(F)),'----方差:',num2str(var(F))]);end
end
GlobalMin=best;
GlobalParams=X(bestNo(1),:);
plot([1:Max_N],GlobalMin_itr);
title('收敛曲线');

         第一个for循环表示循环迭代次数。

        G表示引力常数,公式为:G = G_0 \cdot e^{-\frac{alpha \cdot gen}{MaxN}}可知这是一个递减函数,也就是随着gen的增加,G值越小,也就是迭代次数越多,引力越小。

        K表示更新常数,公式为:K = \text{round}\left(K0 + \frac{(K1 - K0) \cdot gen}{MaxN}\right),round函数表示四舍五入取整,这个公式表示通过线性插值的方式,将K在迭代过程中逐步从K0变为K1。也就是K0是初始更新常数,K1是最终的更新常数。

        接下来的for循环计算每个个体的适应度的值,存储在F对应的元素中。best存储最好的适应度的值,worst存储最差的,当最小值小于最差值时,计算归一化因子m对适应度的值进行归一化,也就是最好的个体对应的m为1,最差的对应为0。

        M为整体归一化过程,M中所有元素加起来为1,这个框架中的M的计算过程有点繁琐,可以直接采用M = ((1./F)/sum(1./F))来计算,效果是一样的,下面开始引力搜索,两个for循环遍历所有个体的所有元素,先让此元素为0。再次根据K更新常数进行遍历其他天体对此天体的引力影响。

        为什么根据K更新常数进行遍历呢,由上面可知,K是随着遍历次数增多而减少,线性地从NP减少到1,也就意味着在循环开始时,遍历所有个体对当前个体的引力,随着循环次数增多,K就能舍去最小的天体引力,也就是适应度最差的个体,在循环快到最后时,将只计算前几个引力强的个体对当前天体的影响。这就是K的作用。

        接下来是代码的核心部分

        首先先了解一下引力公式:F = G\frac{Mm}{r^{2}}由引力公式可得出引力与M和m质量成正比,与r呈反比,因此下面实现通过引力更新位置的代码:

        if控制自身天体不会受自身引力影响,接下来就是计算当前天体受到前K个最优天体的引力影响后的方向与位置。tF矩阵中存储三个元素,表示第i个天体受到第bestNo(j)个天体在第k个维度的变化。G表示引力常数,G*M(i)*M(bestNo(j))表示对应上面引力公式的GMm,通过适应度表示质量,因此这个代码就实现了两个引力相互影响下的引力,这部分就实现了公式中的G\frac{Mm}{}部分。

        接下来实现r^{2}部分,由于引力与距离也有关系,距离越大引力越小那么继续编写代码

首先先理解norm函数,再matlab中,norm([3,4])将返回 5,做这个运算: \sqrt{3^2 + 4^2} = 5 。norm函数就是计算得出两个天体的欧几里得距离.

*(X(bestNo(j),k)-X(i,k))/norm(X(i,:)-X(bestNo(j),:));这里是难点 原代码中使用的是直接除以距离,虽然这样也可以,但是对比引力公式,这样这不便于理解,但是似乎效果更好,我在这里将源代码更改为此形式:

(X(bestNo(j),k)-X(i,k))/norm(X(i,:)-X(bestNo(j),:))^2;

来看此公式,/norm(X(i,:)-X(bestNo(j),:))^2;实现了/r^{2}这一部分,难点在于X(bestNo(j),k)-X(i,k)如何理解,为什么要乘以这个值呢?答案是控制引力方向。如下图所示,当不乘上这个值时,这样我们只计算出了具体的引力值大小F,但是我们需要的是将引力F映射到对应维度的力上,为了使F方向不改变,那么对应的F1和F2就要等比例缩放,因此再乘以X(bestNo(j),k)-X(i,k)这个差值就实现了将力分解到对应的维度上。

如图表示:二维状态下的力:

        继续通过Ft(i,k)更新第i个天体的第k个维度的受力,用当前维度的力加上tF,tF(i, bestNo(j), k)表示是第i个天体再第bestNo(j)个引力影响下第k维的力。再乘以随机值增加多样性,这样就得到了某个天体在前K个天体的引力影响下,在所有维度的的引力大小。

        继续看下面的代码,a(i,:)=Ft(i,:)/M(i)表示第i个天体的加速度,将时间设为单位时间,那么v = \frac{\Delta s}{\Delta t}a = \frac{\Delta v}{\Delta t},就变为v = \Delta sa = \Delta v,因此V=rand(NP,D).*V+a;就表示速度的变化,X=X+V;就表示经过距离的变化后的X。这样就实现了在引力作用下,一个单位时间的天体位置更新。后续就是结果处理,绘制图像等过程。

norm函数:

在 MATLAB 中,norm函数用于计算向量的范数。它可以计算向量的不同类型的范数,包括:

  1. 二范数(默认):向量元素的平方和的平方根。
  2. 一范数:向量元素的绝对值之和。
  3. 无穷范数:向量元素的绝对值的最大值。

语法通常是norm(X)其中X是一个向量。例如,norm([3,4])将返回 5,因为这个向量的二范数是 \sqrt{3^2 + 4^2} = 5 ,norm([3,4,5]) = \sqrt{3^2 + 4^2 + 5^2} = 7.0711

源代码:

%============================== 引力搜索算法 ==============================%                  一个伊朗人2009年提出的一个非常漂亮的算法%============================== 引力搜索算法 ==============================
function GSA
%--------------------------------- 共性参数 -------------------------------
NP=30;                             %种群规模
D=10;                              %变量个数
Max_N=10000;                        %限定代数
G0=100;                            %引力常数
alpha=20;                          %引力常数
K0=NP;                             %更新常数
K1=1;                              %更新常数
%--------------------------------- 个性参数 -------------------------------
MinX=-30; MaxX=30;
%-------------------------------- 设置随机数 -------------------------------
rand('state',round(sum(100*clock)));
%rng(round(sum(100*clock)));
%---------------------------------- 初始化 ---------------------------------
X=MinX+(MaxX-MinX)*rand(NP,D);
V=zeros(NP,D);
%--------------------------------- 优化开始 -------------------------------
for gen=1:1:Max_NG=G0*exp(-alpha*gen/Max_N);K=round(K0+(K1-K0)*gen/Max_N);for i=1:1:NPF(i)=ackley(X(i,:));end[bestF,bestNo]=sort(F);best=min(F);worst=max(F);if best<worstm=(F-worst-eps)/(best-worst);%if gen == 10000%    disp(X(bestNo,:));%endelsem=ones(1,NP);end%M=m/sum(m);M = ((1./F)/sum(1./F));%-------开始引力搜索-------for i=1:1:NPfor k=1:1:DFt(i,k)=0;for j=1:1:Kif bestNo(j)~=itF(i,bestNo(j),k)=G*M(i)*M(bestNo(j))*...(X(bestNo(j),k)-X(i,k))/norm(X(i,:)-X(bestNo(j),:));%tF(i,bestNo(j),k)=G*M(i)*M(bestNo(j))*...%(X(bestNo(j),k)-X(i,k))/norm(X(i,:)-X(bestNo(j),:))^2;Ft(i,k)=Ft(i,k)+rand*tF(i,bestNo(j),k);endendendendfor i=1:1:NPa(i,:)=Ft(i,:)/M(i);endV=rand(NP,D).*V+a;X=X+V;%----------------------------- 记录结果 -------------------------------GlobalMin_itr(gen)=best;if mod(gen,100)==0disp(['代数:',num2str(gen),'----最优:',num2str(best),...'----中值:',num2str(median(F)),'----均值:',...num2str(mean(F)),'----方差:',num2str(var(F))]);end
end
GlobalMin=best;
GlobalParams=X(bestNo(1),:);
plot([1:Max_N],GlobalMin_itr);
title('收敛曲线');function fun=ackley(X)
fun=20+exp(1)-20*exp(-0.2*(sum(X.^2)/length(X))^0.5)...-exp(sum(cos(2*pi*X))/length(X));

结语:

        此章节为作者为准备考试所复习,暂时结束,大致的经典优化算法就是这些,后续遇到更好的智能优化算法还会继续更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/4905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 对接facebook第三方登录

1.登录facebook开发者中心&#xff0c;打开我的应用页面在这里插入图片描述 2.创建应用 3.选择类型 4.填写信息 5.添加登录 6.添加平台 安卓密钥生成【需要 Java 环境!!! 和 openssl库】 Google Code Archive 的 Windows 版 openssl-for-windows OpenSSL 库 将openssl下载到…

如何利用FMEA进行不良事件分析——FMEA软件

免费试用FMEA软件-免费版-SunFMEA FMEA&#xff08;Failure Modes and Effects Analysis&#xff09;是一种预防性的质量工具&#xff0c;它帮助识别产品或过程中可能的故障模式&#xff0c;评估其对系统的影响&#xff0c;并优先处理那些对系统性能影响最大的故障模式。在医疗…

新时代教师口才演讲稿(3篇)

新时代教师口才演讲稿&#xff08;3篇&#xff09; 新时代教师口才演讲稿&#xff08;一&#xff09; 尊敬的各位领导、亲爱的同事们&#xff1a; 大家好&#xff01; 今天&#xff0c;我站在这里&#xff0c;深感荣幸与激动。在这个新时代里&#xff0c;教师的口才不仅仅是传…

webpack3升级webpack4遇到的各种问题汇总

webpack3升级webpack4遇到的各种问题汇总 问题1 var outputNamecompilation.mainTemplate.applyPluginWaterfull(asset-path,outputOptions.filename,{......)TypeError: compilation.mainTemplate.applyPluginsWaterfall is not a function解决方法 html-webpack-plugin 版…

上市公司-双重差分模型手动匹配绿色企业数据及参考资料

01、数据简介 双重差分模型&#xff08;DID&#xff0c;Differences-in-Differences&#xff09;是一种用于估计某个政策或处理效果的经济计量学模型。通过双重差分模型&#xff0c;可以控制一些不易观察的个体特征和时间趋势&#xff0c;以更准确地估计政策的效应。将绿色企业…

文件上传漏洞(upload-labs)

目录 一、文件上传漏洞 1.什么是文件上传漏洞 常见的WebShell 2.文件上传产生漏洞的原因 二、文件上传绕过 &#xff08;一&#xff09;客服端绕过-JS验证 1.前端验证 upload-labs第一关 &#xff08;二&#xff09;绕过黑名单验证 黑名单验证 1.特殊解析后缀 upl…

快速掌握Yarn:软件包管理工具的安装与使用指南【写作AI免费】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

Linux第十五章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

MySQL随便聊----之MySQL的调控按钮-启动选项和系统变量

-------MySQL是怎么运行的 基本介绍 如果你用过手机&#xff0c;你的手机上一定有一个设置的功能&#xff0c;你可以选择设置手机的来电铃声、设置音量大小、设置解锁密码等等。假如没有这些设置功能&#xff0c;我们的生活将置于尴尬的境地&#xff0c;比如在图书馆里无法把手…

Hive安装部署

Apache Hive是一个基于Hadoop分布式文件系统、使用MapReduce算法执行大规模离线数据分析的数据仓库&#xff0c;本文主要描述Hive的安装部署。 如上所示&#xff0c;Hive总体应用架构图&#xff0c;其中&#xff0c;Hive基于HBase或者使用Hadoop分布式文件系统执行MapReduce的分…

注意力机制(四)(多头注意力机制)

​&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;《深度学习基础知识》 相关专栏&#xff1a; ⚽《机器学习基础知识》 &#x1f3d0;《机器学习项目实战》 &#x1f94e;《深度学习项目实…

react报错:Warning: Each child in a list should have a unique “key“ prop.

我是万万没想到的&#xff0c;使用Popconfirm不添加key属性也会报错&#xff1a; react-refresh:160Warning: Each child in a list should have a unique "key" prop. Check the render method of Cell. Seehttps://reactjs.org/link/warning-keys for more informa…

nginx--安装

yum安装 官方包链接&#xff1a;nginx: Linux packages 官方yum源链接&#xff1a;nginx: Linux packages 配置yum源 [rootlocalhost ~]# yum install -y nginx [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gp…

零基础HTML教程(31)--HTML5多媒体

文章目录 1. 背景2. audio音频3. video视频4. audio与video常用属性5. 小结 1. 背景 在H5之前&#xff0c;我们要在网页上播放音频、视频&#xff0c;需要借助第三方插件。 这些插件里面最火的就是Flash了&#xff0c;使用它有几个问题&#xff1a; 首先要单独安装Flash&…

竞争分析:波特五力模型

波特五力模型是分析企业竞争环境的一个分析模型。 根据波特的观点&#xff0c;每家企业都受到“直接竞争对手、顾客、供应商、潜在新进公司和替代性产品”这五个“竞争作用力”的影响。 我们用波特五力模型试着分析下实体书店竞争是否激励。 直接竞争对手&#xff1a;如果直接…

01.Kafka简介与基本概念介绍

1 Kafka 简介 Kafka 是最初由 Linkedin公司开发&#xff0c;是一个分布式、支持分区(partition)的、多副本(replica)的&#xff0c;基于 Zookeeper 协调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各种需求场景&#xff1a;比如基于 hadoop 的…

Spring AOP详解,简单Demo

目录 一、Spring AOP 是什么&#xff1f; 二、学习AOP 有什么作用&#xff1f; 三、AOP 的组成 四、 Spring AOP 简单demo 一、Spring AOP 是什么&#xff1f; Spring AOP&#xff08;Aspect-Oriented Programming in Spring&#xff09;是Spring框架中的一个重要组件&…

c# 构造函数 静态构造函数 内联字段(即静态字段和实例字段) 父类构造函数 父类静态构造函数 父类内联字段 执行顺序

顺序如下&#xff1a; 1.子类的内联字段 2.子类的静态构造函数 3.父类的内联字段 4.父类的静态构造函数 5.父类的构造函数 6.子类的构造函数 7.子类的方法 public class A{public static string a1"A0";static A(){Console.WriteLine("父类内联字段&#xff1a;…

基于遗传优化算法的TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化算法的TSP问题求解&#xff0c;分别对四个不同的城市坐标进行路径搜索。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 ....…

LT6911GX HDMI2.1 至四端口 MIPI/LVDS,带音频 龙迅方案

1. 描述LT6911GX 是一款面向 VR / 显示应用的高性能 HDMI2.1 至 MIPI 或 LVDS 芯片。HDCP RX作为HDCP中继器的上游&#xff0c;可以与其他芯片的HDCP TX配合使用&#xff0c;实现中继器功能。对于 HDMI2.1 输入&#xff0c;LT6911GX 可配置为 3/4 通道。自适应均衡功能使其适合…