matlab练习程序(粒子群优化PSO)
算法没有和图像处理直接相关,不过对于图像分类中的模式识别相关算法,也许会用到这个优化算法。
算法步骤:
1.首先确定粒子个数与迭代次数。
2.对每个粒子随机初始化位置与速度。
3.采用如下公式更新每个粒子的位置与速度。
Px=Px+Pv*t; %位置更新公式
Pv=Pv+(c1*rand*(Gx-Px))+(c2*rand*(PBx-Px)); %速度更新公式
这里c1和c2是加速因子,和梯度下降算法那里的加速因子我感觉很类似。
Gx是粒子群中最佳粒子的位置,PBx为当前粒子最佳位置。
4.每次迭代,首先检查新粒子适应度是否高于原最优适应度,如果高于则对自己的位置和适应度进行更新。然后再判断此粒子适应度是否高于全局最优粒子,如果高于则更新全局最优粒子适应度和位置。
因为自己不是主要研究这方面算法的,所以还有一些疑问(自问自答?)。
1.算法需要目标函数,如果没有目标函数怎么办。也许就不用这个算法了,或者其他什么算法先求出了目标函数了。
2.既然给了目标函数,那么直接遍历所有值再max()应该就能求得最佳位置。而PSO算法是不是只是为了减少运算量,比如我这里200*200的矩阵,本来需要计算40000次函数,而PSO只计算了100次函数就得到近似最优解了。
难怪叫优化算法,反正我暂时只能这样理解了,其他细节代码注释的很清楚了。
下图展示了一个PSO的运行结果,目标函数是高斯函数,绿点代表最佳粒子的位置:

