进化算法之粒子群算法和Matlab实现(多维)

粒子群算法进阶讲解传送门:(https://blog.csdn.net/DBLLLLLLLL/article/details/103036067)

前面一篇文章介绍了遗传算法,这里再介绍一种进化算法,称为粒子群算法。同遗传算法类似,粒子群算法也是仿照了自然界的生物现象得到的。这种现象就是鸟群在某个未知空间内寻找食物这一思想。

鸟群通过自身经验和种群之间的交流调整自己的搜寻路径,从而不断寻找,直到找到食物最多的地点。其中某个个体就是鸟群中某一只鸟,该个体具有的属性就是其所在位置和搜索方向。该个体所在地点对应的食物数量可以理解为该处函数取值的理想程度。开始时先随机放置各个个体在整个寻找范围内,然后根据个体本身搜索到的历史最优地点和整个种群搜索到的历史最优地点来调整自己的搜索方向和搜索跨度,从而经过多次搜索后找到最优的地点,即最优解。

用数学的语言如何描述上述过程呢?如上述所示,每个个体应该有两个属性,一个是该个体所在的位置,一个是该个体的速度(矢量的速度可以同时表征方向和速度大小),当寻找范围是一个多维的空间时,该位置和速度也是一个多维的向量,例如在n维空间内,共有m个个体,第i个个体用 N i Ni Ni表示,其位置属性为 X i Xi Xi,其速度属性为 V i Vi Vi,那么可以说若一个个体包含两个属性,则可以如下式来表示:

N i = [ X i ; V i ] N_i=[X_i;V_i] Ni=[Xi;Vi]

又因为该个体的位置和速度都是在n维空间内,所以用单位向量的方法表示位置和速度,可以将位置和速度写成如下的向量表达式。

X i = [ x i 1 , x i 2 , x i 3 . . . . . . x i n ] X_i=[x_{i1},x_{i2},x_{i3}......x_{in}] Xi=[xi1,xi2,xi3......xin] V i = [ v i 1 , v i 2 , v i 3 . . . . . . v i n ] V_i=[v_{i1},v_{i2},v_{i3}......v_{in}] Vi=[vi1,vi2,vi3......vin]

具备上述属性的就是一个个体,或者叫一个粒子,那么将m个个体视为一个整体,就是整个鸟群,假设为 P P P,则有:

P = [ N 1 , N 2 , N 3 . . . . . . N m ] P=[N_1,N_2,N_3......N_m] P=[N1,N2,N3......Nm]

至此,一个粒子群就建立完成。那么如何知道该粒子群各个粒子所在位置表现出来的结果是什么呢?

首先是对个体所在位置的食物数量做评估,一般来说就是讲个体的位置作为变量带入到目标函数中,得到一个可以用于评估的结果,这里我们用 Y i Y_i Yi来表示第i个个体所在位置对应的结果,则有:

Y i = f ( X i ) = f ( x i 1 , x i 2 , x i 3 . . . . . . x i n ) = y i Y_i=f(X_i)=f(x_{i1},x_{i2},x_{i3}......x_{in})=y_i Yi=f(Xi)=f(xi1,xi2,xi3......xin)=yi

至此,该粒子群和粒子群的结果都得到了,那么如何通过寻找来更新粒子群的位置、速度信息并观察新的结果呢?

首先在寻找之前,我们要确定这次寻找的速度,确定的方法就是根据个体历史最优位置和种群历史最优位置来调整之前的速度,从而得到这次的速度,现在假设每次运动的时间长度为 T T T,且前一次的速度为

V i t − 1 = [ v i 1 t − 1 , v i 2 t − 1 , v i 3 t − 1 . . . . . . v i n t − 1 ] V_i^{t-1}=[v_{i1}^{t-1},v_{i2}^{t-1},v_{i3}^{t-1}......v_{in}^{t-1}] Vit1=[vi1t1,vi2t1,vi3t1......vint1]

该个体历史最优位置为

X i b e s t = [ x i 1 b e s t , x i 2 b e s t , x i 3 b e s t . . . . . . x i n b e s t ] X_i^{best}=[x_{i1}^{best},x_{i2}^{best},x_{i3}^{best}......x_{in}^{best}] Xibest=[xi1best,xi2best,xi3best......xinbest]

该种群的历史最优位置为

X a l l b e s t = [ x a l l 1 b e s t , x a l l 2 b e s t , x a l l 3 b e s t . . . . . . x a l l n b e s t ] X_{all}^{best}=[x_{all1}^{best},x_{all2}^{best},x_{all3}^{best}......x_{alln}^{best}] Xallbest=[xall1best,xall2best,xall3best......xallnbest]

所以当前位置到个体的历史最优位置的速度为

V i ; b e s t t = ( X i b e s t − X i t ) / T V_{i;best}^t=(X_i^{best}-X_i^t)/T Vi;bestt=(XibestXit)/T

当前位置到种群历史最优位置的方向为

V a l l ; b e s t t = ( X a l l b e s t − X i t ) / T V_{all;best}^t=(X_{all}^{best}-X_i^t)/T Vall;bestt=(XallbestXit)/T

假设这一次的速度为

V i t = [ v i 1 t , v i 2 t , v i 3 t . . . . . . v i n t ] V_i^{t}=[v_{i1}^{t},v_{i2}^{t},v_{i3}^{t}......v_{in}^{t}] Vit=[vi1t,vi2t,vi3t......vint]

则这一次的速度等于

V i t = a 1 ∗ V i t − 1 + a 2 ∗ V i ; b e s t t + a 3 ∗ V a l l ; b e s t t V_i^{t}=a_1*V_i^{t-1}+a_2*V_{i;best}^t+a_3*V_{all;best}^t Vit=a1Vit1+a2Vi;bestt+a3Vall;bestt

其中 a 1 , a 2 , a 3 a_1,a_2,a_3 a1,a2,a3分别是这三个速度的权值系数

为了限制最后的速度大小,避免速度过大跳过最优解,或者速度过小,导致变化较小,迟迟到达不了最优解,所以在面对速度的时候,应该对速度的大小有一个限定的取值范围。即当 V i t > V m a x V_i^{t}>V_{max} Vit>Vmax时, V i t = V m a x V_i^{t}=V_{max} Vit=Vmax,当 V i t < V m i n V_i^{t}<V_{min} Vit<Vmin时, V i t = V m i n V_i^{t}=V_{min} Vit=Vmin

已知这一次的速度 V i t V_i^{t} Vit,就可以根据时间 T T T和当前的位置 X i t X_i^t Xit,求出下一次的位置 X i t + 1 X_i^{t+1} Xit+1

X i t + 1 = X i t + T ∗ V i t X_i^{t+1}=X_i^t+T*V_i^{t} Xit+1=Xit+TVit

如此循环,经过若干次的计算后,最后取种群历史最优位置为最优解。

下面写如何用MATLAB具体实现上述过程。


clc;clear;close all;
%% 初始化种群
f= @(a,b)(a .* sin(a) .* cos(2 * a) - 2 * a .* sin(3 * a)).*(b .* sin(b) .* cos(2 * b) - 2 * b .* sin(3 * b)); % 函数表达式
figure(1);
[x0_1, x0_2]=meshgrid(0:.2:20);
y0=f(x0_1,x0_2);
mesh(x0_1, x0_2, y0);
hold on;N = 500;                         % 初始种群个数
d = 2;                          % 空间维数
ger = 300;                      % 最大迭代次数     
limit = [0, 20;0,20];                % 设置位置参数限制(矩阵的形式可以多维)
vlimit = [-1.5, 1.5;-1.5, 1.5];               % 设置速度限制
c_1 = 0.8;                        % 惯性权重
c_2 = 0.5;                       % 自我学习因子
c_3 = 0.5;                       % 群体学习因子 for i = 1:dx(:,i) = limit(i, 1) + (limit(i, 2) - limit(i, 1)) * rand(N, 1);%初始种群的位置
end    
v = rand(N, d);                  % 初始种群的速度
xm = x;                          % 每个个体的历史最佳位置
ym = zeros(1, d);                % 种群的历史最佳位置
fxm = zeros(N, 1);               % 每个个体的历史最佳适应度
fym = -inf;                      % 种群历史最佳适应度plot3(xm(:,1),xm(:,2),f(xm(:,1),xm(:,2)), 'ro');title('初始状态图');
hold on;
figure(2);
mesh(x0_1, x0_2, y0);
hold on;
plot3(xm(:,1),xm(:,2),f(xm(:,1),xm(:,2)), 'ro');
hold on;
%% 粒子群工作
iter = 1;
times = 1; 
record = zeros(ger, 1);          % 记录器
while iter <= gerfx = f(x(:,1),x(:,2)) ; % 个体当前适应度   for i = 1:N      if fxm(i) < fx(i)fxm(i) = fx(i);     % 更新个体历史最佳适应度xm(i,:) = x(i,:);   % 更新个体历史最佳位置end end
if fym < max(fxm)[fym, nmax] = max(fxm);   % 更新群体历史最佳适应度ym = xm(nmax, :);      % 更新群体历史最佳位置endv = v * c_1 + c_2 * rand *(xm - x) + c_3 * rand *(repmat(ym, N, 1) - x);% 速度更新% 边界速度处理for i=1:d for j=1:Nif  v(j,i)>vlimit(i,2)v(j,i)=vlimit(i,2);endif  v(j,i) < vlimit(i,1)v(j,i)=vlimit(i,1);endendend       x = x + v;% 位置更新% 边界位置处理for i=1:d for j=1:Nif  x(j,i)>limit(i,2)x(j,i)=limit(i,2);endif  x(j,i) < limit(i,1)x(j,i)=limit(i,1);endendendrecord(iter) = fym;%最大值记录if times >= 10cla;mesh(x0_1, x0_2, y0);plot3(x(:,1),x(:,2),f(x(:,1),x(:,2)), 'ro');title('状态位置变化');pause(0.5);times=0;enditer = iter+1;times=times+1;
end
figure(3);plot(record);title('收敛过程')
figure(4);
mesh(x0_1, x0_2, y0);
hold on;
plot3(x(:,1),x(:,2),f(x(:,1),x(:,2)), 'ro');title('最终状态图');disp(['最大值:',num2str(fym)]);
disp(['变量取值:',num2str(ym)]);

粒子群运算过程如图所示:

粒子群运算过程效果图

例:五维的代码

clc;clear;close all;
%% 初始化种群
f= @(a,b,c,d,e)(a.*b.*c.*d.*e); % 函数表达式
% figure(1);
% [x0_1, x0_2]=meshgrid(0:.2:20);
% y0=f(x0_1,x0_2);
% mesh(x0_1, x0_2, y0);
% hold on;N = 500;                         % 初始种群个数
d = 5;                          % 空间维数
ger = 300;                      % 最大迭代次数     
limit = [0, 20;0,20;0,20;0,20;0,20];                % 设置位置参数限制(矩阵的形式可以多维)
vlimit = [-1.5, 1.5;-1.5, 1.5;-1.5, 1.5;-1.5, 1.5;-1.5, 1.5];               % 设置速度限制
c_1 = 0.8;                        % 惯性权重
c_2 = 0.5;                       % 自我学习因子
c_3 = 0.5;                       % 群体学习因子 for i = 1:dx(:,i) = limit(i, 1) + (limit(i, 2) - limit(i, 1)) * rand(N, 1);%初始种群的位置
end    
v = rand(N, d);                  % 初始种群的速度
xm = x;                          % 每个个体的历史最佳位置
ym = zeros(1, d);                % 种群的历史最佳位置
fxm = zeros(N, 1);               % 每个个体的历史最佳适应度
fym = -inf;                      % 种群历史最佳适应度% plot3(xm(:,1),xm(:,2),f(xm(:,1),xm(:,2)), 'ro');title('初始状态图');
% hold on;
% figure(2);
% mesh(x0_1, x0_2, y0);
% hold on;
% plot3(xm(:,1),xm(:,2),f(xm(:,1),xm(:,2)), 'ro');
% hold on;
%% 粒子群工作
iter = 1;
times = 1; 
record = zeros(ger, 1);          % 记录器
while iter <= gerfx = f(x(:,1),x(:,2),x(:,3),x(:,4),x(:,5)) ; % 个体当前适应度   for i = 1:N      if fxm(i) < fx(i)fxm(i) = fx(i);     % 更新个体历史最佳适应度xm(i,:) = x(i,:);   % 更新个体历史最佳位置end end
if fym < max(fxm)[fym, nmax] = max(fxm);   % 更新群体历史最佳适应度ym = xm(nmax, :);      % 更新群体历史最佳位置endv = v * c_1 + c_2 * rand *(xm - x) + c_3 * rand *(repmat(ym, N, 1) - x);% 速度更新% 边界速度处理for i=1:d for j=1:Nif  v(j,i)>vlimit(i,2)v(j,i)=vlimit(i,2);endif  v(j,i) < vlimit(i,1)v(j,i)=vlimit(i,1);endendend       x = x + v;% 位置更新% 边界位置处理for i=1:d for j=1:Nif  x(j,i)>limit(i,2)x(j,i)=limit(i,2);endif  x(j,i) < limit(i,1)x(j,i)=limit(i,1);endendendrecord(iter) = fym;%最大值记录
%     if times >= 10
%         cla;
%         mesh(x0_1, x0_2, y0);
%         plot3(x(:,1),x(:,2),f(x(:,1),x(:,2)), 'ro');title('状态位置变化');
%         pause(0.5);
%         times=0;
%     enditer = iter+1;times=times+1;
end
% figure(3);plot(record);title('收敛过程')
% figure(4);
% mesh(x0_1, x0_2, y0);
% hold on;
% plot3(x(:,1),x(:,2),f(x(:,1),x(:,2)), 'ro');title('最终状态图');disp(['最大值:',num2str(fym)]);
disp(['变量取值:',num2str(ym)]);

代码效果:在这里插入图片描述

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

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

相关文章

粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现

本文的代码将放在最后&#xff0c;需要的小伙伴们可以免费获取哦&#xff01;&#xff01;&#xff01; 不要忘记点赞加关注奥&#x1f60b;&#x1f60b; 文章目录 粒子群算法一、理论基础1、介绍2、核心公式3、图形直观解释 二、问题描述三、解题思路四、MATLAB实现1、参数设…

可查看其他用户聊天记录,ChatGPT 爆出大BUG

ChatGPT一经推出&#xff0c;迅速出圈&#xff0c;用户赞誉如云&#xff0c;“绝对改变世界”、“第四次工业革命的“火药桶”、“苍天啊&#xff0c;它咋啥都会&#xff0c;我失业了”&#xff0c;一时间 ChatGPT 成为完美的代言词。 然而近日&#xff0c;ChatGPT 遇到了大麻烦…

ChatGPT 和 Midjourney 将改变我们的生活,日常工作流程将完全改变并与这些新型工具集成

上周末我花了很多时间先玩 Open AI ChatGPT,然后玩 Midjourney。起初我笑了,然后我开始完全被各种可能性所困扰,然后我终于意识到了它的潜力,并开始将其用于更有成效的工作。 注意:我本可以用它来制作一个引人入胜的点击诱饵标题,但我没有. 这是我问 Open AI 聊天的第一…

博弈的意思_博弈是什么意思(博弈最通俗的解释)

国学智慧《鬼谷子》:在封闭和开合的状态中,达到自己想要的目的。 鬼谷子是一本智谋之书,里面主要讲述的就是在和别人博弈的时候,以什么样的心态和姿态,来达到自己想要的目的。也是为人处世,处世权谋之中,不可不读的一本书。鬼谷子这本书中的捭阖术,其中的道理也要灵活多…

你是伪民主式父母吗?

经常给青少年做咨询&#xff0c;发现一个有趣的现象&#xff0c;就是关于他们家庭的养育方式&#xff0c;孩子和父母的表述是不一样的&#xff0c;父母说他们是民主式的家长&#xff0c;给孩子尽量多的自由&#xff0c;不去过多管制&#xff1b;而孩子说自己的父母是特别专制和…

聪明人是怎么说话办事的?曾国藩这幅书法对联,两句话讲解透彻!

晚清名臣曾国藩的经典对联&#xff1a; “大处着眼&#xff0c;小处着手&#xff1b;群居守口&#xff0c;独居守心”&#xff01; 曾国藩是第一等的聪明人&#xff0c;能在复杂的官场中生存&#xff0c;还能赢得会做人的美誉&#xff0c;关键在于他做到了两件事&#xff0c;一…

嵌入式为什么没有软件架构师?

点击上方“小麦大叔”&#xff0c;选择“置顶/星标公众号” 福利干货&#xff0c;第一时间送达 我从事嵌入式软件开发有6、7个年头&#xff0c;bsp&#xff0c;驱动&#xff0c;应用软件&#xff0c;android hall&#xff0c;framework等都有涉猎。平时除了关注嵌入式行业的发展…

总结一下进程是什么

1、我们常说的进程是什么&#xff1f; 进程&#xff08;Process&#xff09;是计算机中的程序关于某数据集合上的运行活动&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;是操作系统结构的基础。 进程是程序的基本执的实体 2、进程状态 就绪状态 进程已获得除处…

Vue 方法中this指向 引起的祸端

可忽略 最近在写 vue 项目&#xff0c; 使用 总监封装 好的框架&#xff0c;遇到一个问题&#xff1a; vue 实例 methods 中的 方法在传递后&#xff0c;通过 函数名&#xff08;&#xff09; 方式调用后&#xff0c; 其内部 this 竟然没有指向 window。当时就不服了&#xff…

PHP语言25周年,PHP是世界上最好的语言

1995年6月8日&#xff0c;PHP 1.0版本正式问世&#xff0c;目前已经更迭到7.4版本&#xff0c;PHP 8.0 Alpha1版本也有望于今年6月中旬发布。25周年之际&#xff0c;杜蕾斯官方微博发文庆祝&#xff1a;“#PHP语言25周年#不管PHP是不是世界上最好的语言&#xff0c;反正—— pr…

“5G 太耗电,关掉它!”

作者 | Carol 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 随着5G的普及&#xff0c;如今已经有很多手机用户已经体验到了5G的便捷了。无论国内外&#xff0c;从各大运营商及手机厂商向5G的投入中可见&#xff0c;5G的普及只不过是时间问题罢了。 但就在大家都…

Android App 耗电量统计

前言 在Android统计App耗电量比较麻烦&#xff0c;直至Android 4.4&#xff0c;它仍没公开“电量统计”API或文档……额&#xff0c;是的&#xff0c;仅没有公开&#xff0c;并不是没有。平时在手机“设置- 电量”看到的数据 就是系统调用内部API的统计结果。 基础概念 1. 手机…

泰安柒柒:一篇文章带你了解爆火的ChatGPT

OpenAI发布聊天机器人模型ChatGPT&#xff0c;迅速出圈全网。它以对话方式进行交互。以更贴近人的对话方式与使用者互动&#xff0c;可以回答问题、承认错误、挑战不正确的前提、拒绝不适当的请求。 那么&#xff0c;ChatGPT为什么会爆火呢&#xff1f; 1 ChatGPT是什么&#…

ControlNet-有条件图文生成论文阅读

文章目录 摘要算法&#xff1a;ControlNetControlNet in Image Diffusion ModelTrainingImproved Training 实验Canny edgesHough linesHuman scribblesHED boundary mapOpenpifpaf poseOpenposeADE20K segmentation mapCOCO-Stuff segmentation mapDIODE normal mapDepth-to-I…

如何解决“德语/文”等外文字符显示乱码问题

目录 1“德文/语字符”等外文显示乱码原因 2 如何解决“德文/语字符”等外文显示乱码 2.1 使用支持多个“编码”切换的工具打开该文本 2.2 使用变音字符的标准ASCII字符 2.3 将计算机系统切换至西欧编码 3 结尾 1“德文/语字符”等外文显示乱码原因 以德文/语为例&#…

Domino NotesV11开放下载啦!

大家好&#xff0c;才是真的好。此刻我正在北京的Domino NotesV11培训现场写Domino Notes V11&#xff0c;人数众多&#xff0c;群情激扬。上周五&#xff0c;Domino Notes V11已经开放下载&#xff0c;不知道朋友们下到了没有&#xff1f;要是下到了&#xff0c;告诉大家一个好…

Window内置ubuntu安装与图形界面显示

文章目录 一、Window安装ubuntu1.打开控制面板2.WSL升级1&#xff09;启用适用于 Linux 的 Windows 子系统2&#xff09;检查运行 WSL 2 的要求3&#xff09; 启用虚拟机功能4&#xff09; 下载 Linux 内核更新包5&#xff09;将 WSL 2 设置为默认版本 3.安装ubuntu 二、图形界…

计算机需不需要考英语口语,哪些专业需要英语口语考试

哪些专业需要英语口语考试&#xff1f;下面小编为大家整理了相关内容&#xff0c;以供参考&#xff0c;一起来看看吧&#xff01; 哪些专业需要英语口语考试 需要英语口语的都是英语专业或外贸&#xff0c;外交类专业。按照各院校要求&#xff0c;报考外语类专业或报考涉外专业…

【评测】SUPRAcap 100囊式深层过滤器 泽平科技一级代理

以最通用的囊式过滤器形式提供Seitz过滤介质的优良特性 对于安全可靠的工艺开发来说&#xff0c;可规模放大性是至关重要的&#xff0c;SUPRAcap 100以其通 用的结构、尺寸和可与其他滤器共同使用的特性&#xff0c;使其可以应用于任何开发工艺中。 借助于新的SUPRAcap100产品…