粒子群算法(PSO算法)

粒子群算法概述

1.粒子群优化算法(Particle Swarm Optimization,简称PSO)。粒子群优化算法是在1995年由Kennedy博士和Eberhart博士一起提出的,它源于对鸟群捕食行为的研究。

2.基本核心是利用群体中的个体对信息的共享从而使得整个群体的运动在问题求解空间中产生从无序倒有序的演化过程,从而获得问题的最优解。

3.粒子群算法模拟鸟群的捕食过程,将待优化的问题看做是捕食的鸟群,解空间看做是鸟群的飞行空间,空间的每只鸟的位置即是粒子群算法在解空间的一个粒子,也就是待优化问题的一个解。

粒子群算法满足以下假设:

1.粒子被假定没有体积没有质量,本身的属性只有速度和位置。

2.每个粒子在解空间中运动,它通过速度改变其方向和位置。

3.通常粒子将追踪当前的最优粒子以经过最少代数的搜索达到最优。

PSO算法模型

1.PSO算法首先在可行解空间中初始化一群粒子,每个粒子都代表极值最优化问题的一个潜在最优解,用位置、速度和适应度值三项指标表示该粒子的特征。

2.粒子在解空间中运动,通过跟踪个体极值Pbest和群体极值Gbest来更新个体位置。

3.粒子每更新一次位置和速度,就计算一次适应度值,并且通过比较新粒子的适应度值和个体极值、群体极值的适应度更新个体极值Pbest和群体极值Gbest的位置。

假设在一个n维的搜索空间,有m个粒子组成一个粒子群{X}=\left ( X{_{1}},X_{2},...,X_{m} \right ),其中:

注:

掌握PSO算法需要从以下两个角度进行理解:

1.粒子在一定程度上离开原先的搜索轨迹,向新的方向进行搜索,体现了一种向未知区域开拓的能力,类似于全局搜索

2.粒子在一定程度上继续在原先的搜索轨迹上更细一步的搜索,主要针对搜索过程中所搜索到的区域进行更进一步的搜索,类似于局部搜索

基本粒子群算法

在找到这两个最优解时,粒子根据下面的式子来更新自己的速度和位置:

 注:

Vij 指第i个粒子在第j个分量的速度,k代表第k次循环。r1和r2是介于(0,1)的随机数。c1和c2是学习因子。

关于学习因子c1和c2:

1.如果c1=c2=0,则说明粒子将以当前的飞行速度飞到边界。此时,粒子仅能搜索有限的区域,所以很难找到最优解。

2.如果c1=0,则为“社会”模型,粒子只有群体经验而缺乏认知能力。此时,算法收敛速度快,但容易陷入局部最优。

3.如果c2=0,则为“认知”模型,粒子没有社会共享信息,粒子之间没有信息的交互。此时,算法找到最优解的概率很小。

易知该公式由三部分组成:

1.第一部分为“惯性(inertia)”或“动量(momentum)”部分,反映了粒子的运动“习惯(habit)”,代表粒子有维持自己先前速度的趋势。

2.第二部分为“认知(cognition)”,反映了粒子对自身历史经验的记忆(memory)或回忆(remembrance),代表粒子有向自身历史最佳位置逼近的趋势。

3.第三部分为“社会(social)”部分,反映了粒子间协同合作与知识共享的群体历史经验,代表粒子有向群体或者邻域历史最佳位置逼近的趋势。

标准粒子群算法

Shi和Eberhart于1998年在IEEE国际计算学术会议上发表了题为“A Modified Particle Swarm Optimizer”的论文,首次在速度更新公式中加入了惯性权重,如下式所示:

 其中w>0叫做惯性因子。w越大,全局寻优能力越强,局部寻优能力越弱;w越小,全局寻优能力越弱,局部寻优能力越强。此时的粒子群算法被称作是标准粒子群算法

经验:

实验表明,动态的w能获得更好的寻优结果。在搜索过程中可以对w进行动态调整:可以初始给w赋子较大正值,随着搜索的进行,可以线性地使逐渐减小,这样可以保证在算法开始时,各粒子能够以较大的速度步长在全局范围内探测到较好的区域:而在搜索后期,较小的值则保证粒子能够在极值点周围做精细的搜索,从而使算法有较大的概率向全局最优解位置收敛。对W进行调整,可以权衡全局搜索和局部搜索能力。

