粒子群算法(7)------粒子群算法局部版本的实现

最近要写篇与粒子群算法有关的文章,因此不得不实现粒子群算法的局部版本 。粒子群算法局部版本的实现思想已经在粒子群算法(3)----标准的粒子群算法( 局部版本)中已经讲述。主要分为3个函数。第一个函数为粒子群初始化函数 LocalInitSwarm(SwarmSize......AdaptFunc)其主要作用是初始化粒子群的粒子 ,并设定粒子的速度、位置在一定的范围内。本函数所采用的数据结构如下所示 :

表ParSwarm记录的是粒子的位置、速度与当前的适应度值,我们用W来表示位 置,用V来代表速度,用F来代表当前的适应度值。在这里我们假设粒子个数为N, 每个粒子的维数为D。

W1,1 W1,2 ... W1,D V1,1 V1,2 ... V1,D-1 V1,D F1 第1个粒子
W2,1 W2,2 ... W2,D V2,1 V2,2 ... V2,D-1 V2,D F2 第2个粒子
... ... ... ... ... ... ... ... ... ... .......
WN-1,1 WN-1,2 ... WN-1,D-1 VN-1,1 VN-1,2 ... VN-1,D-1 VN-1,D FN-1 第N-1个粒子
WN,1 WN,2 ... WN,D VN,1 VN,2 ... VN,D-1 VN,D FN 第N个粒子

表OptSwarm不但要记录自身历史最优解,还需要记录每个粒子邻域( 采用环形邻域)的最优解,以及全部粒子搜索到的全局最优解。因此应该有2*N+1 行,前SwarmSize行记录粒子自己历史最优解,后SwarmSize行记录邻域最优解。

用Wg代表全局最优解,W.,1代表每个粒子的历史最优解。粒子群初始化阶段表 OptSwarm的前N行与表ParSwarm中的相同,而Wg的值为表ParSwarm中适应度值的最 大值对应的行。

W1,1 Wj,2 ... Wj,D-1 Wj,D 第1个粒子的历史最优解
W2,1 Wk,2 ... Wk,D-1 Wk,D 第2个粒子的历史最优解
... ... ... ... ... ...
W(N-1),1 Wl,2 ... Wl,D-1 Wl,D 第N-1个粒子的历史最优解
W(N),1 Wm,2 ... Wm,D-1 Wm,D
第N个粒子的历史最优解

Wl,1 ... ... ... Wl,D 第一个粒子的邻域最优解
Wl,2 ... ... ... Wl,D 第二个粒子的邻域最优解
... ... ... ... ..... ....
Wl,N ... ... ... ... 第N个粒子的邻域最优解
Wg,1 Wg,2 ... Wg,D-1 Wg,D 全局粒子的历史最优解

根据这样的思想MATLAB代码如下:

