目录
1粒子群优化算法
一些见解
- PSO粒子群算法:用于全局搜索
- CLS混沌算法:根据PSO的结果进行局部搜索
fitness:待优化的目标函数
N:粒子数目
c1,c2: 学习因子
cmax:学习因子的最大值
cmin:学习因子的最小值
xmax:自变量搜索域的最大值
xmin:自变量搜索域的最小值
w:惯性权重
wmax:最大权重
wmin:最小权重
M:最大迭代次数
D:自变量的个数
xm:目标函数取最小值时的自变量值
fv:目标函数的最小值
Pc:杂交概率
Sp:杂交池的大小比例
lamda:退火参数
1.1基本粒子群概述
1.2基本粒子群算法
- 算法原理:
- 优点:全局搜索
- 缺点:耗时
- 个人见解:
1.3带压缩因子的粒子群算法
1.4权重改进的粒子群算法
1.4.1线性递减权重法
1.4.2自适应权重法
1.4.3随机权重法
1.5变学习因子的粒子群算法
1.5.1同步变化的学习因子
1.5.2异步变化的学习因子
1.6二阶粒子群算法
1.7二阶振荡粒子群算法
1.8混沌粒子群算法
[xm,fv] = CLSPSO(fitness,N,w,c1,c2,xmax,xmin,M,maxC,D)
fitness:待优化的目标函数
N:粒子数目
c1,c2: 学习因子
w:惯性权重
M:最大迭代次数
D:自变量的个数
xm:目标函数取最小值时的自变量值
fv:目标函数的最小值
- 算法原理:混沌粒子群是混沌优化和粒子群优化两者的结合。对于给定的优化函数,通过将搜索过程对应为混沌轨道的遍历过程,可将搜索过程具有避免陷入局部极小的能力
- 优点:用于求解无约束优化问题
- 缺点:通常需要大量的迭代步数才可以获得较好的解,且对于初始解十分敏感。对此,可以采用PSO和混沌搜索相结合,得到混沌粒子群算法。
- 个人见解:保持了种群的多样性,加强搜索的分散性,在保留一定数量优秀微粒的同时,算法根据群体的最佳位置动态收缩区域,并在收缩区域内随机产生微粒来代替性能较差的微粒。
1.9混合粒子群算法
混合粒子群算法指的是借鉴其他一些智能优化算法的思想而形成的粒子群算法。除了粒子算法外,还有遗传算法、模拟退火算法以及神经网络等智能算法,这些算法是目前应用比较广泛的智能算法,每种智能算法都有其特点,因此自然而然就有了结合各种智能算法的优点而形成的混合智能算法。
下面介绍了三种混合粒子群算法,前两种是基于遗传算法中的选择和杂交机制而改进的粒子群算法,第三种是基于模拟退火算法的粒子群算法。
1.9.1基于自然选择的算法
[xm,fv] = SelPSO(fitness,N,c1,c2,w,M,D)
fitness:待优化的目标函数
N:粒子数目
c1,c2: 学习因子
w:惯性权重
M:最大迭代次数
D:自变量的个数
xm:目标函数取最小值时的自变量值
fv:目标函数的最小值
- 算法原理:将自然选择吉利与粒子群算法相结合得到基于选择的粒子群算法,其基本思想为每次迭代过程中将整个粒子群按适应值排序,用种群中最好的一半粒子的速度和位置替换最差的一半的位置和速度,同时保留原来每个个体说记忆的历史最优值。
- 优点:用于求解无约束优化问题
- 缺点:
- 个人见解:基于自然选择的粒子群算法求得的结果精度非常高
- matlab代码
function [xm,fv] = SelPSO(fitness,N,c1,c2,w,M,D)
format long;
for i=l:N
for j=l:D
x(i,j)=randn; %随机初始化位置
v(i,j)=randn; %随机初始化速度
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,:))<fitness(pg)
pg=x(i,:);
end
end
for t=1:M
for i=1:N
v(i,:)=w*v(i,:)+cl*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
x(i,:)=x(i,:)+v(i,:);
fx(i)= fitness(x(i,:));
if fx(i)<p(i)
p(i)=fx(i);
y(i,:)=x(i,:);
end
if p(i)<fitness(pg)
pg=y(i,:);
end
end
[sortf,sortx] = sort(fx); %将所有粒子按适应值排序
exIndex = round((N-1)/2);
x(sortx((N-exIndex+1):N)) = x(sortx(1:exIndex)); %将最好的一半粒子的位置替换掉最差的一半
v(sortx((N-exIndex+1):N)) = v(sortx(1:exIndex)); %将最好的一半粒子的速度替换掉最差的一半
end
xm = pg';
fv = fitness(pg);
1.9.2基于杂交的算法
[xm,fv] = BreedPSO(fitness,N,c1,c2,w,Pc,Sp,M,D)
fitness:待优化的目标函数
N:粒子数目
c1,c2: 学习因子
w:惯性权重
M:最大迭代次数
D:自变量的个数
xm:目标函数取最小值时的自变量值
fv:目标函数的最小值
%Pc杂交概率
%Sp杂交池的大小比例
- 算法原理:根据遗传算法中的杂交概念,在每次迭代中,根据杂交概率选取指定数量的粒子放入杂交池内,池总的粒子随机两两杂交,产生同样数目的子代粒子(child),并用子代粒子代替亲代粒子(parent)。
- 优点:结果精度非常高
- 缺点:
- 个人见解:
- matlab代码
function [xm,fv] = BreedPSO(fitness,N,c1,c2,w,Pc,Sp,M,D)
format long;
for i=l:N
for j=l:D
x(i,j)=randn; %随机初始化位置
v(i,j)=randn; %随机初始化速度
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,:))<fitness(pg)
pg=x(i,:);
end
end
for t=1:M
for i=1:N
v(i,:)=w*v(i,:)+cl*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
x(i,:)=x(i,:)+v(i,:);
%%%%1
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
rl =rand();
if rl< Pc %杂交概率
numPool = round(Sp*N); %杂交池大小
PoolX = x(1:numPool,:); %杂交池中粒子的位置
PoolVX = v(1:numPool,:);%杂交池中粒子的速度
for i=l:numPool
seedl = floor(rand()*(numPool-1))+ 1;
seed2 = floor(rand()*(numPool-1))+ 1;
pb = rand();
%子代的位置计算
childxl(i,:)=pb*PoolX(seedl,:) +(1-pb)*PoolX(seed2,:);
%子代的速度计算
childv1(i,:) =(PoolVX(seed1,:)+PoolVX(seed2,:))*norm (PoolVX(seed1,:))/...
norm(PoolVX(seedl,:)+ PoolVX(seed2,:)); %换行可能出错
end
x(1:numPool,:)= childxl; %子代的位置替换父代的位置
v(1:numPool,:)= childv1; %子代的速度替换父代的速度
end
end
%%%%
end
xm = pg';
fv = fitness(pg);
1.9.3基于模拟退火的算法
[xm,fv] = SimuAPSO(fitness,N,c1,c2,lamda,M,D)
fitness:待优化的目标函数
N:粒子数目
c1,c2: 学习因子
w:惯性权重
M:最大迭代次数
D:自变量的个数
xm:目标函数取最小值时的自变量值
fv:目标函数的最小值
%lamda:退火参数
- 算法原理:在搜索过程中具有概率突跳的能力,能够有效地避免搜索过程陷入局部极小解。
初始温度和退温方式对算法有一定的影响,一般采用如下的初温和退温方式:
t(k+1)=lamda*t(k)
t(0) =f(pg)/ln 5
- 优点:在退火过程中不但接受好的解,而且还以一定的概率接受差的解,同时这种概率收到温度参数的控制,其大小随着温度的下降而减小。用于求解无约束优化问题
- 缺点:
- 个人见解:
function [xm,fv] = SimuAPSO(fitness,N,c1,c2,lamda,M,D)
format long;
for i=l:N
for j=l:D
x(i,j)=randn; %随机初始化位置
v(i,j)=randn; %随机初始化速度
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,:))<fitness(pg)
pg=x(i,:);
end
end
%%%%
T= fitness(pg)/log(5); %初始温度
for t=1:M
groupFit = fitness(pg);
for i=1:N %当前温度下各个Pi的适应值
Tfit(i) = exp( - (p(i) - groupFit)/T);
end
SumTfit = sum(Tfit);
Tfit = Tfit/SumTfit;
pBet = rand();
for i = 1:N %用轮盘赌策略确定全局最优的某个替代值
ComFit(i)= sum(Tfit(1:i));
if pBet <= ComFit(i)
pg_plus = x(i,:);
break;
end
end
C= cl + c2;
ksi = 2/abs(2-C-sqrt(C^2 - 4*C)); %速度压缩因子
for i=l:N
v(i,:)=ksi*( v(i,:)+cl*rand*(y(i,:)-x(i,:))+c2*rand*( pg_plus-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
T=T * lamda; %退温操作
end
%%%%
xm = pg';
fv = fitness(pg);