目前,采用较多的动态惯性权重值是线性递减权值策略,其表达式如下:

 其中,T_{max}表示最大迭代次数;w_{max}w_{min}分别表示最大和最小惯性权重。在大多数应用中,通常有w_{max}=0.9 , w_{min}=0.4 。

当然,除了线性递减权值策略,还有线性微分递减策略:

 

 压缩粒子群算法

当 w=\lambda 时,标准粒子算法就会退化为压缩粒子群算法:

此时的粒子群算法被称作是压缩粒子群算法。其中 \lambda 为压缩因子:

 离散粒子群算法

基本粒子群算法是在连续域中搜索函数极值的有利工具。为了处理离散空间的问题,Kennedy和Eberhart又提出了一种离散二进制版的粒子群算法。在此算法中,将离散空间问题映射到连续粒子空间,并适当修改粒子群算法来求解。在计算上仍保留经典粒子群算法中的速度和位置更新规则。

在离散粒子群算法中,将离散问题空间映射到连续粒子运动空间,并做适当的修改。仍然保留经典粒子群算法中的速度和位置更新规则。粒子在状态空间的取值只限于0,1两个值,而速度的每一个位代表的是粒子位置所对应的位取值为0/1的可能性。因此在离散粒子群算法中,粒子速度的更新公式依然保持不变,但是个体最优位置和全局最优位置每一位的取值只能为0/1。

更新方式:

 

其中,r ~ U(0 , 1) ,  V_{ij} 表示位置X_{ij}取值为1的可能性,其更新公式与基本粒子群算法一致。

粒子群算法流程

Step 1.种群初始化:群体规模N,每个粒子的位置X和速度V_{i}

Step 2.计算每个粒子的适应值fit_{i};。 

Step 3.对每个粒子,用它的适应度值fit_{i}和个体极值Pbest_{i}比较。如果fit_{i}<Pbest_{i},则用fit_{i}替换Pbest_{i}

Step 4.对每个粒子,用它的适应度值fit_{i}和全局极值Gbest_{i}比较。如果fit_{i}<Gbest_{i},则用fit_{i}替换Gbest_{i}

Step 5.迭代更新粒子的速度V_{i}和位置X

Step6.进行边界条件处理。

Step 7.判断算法终止的条件是否满足。若满足,则结束算法并输出优化结果;否则,返回Step2。

 算法的参数说明

 注:

边界条件处理:

当某一维或若干维的位置或速度超过设定值时,采用边界条件处理策略可将粒子的位置限制在可行搜索空间内,这样能避免种群的膨胀与发散,也能避免粒子大范围地盲目搜索,从而提高了搜素效率。具体的方法有很多种,比如通过设置最大位置限制x_{max}和最大速度限制v_{max},当超过最大位置或最大速度时,在范围内随机产生一个数值代替,或者将其设置为最大值,即边界吸收。

例题

适应度函数fit.m

function y = fit(x)
% 函数用于计算粒子的适应度
% x:输入粒子
% y:粒子适应度值
y = x(1).^2 + x(2).^2 - 10*cos(2*pi*x(1)) - 10*cos(2*pi*x(2)) + 20;

主脚本main.m

%% I. 清空环境
clc
clear
close all%% II. 绘制目标函数曲线
figure
[x,y] = meshgrid(-5:0.1:5,-5:0.1:5);
z = x.^2 + y.^2 - 10*cos(2*pi*x) - 10*cos(2*pi*y) + 20;
mesh(x,y,z)
hold on%% III. 参数初始化
c1 = 1.49445;
c2 = 1.49445;kmax = 100;   % 进化次数  
popsize = 100; %种群规模% 控制粒子速度
Vmax = 1;
Vmin = -1;
% 个体位置变化的最大范围
popmax = 5;
popmin = -5;%% IV. 产生初始粒子和速度
for i = 1:popsize% 随机产生一个种群pop(i,:) = 5*rands(1,2);     %初始各个粒子位置V(i,:) = rands(1,2);         %初始化各个粒子速度% 计算适应度fitness(i) = fit(pop(i,:));   %各个粒子的适应度值
end%% V. 个体极值和群体极值
[best_fitness best_index] = max(fitness);
Gbest = pop(best_index,:);     %粒子群体最优位置
Pbest = pop;                   %粒子个体最优位置
fitnessPbest = fitness;        %粒子个体最优适应度值
fitnessGbest = best_fitness;   %粒子群体最优适应度值%% VI. 迭代寻优
for i = 1:kmaxfor j = 1:popsize% 速度更新V(j,:) = V(j,:) + c1*rand*(Pbest(j,:) - pop(j,:)) + c2*rand*(Gbest - pop(j,:));% 进行速度约束(边界约束)V(j,find(V(j,:)>Vmax)) = Vmax;V(j,find(V(j,:)<Vmin)) = Vmin;% 位置更新pop(j,:) = pop(j,:) + V(j,:);% 进行位置约束(边界约束)pop(j,find(pop(j,:)>popmax)) = popmax;pop(j,find(pop(j,:)<popmin)) = popmin;% 适应度值更新fitness(j) = fit(pop(j,:)); endfor j = 1:popsize  % 个体最优更新if fitness(j) > fitnessPbest(j)Pbest(j,:) = pop(j,:);fitnessPbest(j) = fitness(j);end% 群体最优更新if fitness(j) > fitnessGbestGbest = pop(j,:);fitnessGbest = fitness(j);endend Best(i) = fitnessGbest;%用于存储每次迭代产生的最优的适应度值        
end
%% VII.输出结果
[fitnessGbest, Gbest]
plot3(Gbest(1), Gbest(2), fitnessGbest,'bo','linewidth',1.5)figure
plot(Best)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

