混合粒子群算法:基于杂交的算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
混合粒子群算法:基于杂交的算法
1. 算法原理
借鉴遗传算法中杂交的概念,在每次迭代中,根据杂交率选取指定数量的粒子放入杂交
池内,池内的粒子随机两两杂交,产生同样数目的子代粒子( child),并用子代粒子代替亲代粒子(pare nt )。子代位置由父代位置进行交叉得到:
child (x) = p.pare nt|(x) (l-p).pare nt2(x)
或
child (x) =(1_ p).parent((x) p. parent2(x)
其中,P是o到1之间的随机数。
子代的速度由下式计算:
child(v)= pa訥(V)parant2(v)|parant i(v)
| parant/v) + parant2(v)|
或
child(v)=冋眦⑼ parant2(v)|parant2(v)
| para nt i(v) + para nt2(v)|
2. 算法步骤
基于自然选择的粒子群算法的基本步骤如下:
(1)随机初始化种群中各微粒的位置和速度;
(2)评价每个微粒的适应度,将当前各微子的位置和适应值存储在各微子的pbest中,
将所有的pbest中适应最优个体的位置和适应值存储在gbest中;
(3)更新每个微粒的速度和位置;
(4)对每个微粒,将其适应值与其经历过的最好位置作比较,如果较好,则将其作为当
前的最好位置;
(5)比较当前所有pbest和gbest的值,更新gbest ;
(6)根据杂交概率选取指定数量的粒子放入杂交池中,池中的粒子随机两两杂交产生同样数目
的子代粒子,子代的位置和速度计算公式如下:
child (x)二p.parent|(x) (1 _ p).parent2(x)
child (v^ parant1(v)叩呢⑼ |parant1(v)。保持pbest 和gbest不变;
| paran h(v) + para nt2(v)|
(7)若满足停止条件(通常为预设的运算精度或迭代次数) ,搜索停止,输出结果,否则
返回(3)继续搜索。
3.算法MATLAB实现
在MATLAB中编程实现的基于杂交的粒子群算法优化函数为:BreedPSO。
功能:用基于杂交的粒子群算法求解无约束优化问题。
调用格式:[xm, fv]二PSO( fitness, N,o),c2,w, Pc, Sp, M , D)
其中,fitness :待优化的目标函数;
N :粒子数目;
G:学习因子1 ;
C2:学习因子2;
W :惯性权重;
Pc :杂交概率;
Sp :杂交池的大小比例;
M :最大迭代次数;
D :自变量的个数;
xm:目标函数取最小值时的自变量值;
fv :目标函数的最小值。
基本粒子群算法的MATLAB代码如下:
fun ctio n [xm,fv]=BreedPSO(fitiness,N,c1,c2,w,Pc,Sp,M,D)
% fitn ess :待优化的目标函数;
% N:粒子数目;
% cl:学习因子1;
% c2:学习因子2;
% w:惯性权重;
% Pc杂交概率;
% Sp杂交池的大小比例;
% M:最大迭代次数;
% D:自变量的个数;
% xm:目标函数取最小值时的自变量值;
% fv:目标函数的最小值。
format long; for i=1:N
for j=1:D
x(i,j)=ra nd n;%随机初始化位置
v(i,j)=ra ndn; %随机初始化速度
end
end
for i=1:N p(i)=fitness(x(i,:));
y(i,:)=x(i,:);
end
pg=x(N,:); %pg 为全局最优
for i=1:(N-1)
if fitness(x(i,:)) pg=x(i,:); end end for t=1:M for i=1:N %速度、位移更新 v(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,:)) p(i)=fitness(x(i,:)); y(i,:)=x(i,:); end if p(i) pg=y(i,:); end r1=rand(); if r1 numPool=round(Sp*N); %杂交池大小 PoolX=x(1:numPool,:); %杂交池中粒子的位置PoolVX=v(1:numPool,:); % 杂交池中粒子的速度for i=1:numPool seed1=floor(rand()*(numPool-1))+1; seed2=floor(rand()*(numPool- 1))+1; pb=rand(); %子代位置计算childx1(i,:)=pb*PoolX(seed1,:)+(1- pb)*PoolX(seed2,:); %子代速度计算 childv1(i,:)=(PoolVX(seed1,:)+PoolVX(seed2,:))*norm(PoolVX(seed1,:))/norm(PoolVX(seed1,:) +PoolVX(seed2,:)); end x(1:numPool,:)=childx1; %子代的位置替换父代的位置 v(1:numPool,:)=childv1; %子代的速度替代父代的速度 end end end xm=pg'; fv=fitness(pg);