本文共 1991 字,大约阅读时间需要 6 分钟。
算法示例:
粒子一开始调整的幅度大,越往后调整的幅度越小,来提高精度。 以下代码参考别人博客,链接如下(侵删):手动模拟算法matlab代码:
function[xm,fv] = PSO(fitness,N,c1,c2,w,M,D)% c1,c2:学习因子% w:惯性权重% M:最大迭代次数% D:搜索空间维数% N:初始化群体个体数目% 初始化种群的个体(可以在这里限定位置和速度的范围)format long;for i = 1:N for j=1:D x(i,j) = randn; % 随机初始化位置 v(i,j) = randn; % 随机初始化速度 endend% 先计算各个粒子的适应度,并初始化pi和pgfor 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,:))
求解下列函数的最小值:
function F=fitness(x)F = 0;for i = 1:30 F = F+x(i)^2+x(i)-6;end
输入:
x = zeros(1,30);[xm1,fv1] = PSO(@fitness,50,1.5,2.5,0.5,100,30)
自适应权重算法:
function[xm,fv] = PSO_adaptation(fitness,N,c1,c2,wmax,wmin,M,D)% c1,c2:学习因子% wmax:惯性权重最大值% wmin:惯性权重最小值% M:最大迭代次数% D:搜索空间维数% N:初始化群体个体数目% 初始化种群的个体(可以在这里限定位置和速度的范围)for i = 1:N for j=1:D x(i,j) = randn; % 随机初始化位置 v(i,j) = randn; % 随即初始化速度 endend%先计算各个粒子的适应度,并初始化个体最优解pi和整体最优解pg %%初始化pi %for i = 1:N p(i) = fitness(x(i,:)) ; y(i,:) = x(i,:) ;end%初始化pg %pg = x(N,:) ;%得到初始的全局最优pg %for i = 1:(N-1) if fitness(x(i,:)) < fitness(pg) pg = x(i,:) ; endend %主循环函数,进行迭代,直到达到精度的要求 %for t = 1:M for j = 1:N fv(j) = fitness(x(j,:)) ; end fvag = sum(fv)/N ; fmin = min(fv); for i = 1:N %更新函数,其中v是速度向量,x为位置,i为迭代特征 if fv(i) <= fvag w = wmin+(fv(i)-fmin)*(wmax-wmin)/(fvag-fmin) ; %依据早熟收敛程度和适应度值进行调整 else w = wmax ; end 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) p(i) = fitness(x(i,:)) ; y(i,:) = x(i,:) ; end if p(i) < fitness(pg) pg = y(i,:) ; end end Pbest(t) = fitness(pg) ;end %给出最后的计算结果 %xm = pg' ;fv = fitness(pg) ; plot(Pbest)xlabel('进化次数') ;ylabel('适应度值') ;
function y = AdaptFunc(x) y = ((sin(x(1)^2+x(2)^2))^2-cos(x(1)^2+x(2)^2)+1)/((1+0.1*(x(1)^2+x(2)^2))^2)-0.7;end
[xm,fv] = PSO_adaptation(@AdaptFunc,50,2,2,0.8,0.6,100,2)
转载地址:http://ligwi.baihongyu.com/