运行结果:

ans =80.7065   -4.5223    4.5231

 适应度函数fun.m

function y = fun(x)
%函数用于计算粒子适应度值
%x:输入粒子 
%y:粒子适应度值 
y = 0.5 + (sin(sqrt(x(1)^2+x(2)^2))^2 - 0.5) / (1 + 0.001*(x(1)^2+x(2)^2))^2;
% y = 3*cos(x(1)*x(2)) + x(1) + x(2)^2;

主脚本main.m

%% I. 清空环境
% clc
% clear%% II. 绘制目标函数曲线
figure
[x,y] = meshgrid(-10:0.1:10,-10:0.1:10);
z = 0.5 + (sin(sqrt(x.^2+y.^2)).^2 - 0.5)./ (1 + 0.001*(x.^2+y.^2)).^2;
mesh(x,y,z)
hold on
%% III. 参数初始化
c1 = 1.49445;
c2 = 1.49445;kmax = 100;   % 进化次数
popsize = 100; %种群规模% 控制粒子速度
Vmax = 1;
Vmin = -1;
% 个体位置变化的最大范围
popmax = 10;
popmin = -10;%惯性权重最大值和最小值
Wmax = 0.9;
Wmin = 0.4;% %压缩因子
% phi = c1+c2;
% lamda = 2 / abs(2 - phi - sqrt(phi^2 - 4*phi));   % 压缩因子
%% IV. 产生初始粒子和速度
for i = 1:popsize% 随机产生一个种群pop(i,:) = 10*rands(1,2);     %初始各个粒子位置V(i,:) = rands(1,2);         %初始化各个粒子速度% 计算适应度fitness(i) = fun(pop(i,:));   %各个粒子的适应度值
end%% V. 个体极值和群体极值
[best_fitness best_index] = min(fitness);
Gbest = pop(best_index,:);     %粒子群体最优位置
Pbest = pop;                   %粒子个体最优位置
fitnessPbest = fitness;        %粒子个体最优适应度值
fitnessGbest = best_fitness;   %粒子群体最优适应度值%% VI. 迭代寻优
for i = 1:kmax%计算动态惯性权重w = Wmax - (Wmax - Wmin)*i / kmax;for j = 1:popsize% 速度更新V(j,:) = w*V(j,:) + c1*rand*(Pbest(j,:) - pop(j,:)) + c2*rand*(Gbest - pop(j,:));%标准粒子群算法%         V(j,:) = lamda*V(j,:) + c1*rand*(Pbest(j,:) - pop(j,:)) + c2*rand*(Gbest - pop(j,:));%压缩粒子群算法%         V(j,:) = V(j,:) + c1*rand*(Pbest(j,:) - pop(j,:)) + c2*rand*(Gbest - pop(j,:));%普通粒子群算法% 进行速度约束(边界约束)V(j,find(V(j,:)>Vmax)) = Vmax;V(j,find(V(j,:)<Vmin)) = Vmin;% 位置更新pop(j,:) = pop(j,:) + V(j,:);% 进行位置约束(边界约束)pop(j,find(pop(j,:)>popmax)) = popmax;pop(j,find(pop(j,:)<popmin)) = popmin;% 适应度值更新fitness(j) = fun(pop(j,:));endfor j = 1:popsize% 个体最优更新if fitness(j) < fitnessPbest(j)Pbest(j,:) = pop(j,:);fitnessPbest(j) = fitness(j);end% 群体最优更新if fitness(j) < fitnessGbestGbest = pop(j,:);fitnessGbest = fitness(j);endendBest(i) = fitnessGbest;%用于存储每次迭代产生的最优的适应度值
end
%% VII.输出结果
disp(['当x=',num2str(Gbest(1)),'和','y=',num2str(Gbest(2)),'时','所求函数的最小值是',num2str(fitnessGbest)])plot3(Gbest(1), Gbest(2), fitnessGbest,'bo','linewidth',15)figure
plot(Best)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

