PDA

View Full Version : مشکل در همگرایی PSO



ehsan_faal
شنبه 18 مرداد 1393, 12: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

ehsan_faal
شنبه 18 مرداد 1393, 22:16 عصر
فکر نمیکنم سوال سنگینی پرسیده باشم.کسی نیست جواب بده؟