用MATLAB编写PSO算法及实例【精品文档】(完整版)
(完整word版)matlab实现数字图像处理Photoshop小程序

实验报告课程名称数字图像处理分院班组姓名学号日期年月日图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中较多的图像处理函数支持对灰度图像进行处理,故对图像进行灰度转化十分必要。
粒子群算法求解约束优化问题matlab

粒子群算法求解约束优化问题matlab粒子群算法(Particle Swarm Optimization,PSO)是一种常用的启发式优化算法,适用于求解约束优化问题。
在MATLAB 中,可以使用现成的工具箱或自己编写代码来实现PSO算法。
PSO算法的核心思想是模拟鸟群觅食的行为,每个粒子代表一个候选解,并通过不断更新自身位置和速度来搜索最优解。
下面是一个基本的PSO算法的MATLAB代码框架:```matlabfunction [bestSolution, bestFitness] = PSO()% 初始化粒子群numParticles = 50;numDimensions = 10;particles = rand(numParticles, numDimensions);velocities = zeros(numParticles, numDimensions);personalBests = particles;personalBestFitnesses = zeros(numParticles, 1);% 设置参数w = 0.7; % 惯性权重c1 = 1.49; % 自我学习因子c2 = 1.49; % 社会学习因子numIterations = 100;% 开始迭代for iter = 1:numIterations% 更新粒子的速度和位置for i = 1:numParticlesr1 = rand(1, numDimensions);r2 = rand(1, numDimensions);velocities(i,:) = w*velocities(i,:) +c1*r1.*(personalBests(i,:) - particles(i,:)) + c2*r2.*(globalBest - particles(i,:));particles(i,:) = particles(i,:) + velocities(i,:);end% 更新个体最优解和适应度for i = 1:numParticlesfitness = evaluateFitness(particles(i,:));if fitness < personalBestFitnesses(i)personalBests(i,:) = particles(i,:);personalBestFitnesses(i) = fitness;endend% 更新全局最优解和适应度[bestFitness, bestIndex] = min(personalBestFitnesses);bestSolution = personalBests(bestIndex,:);% 输出当前迭代的结果fprintf('Iteration %d: Best fitness = %f\n', iter, bestFitness); endend```以上多个代码块来自上面的核心框架。
PSO(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;对于一些有约束条件和没有约束条件的优化问题,具体什么情况下用什么算法还是要长期的经验积累。
Matlab粒子群算法(PSO)进行空间-变压器局部放电定位

%% 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);结果:。
(完整word版)用MATLAB编写PSO算法及实例

用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

粒子群算法优化电路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优化的BP神经网络(Matlab版)