function
[ParSwarm,OptSwarm]=LocalInitSwarm
(SwarmSize,ParticleSize,ParticleScope,AdaptFunc)
%功能描述:局部版本的粒子群算法,初始化粒子群,限定粒子群的位置以及速度
在指定的范围内
%[ParSwarm,OptSwarm,BadSwarm]=LocalInitSwarm
(SwarmSize,ParticleSize,ParticleScope,AdaptFunc)
%
%输入参数:SwarmSize:种群大小的个数
%输入参数:ParticleSize:一个粒子的维数
%输入参数:ParticleScope:一个粒子在运算中各维的范围;
% ParticleScope格式:
% 3维粒子的ParticleScope格式:
% [x1Min,x1Max
% x2Min,x2Max
% x3Min,x3Max]
%
%输入参数:AdaptFunc:适应度函数
%
%输出:ParSwarm初始化的粒子群
%输出:OptSwarm粒子群当前最优解与每个粒子邻域的最优解,第一次初始化,邻
域的区域为0,即为粒子本身
%
%用法 [ParSwarm,OptSwarm,BadSwarm]=LocalInitSwarm
(SwarmSize,ParticleSize,ParticleScope,AdaptFunc);
%
%异常:首先保证该文件在Matlab的搜索路径中,然后查看相关的提示信息。
%
%编制人:XXX
%编制时间:2010.5.6
%参考文献:无
%
%容错控制
if nargin~=4
error('输入的参数个数错误。')
end
if nargout<2
error('输出的参数的个数太少,不能保证以后的运行。');
end
[row,colum]=size(ParticleSize);
if row>1||colum>1
error('输入的粒子的维数错误,是一个1行1列的数据。');
end
[row,colum]=size(ParticleScope);
if row~=ParticleSize||colum~=2
error('输入的粒子的维数范围错误。');
end
%初始化粒子群矩阵
%初始化粒子群矩阵,全部设为[0-1]随机数
%rand('state',0);
ParSwarm=rand(SwarmSize,2*ParticleSize+1);
%对粒子群中位置,速度的范围进行调节
for k=1:ParticleSize
ParSwarm(:,k)=ParSwarm(:,k)*(ParticleScope(k,2)-ParticleScope
(k,1))+ParticleScope(k,1);
%调节速度,使速度与位置的范围一致
ParSwarm(:,ParticleSize+k)=ParSwarm(:,ParticleSize+k)*
(ParticleScope(k,2)-ParticleScope(k,1))+ParticleScope(k,1);
end
%对每一个粒子计算其适应度函数的值
for k=1:SwarmSize
ParSwarm(k,2*ParticleSize+1)=AdaptFunc(ParSwarm(k,1:ParticleSize));
end
%初始化粒子群最优解矩阵,共SwarmSize*2行,其中前SwarmSize行记录粒子自己
历史最优解,后SwarmSize行记录邻域最优解
OptSwarm=zeros(SwarmSize*2+1,ParticleSize);
%粒子群最优解矩阵全部设为零
OptSwarm(1:SwarmSize,:)=ParSwarm(1:SwarmSize,1:ParticleSize);
%计算粒子邻域为1的最优解
linyu=1;
for row=1:SwarmSize
if row-linyu>0&&row+linyu<=SwarmSize
tempM =[ParSwarm(row-linyu:row-1,:);ParSwarm
(row+1:row+linyu,:)];
[maxValue,linyurow]=max(tempM(:,2*ParticleSize+1));
OptSwarm(SwarmSize+row,:)=tempM(linyurow,1:ParticleSize);
else
if row-linyu<=0
%该行上面的部分突出了边界,下面绝对不会突破边界
if row==1
tempM=[ParSwarm(SwarmSize+row-
linyu:end,:);ParSwarm(row+1:row+linyu,:)];
[maxValue,linyurow]=max(tempM(:,2*ParticleSize+1));
OptSwarm(SwarmSize+row,:)=tempM
(linyurow,1:ParticleSize);
else
tempM=[ParSwarm(1:row-1,:);ParSwarm(SwarmSize+row-
linyu:end,:);ParSwarm(row+1:row+linyu,:)];
[maxValue,linyurow]=max(tempM(:,2*ParticleSize+1));
OptSwarm(SwarmSize+row,:)=tempM
(linyurow,1:ParticleSize);
end
else
%该行下面的部分突出了边界,上面绝对不会突破边界
if row==SwarmSize
tempM=[ParSwarm(SwarmSize-linyu:row-1,:);ParSwarm
(1:linyu,:)];
[maxValue,linyurow]=max(tempM(:,2*ParticleSize+1));
OptSwarm(SwarmSize+row,:)=tempM
(linyurow,1:ParticleSize);
else
tempM=[ParSwarm(row-linyu:row-1,:);ParSwarm
(row+1:end,:);ParSwarm(1:linyu-(SwarmSize-row),:)];
[maxValue,linyurow]=max(tempM(:,2*ParticleSize+1));
OptSwarm(SwarmSize+row,:)=tempM
(linyurow,1:ParticleSize);
end
end
end
end%for
[maxValue,row]=max(ParSwarm(:,2*ParticleSize+1));
%寻找适应度函数值最大的解在矩阵中的位置(行数)
OptSwarm(SwarmSize*2+1,:)=ParSwarm(row,1:ParticleSize);

时间: 2024-09-23 14:08:04

粒子群算法(7)------粒子群算法局部版本的实现的相关文章

粒子群算法(3)----标准的粒子群算法(局部版本)

在全局版的标准粒子群算法中,每个粒子的速度的更新是根据两个因素来变化的,这两个因素是:1. 粒子自己历史最优值pi.2. 粒子群体的全局最优值pg.如果改变粒子速度更新公式,让每个粒子的速度的更新根据以下两个因素更新,A. 粒子自己历史最优值pi.B. 粒子邻域内粒子的最优值pnk.其余保持跟全局版的标准粒子群算法一样,这个算法就变为局部版的粒子群算法. 一般一个粒子i 的邻域随着迭代次数的增加而逐渐增加,开始第一次迭代,它的邻域为0,随着迭代次数邻域线性变大,最后邻域扩展到整个粒子群,这时就变

粒子群算法(4)----粒子群算法分类

粒子群算法主要分为4个大的分支: (1)标准粒子群算法的变形 在这个分支中,主要是对标准粒子群算法的惯性因子.收敛因子(约束因子)."认知"部分的c1,"社会"部分的c2进行变化与调节,希望获得好的效果. 惯性因子的原始版本是保持不变的,后来有人提出随着算法迭代的进行,惯性因子需要逐渐减小的思想.算法开始阶段,大的惯性因子可以是算法不容易陷入局部最优,到算法的后期,小的惯性因子可以使收敛速度加快,使收敛更加平稳,不至于出现振荡现象.经过本人测试,动态的减小惯性因子w

