1. 首页 > 电脑手机 >

粒子群算法——搜索空间中的一只鸟

粒子群算法简单介绍

粒子群算法(也称粒子群优化算法(particle swarm optimization, PSO)),模拟鸟群随机搜索食物的行为。粒子群算法中,每个优化问题的潜在解都是搜索空间中的一只鸟,叫做“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitness value),每个粒子还有一个速度决定它们“飞行”的方向和距离。

粒子群算法——搜索空间中的一只鸟粒子群算法——搜索空间中的一只鸟


粒子群算法初始化为一群随机的粒子(随机解),然后根据迭代找到解。每一次迭代中,粒子通过跟踪两个极值来更新自己:第1个是粒子本身所找到的解,这个称为个体极值;第2个是整个种群目前找到的解,这个称为全局极值。也可以不用整个种群,而是用其中的一部分作为粒子的邻居,称为局部极值。

假设在一个D维搜索空间中,有N个粒子组成一个群落,其中第i个粒子表示为一个D维的向量:

第i个粒子的速度表示为:

还要保存每个个体的已经找到的解 ,和一个整个群落找到的解 。

第i个粒子根据下面的公式更新自己的速度和位置:

其中, 是个体已知解, 是种群已知解, 为惯性权重, , 为学习因子(或加速常数 acceleration constant), , 是[0,1]范围内的随机数。

式(1)由三部分组成:

粒子群算法的算法介绍

粒子群优化(ParticleSwarmOptimization,PSO)算法是1995年由美国学者Kennedy等人提出的,该算法是模拟鸟类觅食等群体智能行为的智能优化算法。在自然界中,鸟群在觅食的时候,一般存在个体和群体协同的行为。

第一个就是粒子本身所找到的解,这个解叫做个体极值pBest。另一个极值是整个种群目前找到的解,这个极值是全局极值gBest。

粒子群算法也称粒子群优化算法(ParticleSwarmOptimization,PSO),属于群体智能优化算法,是近年来发展起来的一种新的进化算法(EvolutionaryAlgorithm,EA)。

求助:粒子群算法matlaB程序的一点疑问

%不知道你具体的问题是什么,下面是一个基本的pso算法解决函数极值问题,如果是一些大型的问题,需要对速度、惯性常数、和自适应变异做进一步优化,希望对你有帮助

function y = fun(x)

y=-20exp(-0.2sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2pix(1))+cos(2pix(2)))/2)+20+2.71289;

%下面是主程序

%% 清空环境

clc

clear

%% 参数初始化

%粒子群算法中的两个参数

c1 = 1.49445;

c2 = 1.49445;

maxgen=200; % 进化次数

sizepop=20; %种群规模

Vmax=1;%速度限制

Vmin=-1;

popmax=5;%种群限制

popmin=-5;

%% 产生初始粒子和速度

for i=1:sizepop

%随机产生一个种群

pop(i,:)=5rands(1,2); %初始种群

V(i,:)=rands(1,2); %初始化速度

%计算适应度

fitness(i)=fun(pop(i,:)); %染色体的适应度

end

%找的染色体

[bestfitness bestindex]=min(fitness);

zbest=pop(bestindex,:); %全局佳

gbest=pop; %个体佳

fitnessgbest=fitness; %个体佳适应度值

fitnesszbest=bestfitness; %全局佳适应度值

%% 迭代寻优

for i=1:maxgen

for j=1:sizepop

%速度更新

V(j,:) = V(j,:) + c1rand(gbest(j,:) - pop(j,:)) + c2rand(zbest - pop(j,:));

V(j,find(V(j,:)>Vmax))=Vmax;

