注:本人参考http://www.cnblogs.com/tiandsp/category/348031.html来实现的

算法步骤:

1.首先确定粒子个数与迭代次数。

2.对每个粒子随机初始化位置与速度。

3.采用如下公式更新每个粒子的位置与速度。

Px=Px+Pv*t; %位置更新公式 

Pv=Pv+(c1*rand*(Gx-Px))+(c2*rand*(PBx-Px)); %速度更新公式

这里c1和c2是加速因子,和梯度下降算法那里的加速因子我感觉很类似。

Gx是粒子群中最佳粒子的位置,PBx为当前粒子最佳位置。

4.每次迭代,首先检查新粒子适应度是否高于原最优适应度,如果高于则对自己的位置和适应度进行更新。然后再判断此粒子适应度是否高于全局最优粒子,如果高于则更新全局最优粒子适应度和位置。

clc;
clear all;
close all;

%%
[x,y] = meshgrid(-100:100,-100:100);
sigma = 50;
img = (1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2));
mesh(img)
hold on
%% 初始化粒子群,定义结构体
%结构体中八个元素,分别是粒子坐标,粒子速度,粒子适应度,
% 粒子最佳适应度,粒子最佳坐标
n = 10; %初始例子的个数
pos = struct([]);
for i = 1:n
pos(i).x = -100 + 200*rand;
pos(i).y = -100 + 200*rand;
pos(i).vx = -1 + 2*rand;
pos(i).vy = -1 + 2*rand;
pos(i).fit = 0;
pos(i).bestfit = 0;
pos(i).bestx = pos(i).x;
pos(i).besty = pos(i).y;
end
pos_best = pos(1);
k = 100;
for i = 1:k
plot3(pos_best.x + 100,pos_best.y + 100,pos_best.fit,'k.','markersize',40);
for j = 1:n
[pos(j),pos_best] = update_pos(pos(j),pos_best);
end
drawnow
end

function [pos,pos_best] = update_pos(pos,pos_best)
pos.x = pos.x + pos.vx;
pos.y = pos.y + pos.vy;

pos.fit = compute_fit(pos);
%Pv=Pv+(c1*rand*(pos_best(群体).x-pos.x))+(c2*rand*(pos.bestx-pos.x))
%这里c1,c2为加速因子
%Gx为具有最佳适应度粒子的位置
%PBx为当前粒子的最佳位置
c1 = 1;
c2 = 1;
pos.vx = pos.vx + (c1*rand*(pos_best.x -pos.x)) + (c2*rand*(pos.bestx-pos.x));
pos.vy = pos.vy + (c1*rand*(pos_best.y -pos.y)) + (c2*rand*(pos.besty-pos.y));

if pos.fit > pos.bestfit
pos.bestfit = pos.fit;
pos.bestx = pos.x;
pos.besty = pos.y;
if pos_best.fit < pos.bestfit
pos_best.fit = pos.bestfit;
pos_best.x = pos.bestx ;
pos_best.y = pos.besty ;
end
end
end

function pos_fit = compute_fit(pos)
x = pos.x;
y = pos.y;
sigma = 50;
if x <-100 || x > 100 || y <-100 || y >100
pos_fit = 0;
else
pos_fit = (1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2));
end

最新文章

  1. 【leetcode】Generate Parentheses
  2. Comparison of SQL Server Compact, SQLite, SQL Server Express and LocalDB
  3. JSP Filter用法
  4. 让Apache Shiro保护你的应用
  5. java 读写JSON(一)
  6. C语言Makefile文件使用
  7. My97DatePicker源码的K方法
  8. 五指CMS开发日志(一)
  9. PHP计算2点经纬度之间的距离
  10. js实现求平均数功能
  11. Java代码检查工具
  12. 个人作业2 英语学习APP分析
  13. zzuli 1816: 矩形 排序思维
  14. mybatis数据源源码剖析(JNDI、POOLED、UNPOOLED)
  15. ios11苹果手机怎么投屏到电脑
  16. oracle数据库实例,数据库的理解
  17. GitHub C 和 C++ 开源库的清单(含示例代码)
  18. EMQ笔记
  19. 【Spark】Spark-Redis连接池
  20. sysbench的安装和做性能测试

热门文章

  1. 错误原因:因为desc是mysql里面的关键字
  2. Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合
  3. SpringBoot 实现微信推送模板
  4. PHP AES加密封装类
  5. HOOK API函数跳转详解
  6. 【MySQL篇】Navicat导入SQL文件报错终极解决方案
  7. 基于CefSharp开发(五)浏览器菜单样式
  8. 注册dll命令
  9. 查询Oracle日志文件的方法
  10. 重要消息:MoviePy v2.0.0.dev1预发布版本已经可以下载安装使用