ehsan_faal
شنبه 18 مرداد 1393, 13:43 عصر
سلام.من واسه اولین بار اومدم الگوریتم PSO رو خودم بنویسم ولی مشکلم اینه که اصلا همگرا نمیشه.قبلا همین الگوریتم رو از روی یه فیلم آموزشی نوشته بودم ودقیقا همینجوری قشنگ به صفر میرسید.الان با همون تنظیمات که میرم آخرش روی یه عدد بزرگ وایمیسته.من خوب این الگوریتم رو درک نکردم.nVar و nPop رو خوب نمیفهمم.این درسته که nPopجمعیتیه که دارن فضا رو واسه ما میگردن و nVarتعدادی از اون جمعیت هستند که تهش به عنوان جواب انتخاب میشن؟
یکم مفهومش رو واسم توضیح بدید ممنون میشم.اینم کدی که نوشتم.
باتشکر
clc;clear;
close all;
%% Problem Definition
CostFunction=@Sphere;
VarMax=100;
VarMin=-100;
nVar=20;
VarSize=[1,nVar];
VelMax=(VarMax-VarMin)/10;
%% PSO Parameters
MaxIter=2500;
nPop=500;
phi1=2.05;
phi2=2.05;
phi=phi1+phi2;
chi=2/(phi-2+sqrt(phi^2-4*phi));
w=chi;
wdamp=1;
c1=chi*phi1;
c2=chi*phi2;
% w=1;
% wdamp=0.99;
% c1=2;
% c2=2;
%% Initialization
Empty.Position=[];
Empty.Cost=[];
Empty.Velocity=[];
Empty.Best.Position=[];
Empty.Best.Cost=[];
Particle=repmat(Empty,nPop,1);
GlobalBest.Cost=inf;
for i=1:nPop
Particle(i).Position=unifrnd(VarMin,VarMax,VarSize );
Particle(i).Velocity=zeros(VarSize);
Particle(i).Cost=CostFunction(Particle(i).Position );
Particle(i).Best.Position=Particle(i).Position;
Particle(i).Best.Cost=Particle(i).Cost;
if Particle(i).Best.Position < GlobalBest.Cost
GlobalBest=Particle(i).Best;
end
end
BestCost=zeros(MaxIter,1);
%% PSO Main Loop
for it=1:MaxIter
for i=1:nPop
Particle(i).Velocity=w*Particle(i).Velocity ...
+c1*rand*(Particle(i).Best.Position-Particle(i).Position) ...
+c2*rand*(GlobalBest.Position-Particle(i).Position);
Particle(i).Velocity=min(max(Particle(i).Velocity,-VelMax),VelMax);
Particle(i).Position=Particle(i).Position+Particle (i).Velocity;
flag=(Particle(i).Position<VarMin | Particle(i).Position>VarMax);
Particle(i).Velocity(flag)=-Particle(i).Velocity(flag);
Particle(i).Position=min(max(Particle(i).Position, VarMin),VarMax);
Particle(i).Cost=CostFunction(Particle(i).Position );
if Particle(i).Position < Particle(i).Best.Position
Particle(i).Best.Position=Particle(i).Position;
Particle(i).Best.Cost=Particle(i).Cost;
if Particle(i).Best.Position < GlobalBest.Cost
GlobalBest=Particle(i).Best;
end
end
end
BestCost(it)=GlobalBest.Cost;
disp(['Iteration: ' num2str(it) ' BestCost: ' num2str(BestCost(it))]);
w=w*wdamp;
end
%% Results
figure('Name','PSO');
semilogy(BestCost,'LineWidth',2);
xlabel('Iteration');
ylabel('BestCost');
title('PSO');
function Z=Sphere(x)Z=sum(x.^2);
end
یکم مفهومش رو واسم توضیح بدید ممنون میشم.اینم کدی که نوشتم.
باتشکر
clc;clear;
close all;
%% Problem Definition
CostFunction=@Sphere;
VarMax=100;
VarMin=-100;
nVar=20;
VarSize=[1,nVar];
VelMax=(VarMax-VarMin)/10;
%% PSO Parameters
MaxIter=2500;
nPop=500;
phi1=2.05;
phi2=2.05;
phi=phi1+phi2;
chi=2/(phi-2+sqrt(phi^2-4*phi));
w=chi;
wdamp=1;
c1=chi*phi1;
c2=chi*phi2;
% w=1;
% wdamp=0.99;
% c1=2;
% c2=2;
%% Initialization
Empty.Position=[];
Empty.Cost=[];
Empty.Velocity=[];
Empty.Best.Position=[];
Empty.Best.Cost=[];
Particle=repmat(Empty,nPop,1);
GlobalBest.Cost=inf;
for i=1:nPop
Particle(i).Position=unifrnd(VarMin,VarMax,VarSize );
Particle(i).Velocity=zeros(VarSize);
Particle(i).Cost=CostFunction(Particle(i).Position );
Particle(i).Best.Position=Particle(i).Position;
Particle(i).Best.Cost=Particle(i).Cost;
if Particle(i).Best.Position < GlobalBest.Cost
GlobalBest=Particle(i).Best;
end
end
BestCost=zeros(MaxIter,1);
%% PSO Main Loop
for it=1:MaxIter
for i=1:nPop
Particle(i).Velocity=w*Particle(i).Velocity ...
+c1*rand*(Particle(i).Best.Position-Particle(i).Position) ...
+c2*rand*(GlobalBest.Position-Particle(i).Position);
Particle(i).Velocity=min(max(Particle(i).Velocity,-VelMax),VelMax);
Particle(i).Position=Particle(i).Position+Particle (i).Velocity;
flag=(Particle(i).Position<VarMin | Particle(i).Position>VarMax);
Particle(i).Velocity(flag)=-Particle(i).Velocity(flag);
Particle(i).Position=min(max(Particle(i).Position, VarMin),VarMax);
Particle(i).Cost=CostFunction(Particle(i).Position );
if Particle(i).Position < Particle(i).Best.Position
Particle(i).Best.Position=Particle(i).Position;
Particle(i).Best.Cost=Particle(i).Cost;
if Particle(i).Best.Position < GlobalBest.Cost
GlobalBest=Particle(i).Best;
end
end
end
BestCost(it)=GlobalBest.Cost;
disp(['Iteration: ' num2str(it) ' BestCost: ' num2str(BestCost(it))]);
w=w*wdamp;
end
%% Results
figure('Name','PSO');
semilogy(BestCost,'LineWidth',2);
xlabel('Iteration');
ylabel('BestCost');
title('PSO');
function Z=Sphere(x)Z=sum(x.^2);
end