运行结果:

>> main
当x=7.2595e-06和y=-1.7485e-05时所求函数的最小值是3.5877e-10

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

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

相关文章

leetcode2934. 最大化数组末位元素的最少操作次数-medium

1 题目&#xff1a;最大化数组末位元素的最少操作次数 官方标定难度&#xff1a;中 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;这两个数组的长度都是 n 。 你可以执行一系列 操作&#xff08;可能不执行&#xff09;。 在每次操作中&#xff0c;你可以选…

Elasticsearch 官网阅读之 Term-level Queries

Term-level Queries 参考&#xff1a;https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-exists-query 一、Term Query Term Query 是 term 精准查询。需要注意的是&#xff0c;在进行 Term Query 的时候&#xff0c;要避免 text 类型的字段&#x…

信贷域——互联网金融业务

摘要 本文深入探讨了信贷域全托与半托业务的定义、特点、适用场景及注意事项&#xff0c;并分析了互联网金融核心信息流的多个方面&#xff0c;包括资金流、信息流、风险流、合规流、物流、技术流和商流&#xff0c;还阐述了金融系统“断直连”业务的相关内容&#xff0c;以及…

科技晚报 AI 速递:今日科技热点一览 丨 2025 年 5 月 17 日

科技晚报AI速递:今日科技热点一览 丨2025年5月17日 我们为您汇总今日的科技领域最新动向&#xff0c;带您快速了解前沿技术、突破性研究及行业趋势。 黄仁勋劝特朗普&#xff1a;AI 芯片出口规则得改&#xff0c;中国紧追其后&#xff1a;英伟达 CEO 黄仁勋在华盛顿 “山与谷论…

使用streamlit实现vLLM多实例信息统一监控

本文代码和配置文件实现了一个基于 Streamlit 和 FastAPI 的前后端分离的应用程序&#xff0c;用于管理和展示 VLLM&#xff08;Very Large Language Model&#xff09;实例的信息。以下是代码和配置文件的总结摘要&#xff1a; 概要 功能概述 前后端启动方式&#xff1a; 使用…

搭建一个WordPress网站需要多少成本

WordPress 最初可能只是一个简单的博客平台。但近年来&#xff0c;它不仅成为了最好的博客平台&#xff0c;还成为了一个全面的内容管理系统。白宫、jQuery、NGINX、《纽约时报》等企业都把 WordPress 作为自己的网上家园。 不过&#xff0c;它们只是其中的佼佼者。根据 Built…

飞帆控件 post or get it when it has get

我在这里分享两个链接&#xff1a; post_get_it 设计 - 飞帆 有人看出来这个控件是干什么用吗&#xff1f; 控件的配置&#xff1a;

AI智能体 | 使用Coze一键制作“假如书籍会说话”视频,18个作品狂吸17.6万粉,读书博主新标杆!(附保姆级教程)

目录 一、整体工作流设计 二、制作工作流 2.1 开始节点 2.2 大模型_生成对话文案 2.3 代码_字幕切割 2.4 画板_对话背景 2.5 循环_对话语音01 2.5.1 选择器_2 2.5.2 语音合成02 2.5.3 语音合成03 2.5.4 变量聚合_1 2.5.5 视频合成01 2.6 循环_3 2.6.1 选择器_3 …

mysql中4种扫描方式和聚簇索引非聚簇索引【爽文一篇】

目录 一 mysql的聚簇索引&非聚簇索引 1.1 数据表 1.2 聚簇索引 1.3 非聚簇索引 1.4 覆盖索引 二 mysql的4种扫描查询 2.1 全表扫描 2.2 索引扫描 2.3 覆盖索引扫描 2.4 回表扫描 2.5 总结 三 mysql的回表查询详解 3.1 回表查询 一 mysql的聚簇索引&非聚簇…