V(j,find(V(j,:)

%种群更新

pop(j,:)=pop(j,:)+0.5V(j,:);

pop(j,find(pop(j,:)>popmax))=popmax;

pop(j,find(pop(j,:)

%自适应变异(避免粒子群算法陷入局部)

if rand>0.8

k=ceil(2rand);%ceil朝正无穷大方向取整

pop(j,k)=rand;

end

%适应度值

fitness(j)=fun(pop(j,:));

%个体更新

if fitness(j) < fitnessgbest(j)

gbest(j,:) = pop(j,:);

fitnessgbest(j) = fitness(j);

end

%群体更新

if fitness(j) < fitnesszbest

zbest = pop(j,:);

fitnesszbest = fitness(j);

end

end

yy(i)=fitnesszbest;

end

%% 结果分析

plot(yy)

title(['适应度曲线 ' '终止代数=' num2str(maxgen)]);

xlabel('进化代数');ylabel('适应度');

粒子群算法 个体极值 全局极值怎么求

粒子群算法中每个粒子都记忆自己的位置,即从进化开始到现在这个粒子能使目标函数达到或是小的那个时刻粒子的位置。个体极值就是粒子在位置所得到的目标函数的值。全局极值就是在所有粒子的个体极值中或是小的那个值,与只对应的就是全局粒子的位置。

对有约束的优化函数,一般是将约束条件加入到目标函数中,然后计算总体的值,以此来作为评价标准。

粒子群算法,也称粒子群优化算法(Partical Swarm Optimization),缩写为 PSO, 是近年来发展起来的一种新的进化算法((Evolu2tionary Algorithm - EA).PSO 算法属于进化算法的一种,和遗传算法相似,它也是从随机解出发,通过迭代寻找解,它也是通过适应度来评价解的品质,但它比遗传算法规则更为简单,它没有遗传算法的“交叉”(Crossover) 和“变异”(Mutation) 操作,它通过追随当前搜索到的值来寻找全局.这种算法以其实现容易、精度高、收敛快等优点引起了学术界的重视,并且在解决实际问题中展示了其优越性.设想这样一个场景:一群鸟在随机搜索食物.在这个区域里只有一块食物.所有的鸟都不知道食物在那里.但是他们知道当前的位置离食物还有多远.那么找到食物的策略是什么呢.简单有效的就是搜寻目前离食物近的鸟的周围区域.

PSO从这种模型中得到启示并用于解决优化问题.PSO中,每个优化问题的解都是搜索空间中的一只鸟.我们称之为“粒子”.所有的粒子都有一个由被优化的函数决定的适应值(fitness value),每个粒子还有一个速度决定他们飞翔的方向和距离.然后粒子们就追随当前的粒子在解空间中搜索.

PSO 初始化为一群随机粒子(随机解).然后通过迭代找到解.在每一次迭代中,粒子通过跟踪两个"极值"来更新自己.第一个就是粒子本身所找到的解,这个解叫做个体极值pBest.另一个极值是整个种群目前找到的解,这个极值是全局极值gBest.另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值.

求实现基于粒子群算法的函数极值寻优算法MATLAB程序

for i=1:sizepop

% 随机产生一个种群

pop(i,:)=2rands(1,2); % 初始化粒子

V(i,:)=0.5rands(1,2); % 初始化速度

% 计算粒子适应度值

fitness(i)=fun(pop(i,:));

end

[bestfitness bestindex]=min(fitness);

zbest=pop(bestindex,:); % 群体极值位置

gbest=pop; % 个体极值位置

fitnessgbest=fitness; % 个体极值适应度值

fitnesszbest=bestfitness % 群体极值适应度值

% 迭代寻优

for i=1:maxgen

% 粒子位置和速度更新

for j=1:sizepop

% 速度更新

V(j,:)=V(j,:)+c1rand(gbest(j,:)-pop(j,:))+c2rand(zbest-pop(j,:));

V(j,find(V(j,:)>Vmax))=Vmax;

V(j,find(V(j,:)

% 粒子更新

pop(j,:)=pop(j,:)+0.5V(j,:);

pop(j,find(pop(j,:)>popmax))=popmax;

pop(j,find(pop(j,:)

%新粒子适应度值

fitness(j)=fun(pop(j,:));

end

% 个体极值和种群极值更新

for j=1:sizepop

% 个体极值更新

if fitness(j)>fitnessgbest(j)

gbest(j,:)=pop(j,:);

fitnessgbest(j)=fitness(j);

end

% 群体极值更新

if fitness(j)>fitnesszbest

zbest=pop(j,:);

fitnesszbest=fitness(j);

end

end

% 每代值记录到yy数组中

result(i)=fitnesszbest;

end

% 画出每代个体适应度值

plot(result)

title('个体适应度值','fontsize',12);

xlabel('进化代数','fontsize',12);ylabel('适应度值','fontsize',12);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至836084111@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息