最优化算法 之 PSO算法

来源:互联网 发布:sql server创建视图 编辑:程序博客网 时间:2024/06/05 18:40

**
(一)PSO算法简要介绍

**

PSO算法是一种最优化算法。它预定义一组粒子,和计算粒子适应值(fitness value)的函数。然后进行如下步骤:

(1) 随机化这些粒子,并根据适应值函数算出所有粒子的适应值;
(2) 选出当前所有粒子适应值最优的粒子,保存为全局最优粒子gbest;保存当前所有粒子的适应值,为局部最优粒子lbest(,)(由于现在是第一次求粒子fitness value,故选择当前所有粒子的适应值为每个粒子的局部最优粒子);
(3) 将每个粒子按如下公式迭代更新,再次计算适应值。

v=swarm+c1rand(gbestswarm)+c2rand(lbestswarm)
swarm=swarm+v

(4) 根据适应值更新全局最优粒子和局部最优粒子,重复(3)步骤,直至迭代n次。

我们可以看到,这里一共需要定义:
c1 , c2 , 迭代次数n , 粒子个数m ,
除此之外,还需要定义最大迭代速度vmax,最小迭代速度vmin,粒子的最大值max, 最小值min,
(二)代码实现

feature_num = 5;w = 0.8;    c1 = 0.2;c2 = 0.025;swarmsize = 50;             //粒子数目maxiter = 100;              //迭代数目vmax = ones(1,feature_num)*0.5;     //最大速度vmin = ones(1,feature_num)*0.005;   //最小速度max = ones(1,feature_num)*10;       //最大值min = ones(1,feature_num)*0.1;      //最小值%初始化粒子群range = ones(1,feature_num).*(max-min); swarm = rand(swarmsize,feature_num);%得到具有初始化位置的粒子群for i = 1:swarmsize    swarm(i,:) = swarm(i,:).*range+min;end%初始化速度vstep = rand(swarmsize,feature_num);for i = 1:swarmsize    vstep(i,:) = vstep(i,:).*(vmax-vmin)+vmin;endfswarm = zeros(swarmsize,1);%存放每个粒子的适应值%初始化得到适应值for i = 1:swarmsize    a = swarm(i,:);    rms = fitness(data,label,a,17);   //data是数据 label是值    fswarm(i,1) = rms;end%个体最优和全局最优[best,bestIndex] = min(fswarm);gbest = swarm;              %个体最优解,当前为所有初始值fgbest = fswarm;            %个体最优适应值zbest = swarm(bestIndex,:); %全局最优解fzbest = best;             %全局最优适应值;%迭代寻优yfitness = zeros(1,maxiter);        %存放每一次迭代的全局最优适应值ybest = zeros(feature_num,maxiter); %存放每一次迭代的全局最优解for i = 1:maxiter    if(max(fswarm)-min(fswarm)>0.0003)    for j = 1:swarmsize        vstep(j,:) = vstep(j,:)+c1*rand*(gbest(j,:)-swarm(j,:))+c2*rand*(zbest-swarm(j,:));         vstep(j,vstep(j,:)-vmax>0) = vmax(1,vstep(j,:)-vmax>0);        vstep(j,vstep(j,:)-vmin<0) = vmin(1,vstep(j,:)-vmin<0);         %控制速度范围        swarm(j,:) = swarm(j,:) + vstep(j,:);        swarm(j,swarm(j,:)-max>0) = max(1,swarm(j,:)-max>0);        vstep(j,swarm(j,:)-min<0) = min(1,swarm(j,:)-min<0);        %计算适应值        fswarm(j,1) = fitness(data,label,swarm(j,:),17);        if fswarm(j,1)<fgbest(j)            fgbest(j) = fswarm(j,1);            gbest(j,:) = swarm(j,:);        end        if fswarm(j,1)<fzbest            fzbest = fswarm(j,1);            zbest = swarm(j,:);        end    end    yfitness(1,i) = fzbest;    ybest(:,i) = zbest;    endend[out.fitness, index] = min(yfitness);out.best = ybest(:,index);
0 0
原创粉丝点击