泛微对接金蝶云星空实战案例技术分享

前言 在企业信息化建设中&#xff0c;OA系统与ERP系统对接往往是一个复杂而关键的环节。OA系统通常具有高度的自定义性&#xff0c;其基础资料和单据可能与ERP系统存在字段不一致等问题。同时&#xff0c;OA系统涉及审批流程及流程发起方定义&#xff0c;增加了对接的复杂性。…

一种资源有限单片机处理cJSON数据的方法

一般单片机处理cJSON格式的数据都直接使用cJSON库&#xff0c;但对于Ram较小的单片机&#xff0c;由于资源有限&#xff0c;这并不合适&#xff0c;但我们可以根据cJSON数据的特定格式&#xff0c;使用土方法&#xff0c;直接对字符进行查找裁剪即可 //截取字符串str中字符a与…

关于软件测试开发的一些有趣的知识

文章目录 一、什么是测试&#xff1f;二、为什么要软件测试软件测试三、测试的岗位有哪些四 、软件测试和开发的区别五、走测试岗位为什么还要学开发。4、优秀的测试人员具备的素质我为什么走测试岗位 一、什么是测试&#xff1f; 其实这个问题说简单也不简单&#xff0c;说难…

【C++ 基础数论】质数判断

质数判断 质数&#xff1a;对于所有大于 1 的自然数而言&#xff0c;如果该数除 1 和自身以外没有其它因数 / 约数&#xff0c;则该数被称为为质数&#xff0c;质数也叫素数。 如何判定一个数是否为质数呢&#xff1f; 一个简单的方法是 试除法 &#xff1a; 对于一个数 n&…

6to4、6over4的类比解释

本文由deepseek生成&#xff0c;特此声明 1. 6to4&#xff1a;自动的“快递中转站” 类比场景&#xff1a; 假设你住在一个偏远的小镇&#xff08;IPv6网络&#xff09;&#xff0c;周围被大海&#xff08;IPv4互联网&#xff09;包围&#xff0c;你想给另一个偏远小镇&#…

数字化工厂升级引擎:Modbus TCP转Profinet网关助力打造柔性生产系统

在当今的工业自动化领域&#xff0c;通信协议扮演着至关重要的角色。Modbus TCP和Profinet是两种广泛使用的工业通信协议&#xff0c;它们分别在不同的应用场景中发挥着重要作用。然而&#xff0c;有时我们可能需要将这两种协议进行转换&#xff0c;以实现不同设备之间的无缝通…

计算机网络-MPLS LDP基础实验配置

前面我们学习了LDP的会话建立、标签发布与交换、LDP的工作原理&#xff0c;今天通过一个基础实验来加深记忆。 一、LDP基础实验 实验拓扑&#xff1a; 1、IGP使用OSPF进行通告&#xff0c;使用Lookback接口作为LSR ID&#xff0c;LDP ID自动生成。 2、实验目的&#xff1a;使…

Ocean: Object-aware Anchor-free Tracking

领域&#xff1a;Object tracking It aims to infer the location of an arbitrary target in a video sequence, given only its location in the first frame 问题/现象&#xff1a; Anchor-based Siamese trackers have achieved remarkable advancements in accuracy, yet…

[Java] 方法和数组

目录 1. 方法 1.2 什么是方法 1.2 方法的定义 1.3 方法的调用 1.4 方法的重载 1.5 递归 2. 一维数组 2.1 什么是数组 2.2 数组的创建 2.3 数组的初始化 2.4 遍历数组 2.5 引用数据类型 2.6 关于null 2.7 数组转字符串 2.8 数组元素的查找 2.9 数组的排序 2.10…

全局异常处理:如何优雅地统一管理业务异常

在软件开发中&#xff0c;异常处理是保证系统健壮性的重要环节。一个良好的异常处理机制不仅能提高代码的可维护性&#xff0c;还能为使用者提供清晰的错误反馈。本文将介绍如何通过全局异常处理和业务异常统一处理来编写更加优雅的代码。 一、传统异常处理的痛点 1.1 典型问…

PHP 编程:现代 Web 开发的基石与演进

引言 PHP&#xff08;Hypertext Preprocessor&#xff09;自1995年诞生以来&#xff0c;已成为全球最流行的服务器端脚本语言之一。尽管近年来Node.js、Python等语言在特定领域崭露头角&#xff0c;但PHP仍占据着超过78%的网站市场份额&#xff08;W3Techs数据&#xff09;。本…