(完整word版)用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中较多的图像处理函数支持对灰度图像进行处理,故对图像进行灰度转化十分必要。
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;对于一些有约束条件和没有约束条件的优化问题,具体什么情况下用什么算法还是要长期的经验积累。
位置pid算法matlab

位置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`函数创建了位置反馈系统。
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背包问题求解Matlab代码

gbest=xbest(g,:);%当存在粒子的最佳适应度fxbest(g)大于种群的最佳适应度时,用其替代原来种群的最佳适应度,并记下此解
end
for i=1:xSize
if x(i,:)==gbest
x(i,:)=round(rand(1,Dim));%为防止算法陷入局部最优,若某个粒子的位置等于种群最佳位置,将对该粒子的位置重新初始化赋值
while iter<MaxIt
iter=iter+1;
fx=sum((C.*x)');%计算粒子群的适应度,即背包内物品的价值
sx=sum((A.*x)');%限制函数,背包内物品的体积
for i=1:xSize
if sx(i)>269
fx(i)=0;%当被包内物品的体积超 Nhomakorabea限制时,将期适应度设置为1
if x(i,j)<0.5
x(i,j)=0;
else x(i,j)=1;
end
end
end%由于粒子的位置只有(0,1)两种状态,此处以0.5为分界点对函数值进行离散化
end
%
%
fgbest
sgbest=sum((a.*gbest)')
gbest
end
end
for i=1:xSize
if fxbest(i)<fx(i)
fxbest(i)=fx(i);
xbest(i,:)=x(i,:);%当粒子的适应度fx(i)大于其最佳适应度时fxbest(i),用其替代原来粒子的最佳适应度,并记下此解
end
end
if fgbest<max(fxbest)
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;。