对于粒子群算法的一些理解【含有已编译通过的实例】
最近做大创开始学习遗传算法,粒子群算法等,在大佬的带领下,开始写点博客,因为是第一次写,而且自己学的也不好(捏个是重点),就当写给自己看啦。
粒子群算法跟遗传算法一样,都是从自然界的自然现象得到启发,而被大牛创造出来的,在一代代的改进中逐渐趋于完善,也慢慢作用于越来越多的领域中。
粒子群算法据说是从鸟群寻食中得到的启发,一群鸟在一个不知道食物分布的地方觅食,它们会渐渐集中到食物最多的地方去,当然,如果地方太大的话,也可能会出现多个集中鸟比较多的地方。这里头有几个官方术语
个人理解就是一个较优解集支配一个次优解集
Pareto最优就是在最理想条件下,我们取得了自己最想要的结果,但是很遗憾,因为现实问题的影响因素太多,所以我们往往陷入局部最优,或者得到一堆
较优解。于是:
根据我们计算得到的最优解集,我们可以计算出理想的最终优化结果,就像如果发电的模型的话,我们可以得到我们想要的发电的效率啦,参量啦~~~也就是
下面的是一个在matlab上已经测试通过的 z = x^2 + y^2的pso实现全部代码,希望对大家有帮助。
下文代码参考该博主代码写出,这个博客讲PSO很赞哎!
close all;
clc;
N = 100;%种群规模
D = 2;%粒子维度
T = 100;%迭代次数
Xmax = 2000;
Xmin = -2000;
c1 = 1.5; %学习因子1
c2 = 1.5; %学习因子2
w = 0.8; %惯性权重
Vmax = 10; % 最大飞行速度
Vmin = -10;% 最小飞行速度
popx = rand(N,D)*(Xmax-Xmin)+Xmin;% 初试化粒子群的位置(粒子位置是个D维向量)
popv = rand(N,D)*(Vmax-Vmin)+Vmin;%初始化粒子群的速度(粒子速度是个D维向量)
%初始化每个历史最优粒子
pBest = popx;
pBestValue = func_fitness(pBest);
%初始化全局历史最优粒子
[gBestValue,index] = max(func_fitness(popx));
gBest = popx(index,:);
for t=1:T
for i=1:N
%更新个体的位置和速度
popv(i,:) = w*popv(i,:)+C1*rand*(pBest(i,:)-popx(i,:))+C2*rand*(gBest-popx(i,:));
popx(i,:) = popx(i,:)+popv(i,:);
%边界处理,超过定义域范围就取该范围极值
index = popv(i,:)>Vmax | popv(i,:)<Vmin ;
popv(i,index) = rand*(Vmax-Vmin)+Vmin ;
index = find(popx(i,:)>Xmax | popx(i,:)<Xmin);
popx(i,index) = rand*(Xmax-Xmin) + Xmin;
%更新粒子历史最优
if func_fitness(popx(i,:))>pBestValue(i)
pBest(i,:) = popx(i,:);
pBestValue(i) = func_fitness(popx(i,:));
elseif pBestValue(i)>gBestValue
gBest = pBest(i,:);
gBestValue = pBestValue(i);
end
end
%每代最优解对应的目标函数值
tBest(t) = func_objValue(gBest);%目标函数
end
figure
plot(tBest);
xlabel('迭代次数');
ylabel('适应度值');
title('适应度·进化曲线');
function [result] = func_fitness(pop)
%UNTITLED2 此处显示有关此函数的摘要
% 此处显示详细说明
objValue = func_objValue(pop);
result = 1314 -objValue ;
end
function [result] = func_objValue(pop)
%NTITLED3 此处显示有关此函数的摘要
% 此处显示详细说明
objValue = sum(pop,2);
result = objValue;
end