PSO优化的BP神经⽹络(Matlab版)前⾔:最近接触到⼀些神经⽹络的东西,看到很多⼈使⽤PSO(粒⼦群优化算法)优化BP神经⽹络中的权值和偏置,经过⼀段时间的研究,写了⼀些代码,能够跑通,嫌弃速度慢的可以改⼀下训练次数或者适应度函数。
在我的理解⾥,PSO优化BP的初始权值w和偏置b,有点像数据迁徙,等于⽤粒⼦去尝试作为⽹络的参数,然后训练⽹络的阈值,所以总是会看到PSO优化了权值和阈值的说法,(⼀开始我是没有想通为什么能够优化阈值的),下⾯是我的代码实现过程,关于BP和PSO的原理就不⼀⼀赘述了,⽹上有很多⼤佬解释的很详细了……⾸先是利⽤BP作为适应度函数function [error] = BP_fit(gbest,input_num,hidden_num,output_num,net,inputn,outputn)%BP_fit 此函数为PSO的适应度函数% gbest:最优粒⼦% input_num:输⼊节点数⽬;% output_num:输出层节点数⽬;% hidden_num:隐含层节点数⽬;% net:⽹络;% inputn:⽹络训练输⼊数据;% outputn:⽹络训练输出数据;% error : ⽹络输出误差,即PSO适应度函数值w1 = gbest(1:input_num * hidden_num);B1 = gbest(input_num * hidden_num + 1:input_num * hidden_num + hidden_num);w2 = gbest(input_num * hidden_num + hidden_num + 1:input_num * hidden_num...+ hidden_num + hidden_num * output_num);B2 = gbest(input_num * hidden_num+ hidden_num + hidden_num * output_num + 1:...input_num * hidden_num + hidden_num + hidden_num * output_num + output_num);net.iw{1,1} = reshape(w1,hidden_num,input_num);net.lw{2,1} = reshape(w2,output_num,hidden_num);net.b{1} = reshape(B1,hidden_num,1);net.b{2} = B2';%建⽴BP⽹络net.trainParam.epochs = 200;net.trainParam.lr = 0.05;net.trainParam.goal = 0.000001;net.trainParam.show = 100;net.trainParam.showWindow = 0;net = train(net,inputn,outputn);ty = sim(net,inputn);error = sum(sum(abs((ty - outputn))));end 然后是PSO部分:%%基于多域PSO_RBF的6R机械臂逆运动学求解的研究clear;close;clc;%定义BP参数:% input_num:输⼊层节点数;% output_num:输出层节点数;% hidden_num:隐含层节点数;% inputn:⽹络输⼊;% outputn:⽹络输出;%定义PSO参数:% max_iters:算法最⼤迭代次数% w:粒⼦更新权值% c1,c2:为粒⼦群更新学习率% m:粒⼦长度,为BP中初始W、b的长度总和% n:粒⼦群规模% gbest:到达最优位置的粒⼦format longinput_num = 3;output_num = 3;hidden_num = 25;max_iters =10;m = 500; %种群规模n = input_num * hidden_num + hidden_num + hidden_num * output_num + output_num; %个体长度w = 0.1;c1 = 2;c2 = 2;%加载⽹络输⼊(空间任意点)和输出(对应关节⾓的值)load('pfile_i2.mat')load('pfile_o2.mat')% inputs_1 = angle_2';inputs_1 = inputs_2';outputs_1 = outputs_2';train_x = inputs_1(:,1:490);% train_y = outputs_1(4:5,1:490);train_y = outputs_1(1:3,1:490);test_x = inputs_1(:,491:500);test_y = outputs_1(1:3,491:500);% test_y = outputs_1(4:5,491:500);[inputn,inputps] = mapminmax(train_x);[outputn,outputps] = mapminmax(train_y);net = newff(inputn,outputn,25);%设置粒⼦的最⼩位置与最⼤位置% w1阈值设定for i = 1:input_num * hidden_numMinX(i) = -0.01*ones(1);MaxX(i) = 3.8*ones(1);end% B1阈值设定for i = input_num * hidden_num + 1:input_num * hidden_num + hidden_numMinX(i) = 1*ones(1);MaxX(i) = 8*ones(1);end% w2阈值设定for i = input_num * hidden_num + hidden_num + 1:input_num * hidden_num + hidden_num + hidden_num * output_numMinX(i) = -0.01*ones(1);MaxX(i) = 3.8*ones(1);end% B2阈值设定for i = input_num * hidden_num+ hidden_num + hidden_num * output_num + 1:input_num * hidden_num + hidden_num + hidden_num * output_num + output_num MinX(i) = 1*ones(1);MaxX(i) = 8*ones(1);end%%初始化位置参数%产⽣初始粒⼦位置pop = rands(m,n);%初始化速度和适应度函数值V = 0.15 * rands(m,n);BsJ = 0;%对初始粒⼦进⾏限制处理,将粒⼦筛选到⾃定义范围内for i = 1:mfor j = 1:input_num * hidden_numif pop(i,j) < MinX(j)pop(i,j) = MinX(j);endif pop(i,j) > MaxX(j)pop(i,j) = MaxX(j);endendfor j = input_num * hidden_num + 1:input_num * hidden_num + hidden_numif pop(i,j) < MinX(j)pop(i,j) = MinX(j);endif pop(i,j) > MaxX(j)pop(i,j) = MaxX(j);endendfor j = input_num * hidden_num + hidden_num + 1:input_num * hidden_num + hidden_num + hidden_num * output_numif pop(i,j) < MinX(j)pop(i,j) = MinX(j);endif pop(i,j) > MaxX(j)pop(i,j) = MaxX(j);endendfor j = input_num * hidden_num+ hidden_num + hidden_num * output_num + 1:input_num * hidden_num + hidden_num + hidden_num * output_num + output_num if pop(i,j) < MinX(j)pop(i,j) = MinX(j);endif pop(i,j) > MaxX(j)pop(i,j) = MaxX(j);endendend%评估初始粒⼦for s = 1:mindivi = pop(s,:);fitness = BP_fit(indivi,input_num,hidden_num,output_num,net,inputn,outputn);BsJ = fitness; %调⽤适应度函数,更新每个粒⼦当前位置Error(s,:) = BsJ; %储存每个粒⼦的位置,即BP的最终误差end[OderEr,IndexEr] = sort(Error);%将Error数组按升序排列Errorleast = OderEr(1); %记录全局最⼩值for i = 1:m %记录到达当前全局最优位置的粒⼦if Error(i) == Errorleastgbest = pop(i,:);break;endendibest = pop; %当前粒⼦群中最优的个体,因为是初始粒⼦,所以最优个体还是个体本⾝for kg = 1:max_iters %迭代次数for s = 1:m%个体有52%的可能性变异for j = 1:n %粒⼦长度for i = 1:m %种群规模,变异是针对某个粒⼦的某⼀个值的变异if rand(1)<0.04pop(i,j) = rands(1);endendend%r1,r2为粒⼦群算法参数r1 = rand(1);r2 = rand(1);%个体位置和速度更新V(s,:) = w * V(s,:) + c1 * r1 * (ibest(s,:)-pop(s,:)) + c2 * r2 * (gbest(1,:)-pop(s,:));pop(s,:) = pop(s,:) + 0.3 * V(s,:);%对更新的位置进⾏判断,超过设定的范围就处理下。
PSO粒子群算法Matlab源码

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,不暂停,否则暂停。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用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;。