(完整word版)用MATLAB编写PSO算法及实例
- 格式:doc
- 大小:87.45 KB
- 文档页数:5
实验报告课程名称数字图像处理分院班组姓名学号日期年月日图1软件的总体设计界面布局如上图所示,主要分为2 个部分:显示区域与操作区域. 显示区域:显示载入原图,以及通过处理后的图像。
操作区域:通过功能键实现对图像的各种处理,为了实现界面的简洁,大部分的功能放到了菜单栏里。
在截图中可见,左部为一系列功能按键如“对比度调节”、“亮度调节"、“裁剪”等等;界面正中部分为图片显示部分,界面中下方为系列功能切换选择组。
菜单栏的设计展示图2具体设计现介绍各个功能模块的功能与实现。
4。
1 菜单栏的设计.通过Menu Editor 创建如下菜单,通过以下菜单来控制显示或隐藏功能按键图3以“文件”菜单中“打开”为例说明实现用户界面功能键“打开”的显示与隐藏. 实现该功能通过添加callback就可以了:通过Toolbar Editor可以添加快捷图标,如下图:图4图像的读取和保存.(1)利用“文件"菜单中的“打开”、“保存"或者使用菜单栏下的快捷图标分别实现图片的读取与保存。
图5如果没有选中文件还会提示图6(2)图像保存。
利用“uiputfile”、“imwrite”函数实现图像文件的保存。
图7同样按下去下取消键会提示:图8(3)程序的退出。
你可以在菜单栏使用退出键,或者在主界面右下角有关闭按钮就可以退出程序。
对图像进行任意的亮度和对比度变化调整,显示和对比变换前后的图像。
按下亮度调节按钮会弹出输入框,输入调节倍数,如下图:图9(注意:这里的倍数是相反的调节,你会发现输入0。
1后亮度会变亮)调节后的图像如下:图11对比度的调节跟亮度一样,调节后的图像如下:图124.4 用鼠标选取图像感兴趣区域,显示和保存该选择区域.按下裁剪按钮把鼠标移动到处理后的图像窗口,光标会变成十字形状,拖动光标会出现方框,如下:图13双击方框里的图像就完成了裁剪。
4。
5 图像转化为灰度图像。
由于在matlab中较多的图像处理函数支持对灰度图像进行处理,故对图像进行灰度转化十分必要。
PSO算法Matlab程序下面是主函数的源程序,优化函数则以m文件的形式放在fitness.m里面,对不同的优化函数只要修改fitness.m就可以了通用性很强。
主函数源程序(main.m)%------基本粒子群优化算法(Particle Swarm Optimization)-----------%------名称:基本粒子群优化算法(PSO)%------作用:求解优化问题%------说明:全局性,并行性,高效的群体智能算法%------作者:孙明杰(dreamsun2001@)%------单位:中国矿业大学理学院计算数学硕2005%------时间:2006年8月17日<CopyRight@dReAmsUn>%------------------------------------------------------------------%------初始格式化--------------------------------------------------clear all;clc;format long;%------给定初始化条件----------------------------------------------c1=1.4962; %学习因子1c2=1.4962; %学习因子2w=0.7298; %惯性权重MaxDT=1000; %最大迭代次数D=10; %搜索空间维数(未知数个数)N=40; %初始化群体个体数目eps=10^(-6); %设置精度(在已知最小值时候用)%------初始化种群的个体(可以在这里限定位置和速度的范围)------------for i=1:Nfor j=1:Dx(i,j)=randn; %随机初始化位置v(i,j)=randn; %随机初始化速度endend%------先计算各个粒子的适应度,并初始化Pi和Pg---------------------- for i=1:Np(i)=fitness(x(i,:),D);y(i,:)=x(i,:);endpg=x(1,:); %Pg为全局最优for i=2:Nif fitness(x(i,:),D)<fitness(pg,D)pg=x(i,:);endend%------进入主要循环,按照公式依次迭代,直到满足精度要求------------ for t=1:MaxDTfor i=1:Nv(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));x(i,:)=x(i,:)+v(i,:);if fitness(x(i,:),D)<p(i)p(i)=fitness(x(i,:),D);y(i,:)=x(i,:);endif p(i)<fitness(pg,D)pg=y(i,:);endendPbest(t)=fitness(pg,D);end%------最后给出计算结果disp('*************************************************************')disp('函数的全局最优位置为:')Solution=pg'disp('最后得到的优化极值为:')Result=fitness(pg,D)disp('*************************************************************')%------算法结束---DreamSun GL & HF-----------------------------------适应度函数源程序(fitness.m)function result=fitness(x,D)sum=0;for i=1:Dsum=sum+x(i)^2;endresult=sum;对于一些有约束条件和没有约束条件的优化问题,具体什么情况下用什么算法还是要长期的经验积累。
位置pid算法matlab位置PID算法是一种广泛应用于工业控制领域的反馈控制算法。
通过比较期望位置与实际位置之间的差异,PID控制器可以调整执行机构的动作,以达到精确控制的目的。
MATLAB作为一种强大的数学工具,为PID控制算法的实现提供了便利。
一、PID控制器设计首先,我们需要设计PID控制器。
在MATLAB中,可以使用`pid`函数来实现。
通过设置比例(P)、积分(I)和微分(D)三个参数,我们可以确定PID控制器的行为。
这三个参数需要根据具体的应用场景进行调整,以达到最佳的控制效果。
二、位置反馈系统设计接下来,我们需要设计位置反馈系统。
该系统通过传感器获取实际位置信息,并将其输入到PID控制器中。
在MATLAB中,可以使用`feedback`函数来实现位置反馈系统。
我们需要将期望位置、实际位置和PID控制器的输出作为系统的输入和输出。
三、MATLAB实现在MATLAB中,我们可以按照以下步骤实现位置PID算法:1.导入必要的库和函数;2.定义期望位置、实际位置和PID控制器的输出;3.使用`feedback`函数创建位置反馈系统;4.将期望位置、实际位置和PID控制器的输出作为系统的输入和输出;5.运行系统并获取控制结果。
下面是一个简单的示例代码:```matlab%导入必要的库和函数globalkP,kI,kD;%设置比例、积分、微分参数k=1;%初始比例系数int=0;%积分项初始值D=zeros(1,1);%微分项初始值为零x=feedback(position_sensor,actual_position,k,int,D);%创建反馈系统%模拟期望位置和实际位置的变化target_position=[0.512];%期望位置向量actual_position=[];%实际位置向量,初始为空position_error=target_position-actual_position;%期望位置与实际位置的误差向量control_signal=k*position_error;%PID控制器的输出信号%控制系统的仿真fort=1:length(target_position)actual_position=actual_position+control_signal(t);%更新实际位置向量fprintf('Time:%d,ActualPosition:%f\n',t,actual_position);%输出当前时间及实际位置end```这段代码中,我们首先定义了比例、积分和微分三个参数,并使用`feedback`函数创建了位置反馈系统。
%% Particle Swarm Optimization(PSO),粒子群优化算法计算局放源位置%%%% Clear Screenclc;close all;clear all;%% InitializationLx=4;Ly=4;Lz=4; % 变压器长宽高Sensor_xyz0=[1,0,1]';Sensor_xyz1=[0,1.5,0.5]';Sensor_xyz2=[2,3,0.5]';S ensor_xyz3=[3,1.5,0.7]';%四个传感器位置Source=[2,2,2]'; % PD位置t=linspace(0,50e-9,1001);tc=10e-9;c=3e8;delta_t0=sqrt(sum((Source-Sensor_xyz0).^2))/c;delta_t1=sqrt(sum((Source-Sensor_xyz1).^2))/c;delta_t2=sqrt(sum((Source-Sensor_xyz2).^2))/c;delta_t3=sqrt(sum((Source-Sensor_xyz3).^2))/c;y0=-(exp(-(t-tc-delta_t0)/0.2e-9)-exp(-(t-tc-delta_t0)/3e-9)).*stepfun(t,tc+delta_t0).*sin(2*pi*1e9*(t-tc-delta_t0)); %传感器0接收到PD信号y1=-(exp(-(t-tc-delta_t1)/0.2e-9)-exp(-(t-tc-delta_t1)/3e-9)).*stepfun(t,tc+delta_t1).*sin(2*pi*1e9*(t-tc-delta_t1)); %传感器1接收到PD信号y2=-(exp(-(t-tc-delta_t2)/0.2e-9)-exp(-(t-tc-delta_t2)/3e-9)).*stepfun(t,tc+delta_t2).*sin(2*pi*1e9*(t-tc-delta_t2)); %传感器2接收到PD信号y3=-(exp(-(t-tc-delta_t3)/0.2e-9)-exp(-(t-tc-delta_t3)/3e-9)).*stepfun(t,tc+delta_t3).*sin(2*pi*1e9*(t-tc-delta_t3)); %传感器3接收到PD信号% plot(y0)% hold on% plot(y1)% plot(y2)% plot(y3)tic; %程序运行计时% [~,R]=gccphat(y1',y0');[~,YI]=max(R);t10=(YI-length(t))*diff(t(1:2)); % GCCPHAT计算时延1% [~,R]=gccphat(y2',y0');[~,YI]=max(R);t20=(YI-length(t))*diff(t(1:2)); % GCCPHAT计算时延2% [~,R]=gccphat(y3',y0');[~,YI]=max(R);t30=(YI-length(t))*diff(t(1:2)); % GCCPHAT计算时延3[~,YI]=max(xcorr(y1,y0));t10=(YI-length(t))*diff(t(1:2)); % GCCPHAT计算时延1[~,YI]=max(xcorr(y2,y0));t20=(YI-length(t))*diff(t(1:2)); % GCCPHAT计算时延2[~,YI]=max(xcorr(y3,y0));t30=(YI-length(t))*diff(t(1:2)); % GCCPHAT计算时延3t10=delta_t1-delta_t0;t20=delta_t2-delta_t0;t30=delta_t3-delta_t0;% Lx=1;Ly=1;Lz=0.8; % 变压器长宽高%Sensor_xyz0=[0,0.2,0.4]';Sensor_xyz1=[0,0.6,0.3]';Sensor_xyz2=[0.3,1,0 .2]';Sensor_xyz3=[0.6,1,0.5]';%四个传感器位置% Source=[0.61,0.32,0.35]'; % PD位置% t10=0.036;t20=0.1;t30=0.053;%PSO 初始化error=1e-6; %允许误差MaxNum=50; %粒子最大迭代次数nvars=3; %目标函数的自变量个数particlesize=30; %粒子群规模c1=2; %每个粒子的个体学习因子,也称为加速常数1c2=2; %每个粒子的社会学习因子,也称为加速常数2w=0.6; %惯性因子a=1; %约束因子,控制速度的权重vmax=0.8; %粒子的最大飞翔速度% x=3*rand(particlesize,nvars); %粒子的所在位置x(:,1)=Lx*rand(particlesize,1); %初始化x(:,2)=Ly*rand(particlesize,1);x(:,3)=Lz*rand(particlesize,1);% x=2*ones(particlesize,nvars);v=2*rand(particlesize,nvars); %粒子的飞翔速度%% Objective Function%用inline定义适应度函数以便将子函数文件与主程序文件放在一起%目标函数为:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)) 注意不同于原始目标函数%inline命令定义适应度函数如下% fitness=inline('1./(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x');%inline定义的适应度函数会使程序运行速度大大降低%% Particle swarm optimizationf=zeros(particlesize,1);for i=1:particlesize% for j=1:nvars% f(i)=fitness(x(i,j));% endf(i)=Fitness1(x(i,:),Sensor_xyz0',Sensor_xyz1',Sensor_xyz2',Sensor_xyz 3',t10,t20,t30,c);endpersonalbest_x=x;personalbest_faval=f;[globalbest_faval,YI]=min(personalbest_faval);globalbest_x=personalbest_x(YI,:);k=1;Trace_error=[];Trace_pos=[];while k<=MaxNumfor i=1:particlesize% for j=1:nvars% f(i)=fitness(x(i,j));% endf(i)=Fitness1(x(i,:),Sensor_xyz0',Sensor_xyz1',Sensor_xyz2',Sensor_xyz 3',t10,t20,t30,c);if f(i)<personalbest_faval(i) %判断当前位置是否是历史上的最佳位置personalbest_faval(i)=f(i);personalbest_x(i,:)=x(i,:);endend[globalbest_faval,i]=min(personalbest_faval);globalbest_x=personalbest_x(i,:);for i=1:particlesize %更新粒子群里的每个个体的最新位置v(i,:)=w*v(i,:)+c1*rand*(personalbest_x(i,:)-x(i,:))+c2*rand*(globalbest_x-x(i,:));for j=1:nvars %判断每个粒子的飞翔速度是否超过了最大飞翔速度if v(i,j)>vmaxv(i,j)=vmax;elseif v(i,j)<-vmaxv(i,j)=-vmax;endendx(i,:)=x(i,:)+a*v(i,:);if x(i,1)>Lxx(i,1)=Lx*rand;endif x(i,2)>Lyx(i,2)=Ly*rand;endif x(i,3)>Lzx(i,3)=Lz*rand;endendTrace_error=[Trace_error,globalbest_faval];Trace_pos=[Trace_pos;globalbest_x];if abs(globalbest_faval)<errorbreak;endk=k+1;end%% Post Processingsubplot(2,1,1)plot(Trace_error,'k--','LineWidth',2)grid onsubplot(2,1,2)plot3(Trace_pos(:,1),Trace_pos(:,2),Trace_pos(:,3),'--','LineWidth',2) hold onplot3(Trace_pos(end,1),Trace_pos(end,2),Trace_pos(end,3),'r*') xlim([0,Lx])ylim([0,Ly])zlim([0,Lz])plot3(Source(1),Source(2),Source(3),'ok')grid onValue2=globalbest_x;Value2=num2str(Value2);disp(strcat('The corresponding coordinate =',Value2))% Value1=1/globalbest_faval-1;% Value1=num2str(Value1);%% Post Processing% %strcat指令可以实现字符的组合输出% disp(strcat('The maximum value = ',' ',Value1))% %输出最大值所在的横坐标位置% Value2=globalbest_x;% Value2=num2str(Value2);% disp(strcat('The corresponding coordinate =',Value2))% x=-5:0.01:5;% y=2.1*(1-x+2*x.^2).*exp(-x.^2/2);% plot(x,y,'m-','LineWidth',3)% hold on% plot(globalbest_x,1/globalbest_faval-1,'kp','LineWidth',4) % legend('Objective Function','The maximum value')% xlabel('x')% ylabel('y')% grid ontoc;适应度函数:%% PDLocationPSO1适应度函数functionF1=Fitness1(Source,Sensor_xyz0,Sensor_xyz1,Sensor_xyz2,Sensor_xyz 3,t10,t20,t30,v)% Source 局放源位置% Sensor_xyz 传感器位置% t10 时延(相对于传感器0)% v 传播速度d0=sqrt(sum((Source-Sensor_xyz0).^2));F1=norm(sqrt(sum((Source-Sensor_xyz1).^2))-d0-v*t10)+norm(sqrt(sum((Source-Sensor_xyz2).^2))-d0-v*t20)+...norm(sqrt(sum((Source-Sensor_xyz3).^2))-d0-v*t30);结果:。
用MATLAB 编写PSO 算法及实例1.1 粒子群算法PSO 从这种模型中得到启示并用于解决优化问题。
PSO 中,每个优化问题的潜在解都是搜索空间中的一只鸟,称之为粒子。
所有的粒子都有一个由被优化的函数决定的适值( fitness value) ,每个粒子还有一个速度决定它们飞翔的方向和距离。
然后粒子们就追随当前的最优粒子在解空间中搜索。
PSO 初始化为一群随机粒子(随机解),然后通过迭代找到最优解。
在每一次迭代中,粒子通过跟踪两个极值来更新自己;第一个就是粒子本身所找到的最优解,这个解称为个体极值;另一个极值是整个种群目前找到的最优解,这个极值是全局极值。
另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。
假设在一个维的目标搜索空间中,有个粒子组成一个群落,其中第个粒子表示为一个维的向量,。
第个粒子的“飞行 ”速度也是一个维的向量,记为,。
第个粒子迄今为止搜索到的最优位置称为个体极值,记为,。
整个粒子群迄今为止搜索到的最优位置为全局极值,记为在找到这两个最优值时,粒子根据如下的公式(1.1)和( 1.2)来更新自己的速度和位置:(1.1) (1. 2)其中:和为学习因子,也称加速常数(acceleration constant),和为[0,1]范围内的均匀随机数。
式(1.1)右边由三部分组成,第一部分为“惯性(inertia)”或“动量(momentum)”部分,反映了粒子的运动“习惯(habit)”,代表粒子有维持自己D N i D ),,,(21iD i i i x x x X N i ,,2,1 i D ),,21i iD i i v v v V ,( 3,2,1 i i ),,,(21iD i i best p p p p N i ,,2,1 ),,,(21gD g g best p p p g )(2211id gd id id id id x p r c x p r c v w v id id id v x x 1c 2c 1r 2r先前速度的趋势;第二部分为“认知(cognition)”部分,反映了粒子对自身历史经验的记忆(memory)或回忆(remembrance),代表粒子有向自身历史最佳位置逼近的趋势;第三部分为“社会(social)”部分,反映了粒子间协同合作与知识共享的群体历史经验。
粒子群算法优化电路matlab粒子群算法(Particle Swarm Optimization, PSO)是一种基于群体智能的优化算法,其灵感来源于鸟群或鱼群等生物群体的行为。
PSO算法通过模拟个体在搜索空间中的迭代移动来寻找最优解。
在电路优化中,PSO算法可以用于寻找电路参数的最优解,比如电路的元件数值、拓扑结构等。
在MATLAB中,可以利用现有的PSO算法工具箱或者编写自己的PSO算法来优化电路。
下面我将从几个方面介绍如何在MATLAB中使用PSO算法优化电路。
首先,你需要定义电路的优化目标。
这可以是最小化电路的成本、功耗或者最大化电路的性能等。
然后,将电路的参数作为优化变量,建立优化问题的目标函数。
在MATLAB中,你可以利用匿名函数或者自定义函数来定义这个目标函数。
接下来,你可以使用MATLAB中的优化工具箱中的PSO算法函数,比如“particleswarm”函数来执行优化过程。
你需要设置PSO算法的参数,比如粒子数量、迭代次数、惯性权重等。
这些参数的选择会影响优化结果,需要根据具体问题进行调整。
另外,你还可以编写自己的PSO算法代码来优化电路。
PSO算法的核心是粒子的位置更新和速度更新公式,你可以根据PSO算法的原理编写这些更新公式的MATLAB代码,然后在每次迭代中更新粒子的位置和速度,直到满足停止条件为止。
最后,在优化过程结束后,你可以分析优化结果,比较优化前后电路的性能指标,验证优化效果。
如果需要,你还可以将优化后的电路参数应用到实际电路中进行验证。
总之,利用PSO算法优化电路需要定义优化目标、建立目标函数,选择合适的PSO算法参数,执行优化过程并分析优化结果。
在MATLAB中,你可以利用现有的优化工具箱函数或者编写自己的PSO 算法代码来实现电路优化。
希望这些信息能对你有所帮助。
PSO 粒子群算法Matlab源码%PSO标准算法其中w c1 c2 a可以改变%包含初始化函数迭代函数还有总体的PSO算法函数function[Result,OnLine,OffLine,MinMaxMeanAdapt]=PSO_Stand(SwarmSize,ParticleSize,ParticleSc ope,IsStep,IsDraw,LoopCount,IsPlot)%function[Result,OnLine,OffLine,MinMaxMeanAdapt]=PSO_Stand(SwarmSize,ParticleSize,ParticleSc ope,InitFunc,StepFindFunc,AdaptFunc,IsStep,IsDraw,LoopCount,IsPlot)%功能描述:一个循环n次的PSO算法完整过程,返回这次运行的最小与最大的平均适应度,以及在线性能与离线性能%[Result,OnLine,OffLine,MinMaxMeanAdapt]=PsoProcess(SwarmSize,ParticleSize,Particle Scope,InitFunc,StepFindFunc,AdaptFunc,IsStep,IsDraw,LoopCount,IsPlot)%输入参数:SwarmSize:种群大小的个数%输入参数:ParticleSize:一个粒子的维数%输入参数:ParticleScope:一个粒子在运算中各维的围;% ParticleScope格式:% 3维粒子的ParticleScope格式:% [x1Min,x1Max% x2Min,x2Max% x3Min,x3Max]%%输入参数:InitFunc:初始化粒子群函数%输入参数:StepFindFunc:单步更新速度,位置函数%输入参数:AdaptFunc:适应度函数%输入参数:IsStep:是否每次迭代暂停;IsStep=0,不暂停,否则暂停。
(PSO-BP)结合粒⼦群的神经⽹络算法以及matlab实现原理:PSO(粒⼦群群算法):可以在全局范围内进⾏⼤致搜索,得到⼀个初始解,以便BP接⼒BP(神经⽹络):梯度搜素,细化能⼒强,可以进⾏更仔细的搜索。
数据:对该函数((2.1*(1-x+2*x.^2).*exp(-x.^2/2))+sin(x)+x','x')[-5,5]进⾏采样,得到30组训练数据,拟合该⽹络。
神经⽹络结构设置:该⽹络结构为,1-7-1结构,即输⼊1个神经元,中间神经元7个,输出1个神经元程序步骤:第⼀步:先采⽤抽取30组数据,包括输⼊和输出第⼀步:运⾏粒⼦群算法,进⾏随机搜索,选择⼀个最优的解,该解的维数为22维。
第⼆步:在;粒⼦群的解基础上进⾏细化搜索程序代码:clcclearticSamNum=30;HiddenNum=7;InDim=1;OutDim=1;load train_xload train_fa=train_x';d=train_f';p=[a];t=[d];[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t);NoiseVar=0.01;Noise=NoiseVar*randn(1,SamNum);SamOut=tn + Noise;SamIn=SamIn';SamOut=SamOut';MaxEpochs=60000;lr=0.025;E0=0.65*10^(-6);%%%the begin of PSOE0=0.001;Max_num=500;particlesize=200;c1=1;c2=1;w=2;vc=2;vmax=5;dims=InDim*HiddenNum+HiddenNum+HiddenNum*OutDim+OutDim;x=-4+7*rand(particlesize,dims);v=-4+5*rand(particlesize,dims);f=zeros(particlesize,1);%%for jjj=1:particlesizetrans_x=x(jjj,:);W1=zeros(InDim,HiddenNum);B1=zeros(HiddenNum,1);W2=zeros(HiddenNum,OutDim);B2=zeros(OutDim,1);W1=trans_x(1,1:HiddenNum);B1=trans_x(1,HiddenNum+1:2*HiddenNum)';W2=trans_x(1,2*HiddenNum+1:3*HiddenNum)';B2=trans_x(1,3*HiddenNum+1);Hiddenout=logsig(SamIn*W1+repmat(B1',SamNum,1));Networkout=Hiddenout*W2+repmat(B2',SamNum,1);Error=Networkout-SamOut;SSE=sumsqr(Error)f(jjj)=SSE;endpersonalbest_x=x;personalbest_f=f;[groupbest_f i]=min(personalbest_f);groupbest_x=x(i,:);for j_Num=1:Max_numvc=(5/3*Max_num-j_Num)/Max_num;%%v=w*v+c1*rand*(personalbest_x-x)+c2*rand*(repmat(groupbest_x,particlesize,1)-x);for kk=1:particlesizefor kk0=1:dimsif v(kk,kk0)>vmaxv(kk,kk0)=vmax;else if v(kk,kk0)<-vmaxv(kk,kk0)=-vmax;endendendendx=x+vc*v;%%for jjj=1:particlesizetrans_x=x(jjj,:);W1=zeros(InDim,HiddenNum);B1=zeros(HiddenNum,1);W2=zeros(HiddenNum,OutDim);B2=zeros(OutDim,1);W1=trans_x(1,1:HiddenNum);B1=trans_x(1,HiddenNum+1:2*HiddenNum)';W2=trans_x(1,2*HiddenNum+1:3*HiddenNum)';B2=trans_x(1,3*HiddenNum+1);Hiddenout=logsig(SamIn*W1+repmat(B1',SamNum,1));Networkout=Hiddenout*W2+repmat(B2',SamNum,1);Error=Networkout-SamOut;SSE=sumsqr(Error);f(jjj)=SSE;end%%for kk=1:particlesizeif f(kk)<personalbest_f(kk)personalbest_f(kk)=f(kk);personalbest_x(kk)=x(kk);endend[groupbest_f0 i]=min(personalbest_f);if groupbest_f0<groupbest_fgroupbest_x=x(i,:);groupbest_f=groupbest_f0;endddd(j_Num)=groupbest_fendstr=num2str(groupbest_f);trans_x=groupbest_x;W1=trans_x(1,1:HiddenNum);B1=trans_x(1,HiddenNum+1:2*HiddenNum)';W2=trans_x(1,2*HiddenNum+1:3*HiddenNum)';B2=trans_x(1,3*HiddenNum+1);%the end of PSO%%for i=1:MaxEpochs%%Hiddenout=logsig(SamIn*W1+repmat(B1',SamNum,1));Networkout=Hiddenout*W2+repmat(B2',SamNum,1);Error=Networkout-SamOut;SSE=sumsqr(Error)ErrHistory=[ SSE];if SSE<E0,break, enddB2=zeros(OutDim,1);dW2=zeros(HiddenNum,OutDim);for jj=1:HiddenNumfor k=1:SamNumdW2(jj,OutDim)=dW2(jj,OutDim)+Error(k)*Hiddenout(k,jj);endendfor k=1:SamNumdB2(OutDim,1)=dB2(OutDim,1)+Error(k);enddW1=zeros(InDim,HiddenNum);dB1=zeros(HiddenNum,1);for ii=1:InDimfor jj=1:HiddenNumfor k=1:SamNumdW1(ii,jj)=dW1(ii,jj)+Error(k)*W2(jj,OutDim)*Hiddenout(k,jj)*(1-Hiddenout(k,jj))*(SamIn(k,ii));dB1(jj,1)=dB1(jj,1)+Error(k)*W2(jj,OutDim)*Hiddenout(k,jj)*(1-Hiddenout(k,jj));endendendW2=W2-lr*dW2;B2=B2-lr*dB2;W1=W1-lr*dW1;B1=B1-lr*dB1;endHiddenout=logsig(SamIn*W1+repmat(B1',SamNum,1));Networkout=Hiddenout*W2+repmat(B2',SamNum,1);aa=postmnmx(Networkout,mint,maxt);x=a;newk=aa;figureplot(x,d,'r-o',x,newk,'b--+')legend('原始数据','训练后的数据');xlabel('x');ylabel('y');toc注:在(i5,8G,win7,64位)PC上的运⾏时间为30s左右。
matlab,粒子群优化算法粒子群优化算法(Particle Swarm Optimization, PSO)是一种基于群体智能的优化算法,模拟了鸟群觅食行为中的信息共享与协作过程。
该算法通过不断迭代优化粒子的位置和速度,以求解最优化问题。
在PSO算法中,将待求解问题抽象为函数的最优化问题,即找到使目标函数取得最小值或最大值的自变量值。
算法的基本思想是通过模拟鸟群觅食的行为,将每个鸟粒子看作一个潜在的解,粒子的位置表示解的候选解,速度表示解的搜索方向和距离。
PSO算法的核心是粒子的位置更新和速度更新。
在每次迭代中,根据粒子当前的位置和速度,更新其下一步的位置和速度。
位置的更新是根据粒子当前位置和速度计算出的。
速度的更新是根据粒子当前速度、粒子自身历史最优位置和整个粒子群历史最优位置计算出的。
具体而言,PSO算法的位置更新公式如下:新位置 = 当前位置 + 速度速度的更新公式如下:新速度 = 惯性权重 * 当前速度 + 加速度因子1 * 随机数1 * (个体最优位置 - 当前位置) + 加速度因子2 * 随机数2 * (群体最优位置 - 当前位置)其中,惯性权重表示粒子保持运动惯性的因素,加速度因子1和加速度因子2分别表示个体认知和社会经验对粒子速度的影响,随机数1和随机数2用于引入随机性,个体最优位置是粒子自身历史上找到的最优位置,群体最优位置是整个粒子群历史上找到的最优位置。
PSO算法的优点是简单易实现、不需要求导等先验知识、全局搜索能力较强。
然而,PSO算法也存在一些问题,如易陷入局部最优、对问题的收敛速度较慢等。
针对这些问题,研究者们提出了很多改进的PSO算法,如自适应权重的PSO算法、混沌PSO算法等,以提高算法的性能。
粒子群优化算法是一种利用群体智能模拟鸟群觅食行为的优化算法,通过迭代更新粒子的位置和速度,来求解最优化问题。
虽然PSO算法存在一些问题,但在实际应用中已取得了广泛的成功。
%------基本粒子群优化算法(Particle Swarm Optimization)-----------%------名称:基本粒子群优化算法(PSO)%------作用:求解优化问题%------说明:全局性,并行性,高效的群体智能算法%------作者:马天雨%------单位:中南大学信息科学与工程学院%------时间:2009年4月12日%格式标准化clear all;clc;format long;%初始化各个因子c1=1.4962; %学习因子c1c2=1.4962; %学习因子c2w=0.7298; %惯性权重wN=20; %粒子群规模D=6; %搜索空间维数(本程序适合3维及以上,不能求解1,2维) eps=10^(-6); %满足条件限制的误差(在不知道最小值时候不用设置) MaxDT=500; %粒子群繁殖的代数%初始化粒子的速度和位置,数据结构用矩阵A表示for i=1:Nfor j=1:2*DA(i,j)=rand;endendfor i=1:Nfor j=2*D+1:3*DA(i,j)=A(i,j-2*D);endend%计算各个粒子的适应度for i=1:NA(i,3*D+1)=fitness(A(i,1:D),D);end%对粒子的适应度进行排序B=sortrows(A,3*D+1);%排序后适应度低的前面一半粒子直接进入下一代NextGeneration=zeros(N,3*D+1);for i=1:N/2for j=1:3*D+1NextGeneration(i,j)=B(i,j);endend%后一半粒子进行遗传选择和交叉操作for i=1:N/2for j=1:3*D+1Cross(i,j)=B(i+N/2,j);endend%产生一个随机的交叉位置for i=1:N/4Anumber=randperm(D-1);if Anumber(1)~=1position=Anumber(1);elseposition=Anumber(2);end%交叉进行for j=position:D-1temp=Cross(i,j);Cross(i,j)=Cross(N/2-i+1,j);Cross(N/2-i+1,j)=temp;endend%交叉结束,进行更新for i=1:N/2Cross(i,3*D+1)=fitness(Cross(i,1:D),D);if Cross(i,3*D+1)<B(i+N/2,3*D+1)for j=2*D+1:3*DCross(i,j)=Cross(i,j-2*D);endelsefor j=2*D+1:3*DCross(i,j)=B(i,j);endendend%下面选择最好的粒子N/2个进入下一代Pool=zeros(N,3*D+1);for i=1:N/2for j=1:3*D+1Pool(i,j)=B(i+N/2,j);endendfor i=1+N/2:Nfor j=1:3*D+1Pool(i,j)=Cross(i-N/2,j);endend%POOLX表示排序后的粒子选择池PoolX=sortrows(Pool,3*D+1);for i=1+N/2:Nfor j=1:3*D+1NextGeneration(i,j)=PoolX(i-N/2,j);endendPbest=NextGeneration(i,2*D+1:3*D);for i=2:Nif NextGeneration(i,3*D+1)<fitness(Pbest,D)Pbest=NextGeneration(i,2*D+1:3*D);endend%根据粒子群公式进行迭代(Stander PSO Step)%速度更新for i=1:Nfor j=D+1:2*DA(i,j)=w*NextGeneration(i,j)+c1*rand*(NextGeneration(i,j+D)-NextGeneration (i,j-D))+c2*rand*(Pbest(j-D)-NextGeneration(i,j-D));endend%位置更新for i=1:Nfor j=1:DA(i,j)=NextGeneration(i,j)+A(i,j+D);endA(i,3*D+1)=fitness(A(i,1:D),D);if A(i,3*D+1)<NextGeneration(i,3*D+1)for j=2*D+1:3*DA(i,j)=A(i,j-2*D);endelsefor j=2*D+1:3*DA(i,j)=NextGeneration(i,j-2*D);endendend%下面进入主要循环,循环到最大次数得到最优解和最小值%DDTime=1;for time=1:MaxDTB=sortrows(A,3*D+1);NextGeneration=zeros(N,3*D+1);for i=1:N/2for j=1:3*D+1NextGeneration(i,j)=B(i,j);endend%遗传选择交叉for i=1:N/2for j=1:3*D+1Cross(i,j)=B(i+N/2,j);endendfor i=1:N/4Anumber=randperm(D-1);if Anumber(1)~=1position=Anumber(1);elseposition=Anumber(2);endfor j=position:D-1temp=Cross(i,j);Cross(i,j)=Cross(N/2-i+1,j);Cross(N/2-i+1,j)=temp;endend%交叉结束,进行更新for i=1:N/2Cross(i,3*D+1)=fitness(Cross(i,1:D),D); if Cross(i,3*D+1)<B(i+N/2,3*D+1)for j=2*D+1:3*DCross(i,j)=Cross(i,j-2*D);endelsefor j=2*D+1:3*DCross(i,j)=B(i,j);endendend%下面选择最好的粒子N/2个进入下一代Pool=zeros(N,3*D+1);for i=1:N/2for j=1:3*D+1Pool(i,j)=B(i+N/2,j);endendfor i=1+N/2:Nfor j=1:3*D+1Pool(i,j)=Cross(i-N/2,j);endendPoolX=sortrows(Pool,3*D+1);for i=1+N/2:Nfor j=1:3*D+1NextGeneration(i,j)=PoolX(i-N/2,j);endendPbest=NextGeneration(i,2*D+1:3*D);for i=2:Nif NextGeneration(i,3*D+1)<fitness(Pbest,D)Pbest=NextGeneration(i,2*D+1:3*D);endend%根据粒子群公式进行迭代for i=1:Nfor j=D+1:2*DA(i,j)=w*NextGeneration(i,j)+c1*rand*(NextGeneration(i,j+D)-NextGenerati on(i,j-D))+c2*rand*(Pbest(j-D)-NextGeneration(i,j-D));endendfor i=1:Nfor j=1:DA(i,j)=NextGeneration(i,j)+A(i,j+D);endA(i,3*D+1)=fitness(A(i,1:D),D);if A(i,3*D+1)<NextGeneration(i,3*D+1)for j=2*D+1:3*DA(i,j)=A(i,j-2*D);endelsefor j=2*D+1:3*DA(i,j)=NextGeneration(i,j-2*D);endendendPg(time)=fitness(Pbest,D);%DDTime=DDTime+1;%if fitness(Pbest,D)<eps%break;%endend%算法结束,得到的结果显示如下:disp('****************************************************') disp('最后得到的最优位置为:')X=Pbest'disp('得到的函数最小值为:')Minimize=fitness(Pbest,D)disp('****************************************************') %绘制进化代数和适应度关系曲线图xx=linspace(1,MaxDT,MaxDT);yy=Pg(xx);plot(xx,yy,'b-')hold ongrid ontitle('带交叉因子的粒子群优化算法进化代数与适应度值关系曲线图') legend('粒子适应度曲线走势')%------算法结束---DreamSun GL & HF-------------------------。
matlab粒子群算法粒子群算法(Particle Swarm Optimization,PSO)是一种优化算法,通过模拟鸟群的行为规律来解决复杂问题。
它可以用于解决单目标优化问题,也可以扩展到多目标优化问题。
PSO算法简单易行,收敛速度快,在不适合使用梯度信息的问题中表现出色。
下面是对PSO算法的详细介绍。
1.PSO算法原理PSO算法的基本思想是利用种群中的个体不断地通过信息交流来最优解。
算法开始时,随机生成一群具有随机位置和速度的粒子。
每个粒子代表一个解,其位置表示解的状态,速度表示的方向和速度。
每个粒子根据自己当前的位置和速度更新自己的位置和速度。
在更新过程中,粒子会记住个体最好位置(pbest)和全局最好位置(gbest)。
通过不断迭代调整粒子的位置和速度,最终找到最优解。
2.算法步骤(1)初始化粒子群的位置和速度,设定适应度函数和停止条件。
(2) 对每个粒子,计算其适应度值,并更新个体最优位置(pbest)和全局最优位置(gbest)。
(3)按照以下公式更新粒子的速度和位置:v(i+1) = w * v(i) + c1 * rand( * (pbest(i) - x(i)) + c2 * rand( * (gbest - x(i))x(i+1)=x(i)+v(i+1)其中,w为惯性权重,表示保持上一步速度的部分;c1、c2分别为学习因子,调整个体和全局的影响力;rand(为随机函数。
(4)判断是否满足停止条件,如果满足则输出最优解;否则返回步骤(2)。
3.算法参数(1)种群规模:需要根据问题的复杂程度和计算资源来选择。
(2)惯性权重w:控制上一步速度的影响力,一般取较小的值。
(3)学习因子c1、c2:控制个体和全局的影响力,一般取较大的值。
(4)停止条件:可以是迭代次数达到预定值,适应度函数值变化小于一定阈值等。
4.PSO的应用PSO算法可以广泛应用于各种优化问题,例如:(1)函数优化:通过函数的最优解,找到最小或最大值。
matlab自带的粒子群算法粒子群算法(Particle Swarm Optimization,PSO)是一种基于群体智能的优化算法,可用于解决各种实数空间的优化问题。
在Matlab中,PSO算法由函数“particleswarm”实现。
本文将简要介绍该函数的使用方法和一些相关参考内容,以便读者熟悉和使用该算法。
首先,为了使用Matlab中的PSO算法,需要了解“particleswarm”函数的基本用法和语法。
该函数的基本语法如下:[pbest,fval] = particleswarm(fun,nvars,lb,ub)其中,fun是优化目标函数的句柄,nvars是问题变量的维数,lb和ub分别是每个变量的下界和上界。
该函数返回优化结果pbest和对应的目标函数值fval。
除了基本用法外,“particleswarm”函数还提供了许多可选参数,用于进一步控制粒子群算法的行为。
例如,可以通过设置“MaxIterations”参数来指定最大迭代次数,或者通过设置“MaxStallIterations”参数来指定停滞迭代次数。
为了更好地理解PSO算法,读者可以参考以下相关内容:1. 书籍:《Swarm Intelligence: Principles, Advances, and Applications》(英文版),作者:Russel C. Eberhart等。
这本书对群体智能算法的原理、应用和进展进行了全面介绍,其中包括对PSO算法的详细解释和实例应用。
2. 学术论文:《Particle swarm optimization》(2008),作者:Maurice Clerc。
这篇经典的学术论文详细阐述了PSO算法的原理、参数设置和改进策略,对理解和应用PSO算法具有重要参考价值。
3. Matlab官方文档:Matlab官方网站提供了针对“particleswarm”函数的详细文档和示例代码。
用户可以通过访问Matlab官方网站并搜索“particleswarm”来获取相关信息。
基于MATLAB的粒子群优化算法程序设计一、概述粒子群优化(Particle Swarm Optimization,PSO)算法是一种基于群体智能的优化搜索技术,它通过模拟鸟群、鱼群等动物群体的社会行为,利用群体中的个体信息共享机制,引导粒子在解空间中搜索最优解。
自1995年由Eberhart博士和Kennedy博士提出以来,PSO 算法因其简单、高效的特点,在函数优化、神经网络训练、模糊系统控制等多个领域得到了广泛的应用。
在MATLAB环境中实现粒子群优化算法,可以充分利用MATLAB强大的数值计算能力和高效的编程环境,实现算法的快速开发和优化。
MATLAB具有简单易用的语法和丰富的函数库,使得开发者能够快速地构建算法模型,进行仿真实验,并对算法性能进行分析和评估。
基于MATLAB的粒子群优化算法程序设计,旨在提供一个完整的算法实现框架,帮助读者理解PSO算法的基本原理和实现细节。
通过该程序设计,读者可以掌握如何在MATLAB中构建粒子群优化算法,如何设置算法参数,如何进行仿真实验,并如何分析和评估算法性能。
该程序设计还可以作为进一步研究和开发粒子群优化算法的基础,为实际应用提供有力的技术支持。
1. 粒子群优化算法(PSO)简介粒子群优化算法(Particle Swarm Optimization, PSO)是一种群体智能优化技术,起源于对鸟群觅食行为的社会心理学模拟。
该算法通过模拟鸟群中的信息共享机制,使得每个个体(粒子)能够在解空间中不断更新自己的位置和速度,从而寻找到问题的最优解。
PSO 算法以其简单、易实现和高效的特点,在函数优化、神经网络训练、模糊系统控制等多个领域得到了广泛应用。
在PSO算法中,每个粒子都代表着问题解空间中的一个候选解,它们根据自己的飞行经验以及群体中最优粒子的飞行经验来调整自己的飞行轨迹。
粒子的位置信息对应着问题的解,而粒子的速度则决定了其搜索解空间的方向和步长。
粒子群(pso)算法详解matlab代码(1)---- 一、粒子群算法的历史粒子群算法源于复杂适应系统(Complex Adaptive System,CAS)。
CAS理论于1994年正式提出,CAS中的成员称为主体。
比如研究鸟群系统,每个鸟在这个系统中就称为主体。
主体有适应性,它能够与环境及其他的主体进行交流,并且根据交流的过程“学习”或“积累经验”改变自身结构与行为。
整个系统的演变或进化包括:新层次的产生(小鸟的出生);分化和多样性的出现(鸟群中的鸟分成许多小的群);新的主题的出现(鸟寻找食物过程中,不断发现新的食物)。
所以CAS系统中的主体具有4个基本特点(这些特点是粒子群算法发展变化的依据):首先,主体是主动的、活动的。
主体与环境及其他主体是相互影响、相互作用的,这种影响是系统发展变化的主要动力。
环境的影响是宏观的,主体之间的影响是微观的,宏观与微观要有机结合。
最后,整个系统可能还要受一些随机因素的影响。
粒子群算法就是对一个CAS系统---鸟群社会系统的研究得出的。
粒子群算法( Particle Swarm Optimization, PSO)最早是由Eberhart和Kennedy于1995年提出,它的基本概念源于对鸟群觅食行为的研究。
设想这样一个场景:一群鸟在随机搜寻食物,在这个区域里只有一块食物,所有的鸟都不知道食物在哪里,但是它们知道当前的位置离食物还有多远。
那么找到食物的最优策略是什么呢?最简单有效的就是搜寻目前离食物最近的鸟的周围区域。
PSO算法就从这种生物种群行为特性中得到启发并用于求解优化问题。
在PSO 中,每个优化问题的潜在解都可以想象成d维搜索空间上的一个点,我们称之为“粒子”(Particle),所有的粒子都有一个被目标函数决定的适应值(Fitness Value ),每个粒子还有一个速度决定他们飞翔的方向和距离,然后粒子们就追随当前的最优粒子在解空间中搜索。
Reynolds对鸟群飞行的研究发现。
一、粒子群算法概述粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究。
该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。
粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。
PSO中,每个优化问题的解都是搜索空间中的一只鸟。
我们称之为“粒子”。
所有的粒子都有一个由被优化的函数决定的适应值(fitness value),每个粒子还有一个速度决定他们飞翔的方向和距离。
然后粒子们就追随当前的最优粒子在解空间中搜索。
PSO 初始化为一群随机粒子(随机解)。
然后通过迭代找到最优解。
在每一次迭代中,粒子通过跟踪两个”极值”来更新自己。
第一个就是粒子本身所找到的最优解,这个解叫做个体极值pBest。
另一个极值是整个种群目前找到的最优解,这个极值是全局极值gBest。
另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。
二、算法原理粒子群算法采用常数学习因子,及惯性权重,粒子根据如下的公式更新自己的速度和位置。
V ki=ωk V i−1i+c1r1(Q bi−Q k−1i)+c2r2(Q bg−Q k−1i)Q ki=Q k−1i+V ki三、算法步骤1、随机初始化种群中各微粒的位置和速度;2、评价个粒子的适应度,将各粒子的位置和适应度储存在各微粒的pbest(Q bi)中,将所有pbest中适应度最优的个体的位置和适应度存储在gbest(Q bg)中。
3、更新粒子的速度和位移。
V ki=ωk V i−1i+c1r1(Q bi−Q k−1i)+c2r2(Q bg−Q k−1i)Q ki=Q k−1i+V ki4、对每个微粒,与其前一个最优位置比较,如果较好,则将其作为当前的最优位置。
pso算法代码PSO算法简介粒子群优化(Particle Swarm Optimization,PSO)算法是一种基于群体智能的优化算法,它模拟了鸟群或鱼群等生物在搜索过程中的行为,通过不断地调整个体位置和速度来寻找最优解。
PSO算法具有收敛速度快、易于实现、适用范围广等特点,在多目标优化、非线性优化、组合优化等领域得到了广泛应用。
PSO算法流程1.初始化粒子群2.计算每个粒子的适应度值3.更新全局最优解和每个粒子的最优解4.更新每个粒子的速度和位置5.判断是否达到停止条件,如果没有则返回第二步PSO算法代码实现下面是一个简单的PSO算法代码实现,该代码实现了一个求解函数y=x^2在[-5,5]区间内的最小值问题:```import random# 初始化参数pop_size = 50 # 粒子数量max_iter = 100 # 迭代次数w = 0.6 # 惯性权重c1 = 1.5 # 自我认知学习因子c2 = 1.5 # 社会认知学习因子# 定义目标函数def fitness(x):return x ** 2# 初始化粒子群class Particle:def __init__(self):self.position = random.uniform(-5, 5) # 粒子位置self.velocity = random.uniform(-1, 1) # 粒子速度self.pbest_pos = self.position # 粒子最优位置self.pbest_val = fitness(self.position) # 粒子最优适应度值# 初始化全局最优解gbest_pos = random.uniform(-5, 5)gbest_val = fitness(gbest_pos)# 迭代寻优for i in range(max_iter):for j in range(pop_size):particle = Particle()# 更新粒子最优解和全局最优解if particle.pbest_val < gbest_val:gbest_pos = particle.pbest_posgbest_val = particle.pbest_val# 更新粒子速度和位置r1, r2 = random.uniform(0, 1), random.uniform(0, 1)particle.velocity = w * particle.velocity + c1 * r1 * (particle.pbest_pos - particle.position) + c2 * r2 * (gbest_pos - particle.position)particle.position += particle.velocityprint("The minimum value of y=x^2 in [-5,5] is:", gbest_val) print("The optimal solution is:", gbest_pos)```PSO算法参数调节PSO算法中的参数设置对算法的性能有很大影响,下面介绍一些常见的参数调节方法:1.惯性权重w:一般取值范围为[0,1],当w较小时,粒子的速度变化较小,容易陷入局部最优解;当w较大时,粒子的速度变化较大,容易跳出局部最优解。
用MATLAB 编写PSO 算法及实例
1.1 粒子群算法
PSO 从这种模型中得到启示并用于解决优化问题。
PSO 中,每个优化问题的潜在解都是搜索空间中的一只鸟,称之为粒子。
所有的粒子都有一个由被优化的函数决定的适值( fitness value) ,每个粒子还有一个速度决定它们飞翔的方向和距离。
然后粒子们就追随当前的最优粒子在解空间中搜索。
PSO 初始化为一群随机粒子(随机解),然后通过迭代找到最优解。
在每一次迭代中,粒子通过跟踪两个极值来更新自己;第一个就是粒子本身所找到的最优解,这个解称为个体极值;另一个极值是整个种群目前找到的最优解,这个极值是全局极值。
另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。
假设在一个维的目标搜索空间中,有个粒子组成一个群落,其中第个粒子表示为一个维的向量
,。
第个粒子的“飞行 ”速度也是一个维的向量,记为
,。
第个粒子迄今为止搜索到的最优位置称为个体极值,记为
,。
整个粒子群迄今为止搜索到的最优位置为全局极值,记为
在找到这两个最优值时,粒子根据如下的公式(1.1)和( 1.2)来更新自己的速度和位置:
(1.1) (1. 2)
其中:和为学习因子,也称加速常数(acceleration constant),和为[0,1]范围内的均匀随机数。
式(1.1)右边由三部分组成,第一部分为“惯性(inertia)”或“动量(momentum)”部分,反映了粒子的运动“习惯(habit)”,代表粒子有维持自己D N i D ),,,(21iD i i i x x x X N i ,,2,1 i D ),,21i iD i i v v v V ,( 3,2,1 i i ),,,(21iD i i best p p p p N i ,,2,1 ),,,(21gD g g best p p p g )
(2211id gd id id id id x p r c x p r c v w v id id id v x x 1c 2c 1r 2r
先前速度的趋势;第二部分为“认知(cognition)”部分,反映了粒子对自身历史经验的记忆(memory)或回忆(remembrance),代表粒子有向自身历史最佳位置逼近的趋势;第三部分为“社会(social)”部分,反映了粒子间协同合作与知识共享的群体历史经验。
二、算法设计
2.1 算法流程图
2.2 算法实现
算法的流程如下:
① 初始化粒子群,包括群体规模N ,每个粒子的位置i x 和速度i V
② 计算每个粒子的适应度值][i F it ;%它的适应度就是指目标函数的值。
一般来说,目标函数的选择由具体问题来决定,假如是背包问题,适应度即放入包中物体的总价格。
初始粒子位置和速度的位置一般随机产生。
但是在某些领域,如果已有其他的算法可以产生可行解的话,可以用这个可行解来初始化,这样更容易得到最优的解
③ 对每个粒子,用它的适应度值][i F it 和个体极值)(i p best 比较,如果
)(][i p i F best it ,则用][i Fit 替换掉)(i best p ;
④ 对每个粒子,用它的适应度值][i Fit 和全局极值best g 比较,如果
)(][i p i F best it 则用][i F it 替best g ;
⑤ 根据公式(1.1),(1.2)更新粒子的速度i v 和位置i x ;
⑥ 如果满足结束条件(误差足够好或到达最大循环次数)退出,否则返回②。
2.3 参数选择
本算法中主要的参数变量为w (惯性权值),1c ,2c (加速因子),N (种
群数),M (迭代次数),D (粒子维数)。
(1)种群规模
通常,种群太小则不能提供足够的采样点,以致算法性能很差;种群太大尽管可以增加优化信息,阻止早熟收敛的发生,但无疑会增加计算量,造成收敛时间太长,表现为收敛速度缓慢。
种群规模一般设为100~1000。
本文选择种群规模为100。
(2)最大迭代次数
迭代次数越多能保证解的收敛性,但是影响运算速度,本文选1000次。
(3)惯性权值
惯性权重表示在多大程度上保留原来的速度。
较大,全局收敛能力强,局部收敛能力弱;较小,局部收敛能力强,全局收敛能力弱。
本文选0.6。
(4)加速因子
加速常数
和分别用于控制粒子指向自身或邻域最佳位置的运动。
文献[20]建议,并通常取。
本文也取。
(5)粒子维数
本文中粒子维数取决于待优化函数的维数。
需要说明的是,本文的程序允许改变这些参数,因为本文编写的程序参照matlab 工具箱,留给用户解决这类问题一个接口函数,上述的各个参数正是接口函数的参数,因此允许改变。
另外对于和c 也可采用变参数法,即随迭代次数增加,利用经验公式使它们动态调整,本文采用固定值。
3.1求三维函数f=x(1).^2+x(2).^2+x(3).^2 的最小值
步骤:1.初始化x,v; 2.求出每个粒子的适应值;3.初始化pb,pg 个体最优和全局最优;4.根据式子更新x,v; 5.是否满足条件,满足跳出循环,否则重复2-4步
尝试编码:
w w w 2c 2c 0.421 c c 221 c c 221 c c w
(1)pso.m 文件
%此算法是PSO算法,汪汪的20161024号版本
function[xm,fv]=PSO(fitness,N,c1,c2,w,M,D)
%{
xm,fv算法最后得到的最优解时的x及最优解,fitness为适应度,即要优化的目标函数,N为种群数量,c1,c2为学习因子,w为惯性权重,M为迭代次数,D为粒子的维数
%}
format long;
%初始化种群
for i=1:N
for j=1:D
x(i,j)=randn; %随机初始化位置
v(i,j)=randn; %随机初始化速度
end
end
%先计算各个粒子的适应度pi,并初始化y-粒子个体极值,pg-全局极值
for i=1:N
p(i)=fitness(x(i,:)); %适应度问题:将x(i,:)改成x(i,j)是否可以,答不能 y(i,:)=x(i,:); %个体极值
end
pg=x(N,:);%初始化全局极值/最优
for i=1:N-1
if fitness(x(i,:))<fitness(pg)
pg=x(i,:);%替换并选出全局极值
end
end
%进入粒子群算法主要循环,更新v及x
for t=1:M
for i=1:N
v(i,:)=w*v(i,:)+c1*rand*(y(1,:)-x(1,:))+c2*rand*(pg-x(i,:)); x(i,:)=x(i,:)+v(i,:);
if fitness(x(i,:))<p(i)
p(i)=fitness(x(i,:));
y(i,:)=x(i,:);
end
if p(i)<fitness(pg)
pg=y(i,:);
end
end
pbest(t)=fitness(pg);%M次迭代后最优解
end
xm=pg';%为何要共轭转置?
fv=fitness(pg);
(2)目标函数fitness.m文件
function f=fitness(x)
f=x(1).^2+x(2).^2+x(3).^2 ;
end
需要说明的是,针对不同的函数优化,只需要改变目标函数就可以。
(3)在命令行输入或建立调用m文件
在命令行先后输入[xm,fv] = PSO(@fitness,100,2,2,0.6,1000,3),或建立包涵该语句的m文件,运行即可得到结果。
四、结果与分析
xm=1.0e-04 *
-0.285730140229565
0.676783696397148
-0.250529540096653
fv =
6.024429352056337e-09
fv是最优值,xm为最优值对应的自变量值。
3.2 高斯函数
[x y]=meshgrid(-100:100,-100:100); %生成xy坐标系且选取范围
sigma=50; %高斯函数中的sigma为50
img = (1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2));
%目标函数,高斯函数
2
2
2
b)
(x
ae (x)
f c
mesh(img); %三维画图hold on;。