最近要写篇与粒子群算法有关的文章,因此不得不实现粒子群算法的局部版本 。粒子群算法局部版本的实现思想已经在粒子群算法(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);