matlab代码如下:
main.m
clear all;close all;clc; [x y]=meshgrid(-:,-:);
sigma=;
img = (/(*pi*sigma^))*exp(-(x.^+y.^)/(*sigma^)); %目标函数,高斯函数
mesh(img);
hold on;
n=; %粒子群粒子个数 %初始化粒子群,定义结构体
%结构体中八个元素,分别是粒子坐标,粒子速度,粒子适应度,粒子最佳适应度,粒子最佳坐标
par=struct([]);
for i=:n
par(i).x=-+*rand(); %[- ]对x位置随机初始化
par(i).y=-+*rand(); %[- ]对y位置随机初始化
par(i).vx=-+*rand(); %[- ]对vx速度随机初始化
par(i).vy=-+*rand(); %[- ]对vy速度随机初始化
par(i).fit=; %粒子适应度为0初始化
par(i).bestfit=; %粒子最佳适应度为0初始化
par(i).bestx=par(i).x; %粒子x最佳位置初始化
par(i).besty=par(i).y; %粒子y最佳位置初始化
end
par_best=par(); %初始化粒子群中最佳粒子 for k=:
plot3(par_best.x+,par_best.y+,par_best.fit,'g*'); %画出最佳粒子的位置,+为相对偏移
for p=:n
[par(p) par_best]=update_par(par(p),par_best); %更新每个粒子信息
end
end
update_par.m
function [par par_best]=update_par(par,par_best)
%Px=Px+Pv*t,这里t=,Px为当前粒子的位置,Pv为当前粒子的速度
par.x=par.x+par.vx;
par.y=par.x+par.vy;
par.fit=compute_fit(par); %计算当前粒子适应度
%Pv=Pv+(c1*rand*(Gx-Px))+(c2*rand*(PBx-Px))
%这里c1,c2为加速因子
%Gx为具有最佳适应度粒子的位置
%PBx为当前粒子的最佳位置
c1=;
c2=;
par.vx=par.vx+c1*rand()*(par_best.x-par.x)+c2*rand()*(par.bestx-par.x);
par.vy=par.vy+c1*rand()*(par_best.y-par.y)+c2*rand()*(par.besty-par.y);
if par.fit>par.bestfit %如果当前粒子适应度要好于当前粒子最佳适应度
par.bestfit=par.fit; %则更新当前粒子最佳适应度
par.bestx=par.x; %更新当前粒子最佳位置
par.besty=par.y;
if par.bestfit>par_best.fit %如果当前粒子最佳适应度好于最佳粒子适应度
par_best.fit=par.bestfit; %则更新最佳粒子适应度
par_best.x=par.x; %更新最佳粒子位置
par_best.y=par.y;
end
end
end
compute_fit.m
function re=compute_fit(par)
x=par.x;
y=par.y;
sigma=;
if x<- || x> || y<- || y>
re=; %超出范围适应度为0
else %否则适应度按目标函数求解
re= (/(*pi*sigma^))*exp(-(x.^+y.^)/(*sigma^));
end
end
matlab练习程序(粒子群优化PSO)的更多相关文章
- MATLAB粒子群优化算法(PSO)
MATLAB粒子群优化算法(PSO) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.介绍 粒子群优化算法(Particle Swarm Optim ...
- 粒子群优化算法(PSO)之基于离散化的特征选择(FS)(一)
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 作者:Geppetto 在机器学习中,离散化(Discretiza ...
- MOPSO 多目标粒子群优化算法
近年来,基于启发式的多目标优化技术得到了很大的发展,研究表明该技术比经典方法更实用和高效.有代表性的多目标优化算法主要有NSGA.NSGA-II.SPEA.SPEA2.PAES和PESA等.粒子群优化 ...
- 粒子群优化算法PSO及matlab实现
算法学习自:MATLAB与机器学习教学视频 1.粒子群优化算法概述 粒子群优化(PSO, particle swarm optimization)算法是计算智能领域,除了蚁群算法,鱼群算法之外的一种群 ...
- 计算智能(CI)之粒子群优化算法(PSO)(一)
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 计算智能(Computational Intelligence , ...
- 粒子群优化算法对BP神经网络优化 Matlab实现
1.粒子群优化算法 粒子群算法(particle swarm optimization,PSO)由Kennedy和Eberhart在1995年提出,该算法模拟鸟集群飞行觅食的行为,鸟之间通过集体的协作 ...
- 数值计算:粒子群优化算法(PSO)
PSO 最近需要用上一点最优化相关的理论,特地去查了些PSO算法相关资料,在此记录下学习笔记,附上程序代码.基础知识参考知乎大佬文章,写得很棒! 传送门 背景 起源:1995年,受到鸟群觅食行为的规律 ...
- [matlab] 6.粒子群优化算法
粒子群优化(PSO, particle swarm optimization)算法是计算智能领域,除了蚁群算法,鱼群算法之外的一种群体智能的优化算法,该算法最早由Kennedy和Eberhart在19 ...
- ARIMA模型--粒子群优化算法(PSO)和遗传算法(GA)
ARIMA模型(完整的Word文件可以去我的博客里面下载) ARIMA模型(英语:AutoregressiveIntegratedMovingAverage model),差分整合移动平均自回归模型, ...
随机推荐
- 黑马MySQL数据库学习day01 MySQL8和MySQL5.5暴力破解密码
- i++操作非原子的验证代码
package incre; public class Incre { public static void main(String[] args) { class Count implements ...
- 《Qt 学习之路 2》目录
<Qt 学习之路 2>目录 <Qt 学习之路 2>目录 豆子 2012年8月23日 Qt 学习之路 2 177条评论 <Qt 学习之路 2>目录 序 Qt ...
- 《Professional JavaScript for Web Developers》day03
<Professional JavaScript for Web Developers>day03 1.1ECMAScript语法 1.1.1 区分大小写 1.1.2 标识符 按照惯例,E ...
- innodb的读写参数优化
(1) 读取参数,global buffer pool以及 local buffer Innodb_buffer_pool_size,理论上越大越好,建议服务器50%~80%,实际为数据大小80 ...
- Python十大应用领域与就业方向
参考链接:https://baijiahao.baidu.com/s?id=1604847283884842928&wfr=spider&for=pc 正文: 近些年,编程语言Pyth ...
- POJ3074 Sudoku 剪枝深(神?)搜
emm...挺秀的...挺神的? 每行,每列,每宫用一个二进制数表示选或没选的状态,刚开始设没选为1,然后更改状态的时候异或一下就好了: 这样可以通过lowbit取出每一个没有选过的数:(妙啊? 关于 ...
- 牛客Professional Manager(并查集)
t’s universally acknowledged that there’re innumerable trees in the campus of HUST. Thus a professi ...
- iOS如何实时查看App运行日志
Linux下管理挂载IOS设备——libimobiledevicehttps://www.jianshu.com/p/6423610d3293https://blog.csdn.net/fengzei ...
- 一个基于QT简单登录对话框
1. 登录对话框式样 2. QLoginDialog.h #ifndef DIALOG_H #define DIALOG_H #include <QtGui/QDialog> #inclu ...