%%%惯性权值非线性减小&粒子运动方向变异&学习因子线性改变的改进%%%%
function pso4hunhe
clear all;
close all;
c1s=2.25; c1f = 0.5; %学习因子
c2s=1.25; c2f = 2.25; %学习因子
wmax=0.9; %权值最大值
wmin=0.1; %权值最小值
global D N
D=3; %种群维数
N=40; %粒子规模
Tmax=200; %最大迭代次数 Tmax
eps=10^(-6); %满足条件限制的误差
tic
t1=clock;
%%选择测试函数的速度和位置限制范围%%
F_n=1;
switch F_n
case 1 %% f4_griewank [-600,600] %%
Vmax(1:D)= 600; Vmin(1:D)=-600;
Xmax(1:D)= 600; Xmin(1:D)=-600;
end
%%初始化位置速度%%
P=zeros(D,N);%位置P记法:行 D;列 N;
V=zeros(D,N);%每个粒子的位置、速度对应于一列。
[P,V]=initial_P_V(D,N,Xmax,Xmin,Vmax,Vmin);
%%个体最优 P_p 和全局最优 globe 初始赋值%%
P_p=P;globe=zeros(D,1);
%%评价每个粒子适应值,寻找出 globle%%
for j=1:N
Pos=P(:,j);
fz(j)=Fitness_Function(Pos,F_n);
end
[P_g,I]=min(fz);
globe=P(:,I);
%%迭代开始%%
for itrtn=1:Tmax/10 %前一段时间粒子方向变异
time(itrtn)=itrtn;
w=wmax+(wmax-wmin)*itrtn^2/Tmax^2-2*(wmax-wmin)*itrtn/Tmax;
c1= c1s+itrtn*(c1f-c1s)/Tmax;
c2= c2s+itrtn*(c2f-c2s)/Tmax;
r1=rand(1);r2=rand(1);
for i=1:9*N/10
V(:,i)=w*V(:,i)+c1*r1*(P_p(:,i)-P(:,i))+c2*r2*(globe-P(:,i));%速度更新
P(:,i)=P(:,i)+V(:,i); %位置更新
end
for i=9*N/10:N
V(:,i)=w*V(:,i)+c1*r1*(P_p(:,i)-P(:,i))+c2*r2*(globe-P(:,i));%速度更新
P(:,i)=P(:,i)-V(:,i); %位置更新
end
%%评价每个粒子适应值,更新个体最优 P_p 和全局最优 globe%%
for j=1:N
xx=P(:,j)';
fz1(j)=Fitness_Function(xx,F_n);
if fz1(j)<fz(j)
P_p(:,j)=P(:,j);
fz(j)=fz1(j);
end
if fz1(j)<P_g
P_g=fz1(j);
end
end
[P_g1 I]=min(fz);
P_gg(itrtn)=P_g1;
globe=P_p(:,I);
end
for itrtn=Tmax/10:Tmax %%%后一段时间按照标准粒子群算法进行
time(itrtn)=itrtn;
r1=rand(1);r2=rand(1);
for i=1:N
V(:,i)=0.7298*V(:,i)+1.49445*r1*(P_p(:,i)-P(:,i))+1.49445*r2*(globe-P(:,i));%速度更新
P(:,i)=P(:,i)+V(:,i); %位置更新
end
%%速度限制%%
for i=1:N
jj=1;
K=ones(D,1);
for row=1:D
if V(row,i)>Vmax(row)
K(jj)=Vmax(row)/V(row,i);
jj=jj+1;
elseif V(row,i)<Vmin(row)
K(jj)=Vmin(row)/V(row,i);
jj=jj+1;
else
end
end
Kmin=min(K);
for row=1:D
if V(row,i)>Vmax(row)
V(row,i)=V(row,i)*Kmin;
elseif V(row,i)<Vmin(row)
V(row,i)=V(row,i)*Kmin;
else
end
end
end
%%位置限制%%
for i=1:N
for row=1:D
if P(row,i)>Xmax(row)
P(row,i)=Xmax(row);
elseif P(row,i)<Xmin(row)
P(row,i)=Xmin(row);
else
end
end
end
%%重新评价每个粒子适应值,更新个体最优 P_p 和全局最优 globe%%
for j=1:N
xx=P(:,j)';
fz1(j)=Fitness_Function(xx,F_n);
if fz1(j)<fz(j)
P_p(:,j)=P(:,j);
fz(j)=fz1(j);
end
if fz1(j)<P_g
P_g=fz1(j);
end
end
[P_g1 I]=min(fz);
P_gg(itrtn)=P_g1;
globe=P_p(:,I);
if P_gg(itrtn)<eps
break;
end
end
%%画‘评价值’变化曲线%%
figure(1);
BestFitness_plot(time,P_gg);
disp('*************************************************************')
disp('混合粒子群算法得到的最优位置为:')
globe
disp('最优值为:')
P_gg(itrtn)
disp('程序运行总时间为:')
disp(['',num2str(etime(clock,t1))]);
save d P_gg
function BestFitness_plot(time,P_gg)
plot(time,P_gg);
xlabel('迭代的次数');ylabel('适应度值');
function [P,V]=initial_P_V(D,N,Xmax,Xmin,Vmax,Vmin)
for i=1:D
P(i,:)=Xmin(i)+(Xmax(i)-Xmin(i))*rand(1,N);
V(i,:)=Vmin(i)+(Vmax(i)-Vmin(i))*rand(1,N);
end
function Fitness=Fitness_Function(X,F_n)
global D N
switch F_n
case 1
%% f4_griewank %%
res1=X(:)'*X(:)/4000;
res2=1;
for row=1:D
res2=res2*cos(X(row)/sqrt(row));
end
Func_Griewank=res1-res2+1;
Fitness=Func_Griewank;
end
评论0