粒子群算法(1)----粒子群算法简介

一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,CAS中的成员称为主体.比如研究鸟群系统,每个鸟在这个系统中就称为主体.主体有适应性,它能够与环境及其他的主体进行交流,并且根据交流的过程"学习"或"积累经验"改变自身结构与行为.整个系统的演变或进化包括:新层次的产生(小鸟的出生):分化和多样性的出现(鸟群中的鸟分成许多小的群):新的主题的出现(鸟寻找食物过程中,不断发现新的食

请教各位高手,在。NET环境下用C#能解决蚁群算法,粒子群算法等问题吗?

问题描述 请教各位高手,在.NET环境下用C#能解决蚁群算法,粒子群算法等问题吗?虽然知道.NET环境的优势并不在解决这些算法上,但只是现在这个环境用得比较熟,现在想要用这几种算法解决点问题,大家看在这个环境下能应用好呢,还是换作VC之类的比较好呀?因为看了一点别人写的算法,用C#编的很少呀~ 解决方案 解决方案二:应该是可以的解决方案三:有了算法,就选择自己比较熟悉的工具去做吧那样自己也有信心点,呵呵解决方案四:有了算法,就选择自己比较熟悉的工具去做吧那样自己也有信心点,呵呵解决方案五:有了算

《算法帝国》:被算法和算法交易改变的未来

当我们用崭新的视角去观察与思考,世界就会变成另外的模样.这是我们筹备举办"改变未来的算法与算法交易"研讨会的初衷. 美国雄霸全球依赖华尔街与硅谷等强大支柱,而近年来,算法对华尔街的渗透与控制体现出颠覆未来产业生态的力量.图灵公司出版的<算法帝国>一书中介绍,2000年,华尔街通过计算机程序交易的比率不足美国股市交易量的10%:2008年上半年,自动化电子交易占了全美股市交易量的60%:现在,华尔街70%以上的交易依靠所谓的黑盒子或者算法交易(闪电交易)运行.银行家和股票经纪

高效算法的常用技术(算法导论)

对于高效算法, 有些比较简单的技术, 如分治法, 随机化, 和递归求解技术. 这边介绍些更为复杂的技术, 动态规划, 贪心算法 当对于复杂问题设计算法时, 首先会想到使用分治法 来解决, 分而治之, 一个很有哲理性的思路, 再复杂的问题都可以不断分解到你可以轻松解决的粒度, 把所有简单问题都解决完后, 组合在一起就得到了复杂问题的解, 可以看出其中典型的递归求解的思路. 使用分治法的要求, 各个子问题是独立 的 (即不包含公共的子子问题,子问题不重叠 ). 如果子问题重叠, 用分治法就比较低效,

算法起步之贪心算法

原文:算法起步之贪心算法        我们前面介绍的动态规划算法是求解最优化问题的一种通用方法,但是对于很多的最优化问题是用动态规划有点小题大做了,我们可以使用贪心算法,贪心算法相比动态规划更简单,也更高效.它总是做出局部最优选择,希望这样可以得到全局的最有选择.所以这种方法不能保证得到最优解,但是很多问题却都可以用这种方法.我们先看一个活动选择的例子.        假设我们有n个活动,只有一个教室,求在这个教室中一天最多可以举办多少活动(同一时间只能举办一个活动).下面给出的是活动的开始时

博客群建与网站群建的轮链模式有什么区别

利用给博客和网站更新文章的时间里,决定给博客写点东西,有感而发:因为平时QQ交流中有朋友对博客群建和网站群建的模式好像有些混淆,认为群建博客(这里说的是下图中所示的免费博客),就是为了给网站做外链,做100个或者几百个,全部链向要优化的网站,这样的想法是很正确的,但博客群建也要遵循轮链的规则,否则博客同样会被搜索引擎丢弃,对待博客群建,做法与网站群建的策略相似,同样是要分层次来进行,这样可以有效提高单个博客权重以及整体的权重,有朋友就不理解分层次,分层次就是根据金字塔链轮模式来定的,有兴趣的朋友

JVM内存管理:GC算法精解(复制算法与标记/整理算法)

本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算法 我们首先一起来看一下复制算法的做法,复制算法将内存划分为两个区间,在任意时间点,所有动态分配的对象都只能分配在其中一个区间(称为活动区间),而另外一个区间(称为空闲区间)则是空闲的. 当有效内存空间耗尽时,JVM将暂停程序运行,开启复制算法GC线程.接下来GC线程会将活动区间内的存活对象,全部复