混合粒子群算法:基于模拟退火的算法
1. 算法原理
模拟退火算法在搜索过程中具有概率突跳的能力,能够有效地避免搜索过程中陷入局部
极小解。模拟退火算法在退火过程中不但接受好的解,而且还以一定的概率接受差得解,同
时这种概率受到温度参数的控制,其大小随温度的下降而减小。
2. 算法步骤
(1) 随机初始化种群中各微粒的位置和速度;
(2) 评价每个微粒的适应度,将当前各微子的位置和适应值存储在各微子的ip中,将所
有pbest的中适应最优个体的位置和适应值存储在gp中;
(3) 确定初始温度;
(4) 根据下式确定当前温度下各ip的适配值:
(()())/(()())/1()igigfpfptiNfpfptieTFpe
(5) 采用轮盘赌策略从所有ip中确定全局最优的某个替代值gp,然后根据下式更新各
微粒的速度和位置:
,,11,,22,,(1)()[()][()]ijijijijgjij
vtvtcrpxtcrpxt
,,,(1)()(1),1,2,...ijijij
xtxtvtjd
12
2
2
,24CccCCC
(6) 计算各微粒新的目标值,更新各微粒的ip值及群体的gp值;
(7) 进行退温操作;
(8) 若满足停止条件(通常为预设的运算精度或迭代次数),搜索停止,输出结果,否知
返回(4)继续搜索;
(9) 初始温度和退温温度对算法有一定的影响,一般采用如下的初温和退温方式:
10,()/ln5kkgtktfp
3. 算法MATLAB实现
在MATLAB中编程实现的基于杂交的粒子群算法优化函数为:SimuAPSO。
功能:用基于模拟退火的粒子群算法求解无约束优化问题。
调用格式:12[,](,,,,,,)xmfvSimuAPSOfitnessNcclamdaMD
其中,fitness:待优化的目标函数;
N
:粒子数目;
1
c
:学习因子1;
2
c
:学习因子2;
lamda
:退火常数;
M
:最大迭代次数;
D
:自变量的个数;
xm
:目标函数取最小值时的自变量值;
fv
:目标函数的最小值。
基于模拟退火的粒子群算法的MATLAB代码如下: p(i)=fitness(x(i,:)); 例 取粒子数目为40,学习因子都取2.05,迭代步数取10000,退火常数取为0.5。 首先建立目标函数文件 function F=fitness(x) 在MATLAB命令窗口中输入: 所得结果为: 0.999999992830566 fv =
function [xm,fv]=SimuAPSO(fitness,N,c1,c2,lamda,M,D)
% fitness:待优化的目标函数;
% N:粒子数目;
% c1:学习因子1;
% c2:学习因子2;
% lamda:退火常数;
% M:最大迭代次数;
% D:自变量的个数;
% xm:目标函数取最小值时的自变量值;
% fv:目标函数的最小值。
format long;
for i=1:N
for j=1: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,:))
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=c1+c2;
ksi=2/abs(2-C-sqrt(C^2-4*C)); %速度压缩因子
for i=1:N
v(i,:)=ksi*(v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg_plus-x(i,:)));
x(i,:)=x(i,:)+v(i,:);
if fitness(x(i,:))
y(i,:)=x(i,:);
end
if p(i)
end
end
T=T*lamda;
end
xm=pg';
fv=fitness(pg);
基于模拟退火的粒子群算法应用实例。求下面函数的最小值
15211()0.01,1010,1,2,...51iiifxxiix
解:
.fitnessm
:
F=0;
for i=1:5
F=F+1/(i+(x(i)-1)^2);
end
F=1/(0.01+F);
>> [xm,fv]=SimuAPSO(@fitness,40,2.05,2.05,0.5,10000,5)
xm =
0.999999968868289
1.000000045205848
0.999999990239291
0.999999963875179
0.436046511627907
从结果可以看出,基于模拟退火的粒子群算法求得的结果精度是非常高的。