%控制是否显示2维以下粒子维数的寻找最优的过程
%if IsDraw~=0
%DrawObjGraphic(ParticleSize,ParticleScope,AdaptFunc);
%end
%初始化种群
%[ParSwarm,OptSwarm]=InitFunc(SwarmSize,ParticleSize,ParticleScope,AdaptFunc);
[ParSwarm,OptSwarm]=InitSwarm(SwarmSize,ParticleSize,ParticleScope);
%在测试函数图形上绘制初始化群的位置
if IsDraw~=0
if 1==ParticleSize
for ParSwarmRow=1:SwarmSize
plot([ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,1)],[ParSwarm(ParSwarmRow,3),0],'r*-','markersize',8);
text(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,3),num2str(ParSwarmRow));%在图形中加注释
end
end
if 2==ParticleSize
for ParSwarmRow=1:SwarmSize
stem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);%绘制3D图形
end
end
end
%暂停让抓图
if IsStep~=0
disp('开始迭代,按任意键:')
pause
end
%开始更新算法的调用
for k=1oopCount
%显示迭代的次数:
disp('----------------------------------------------------------')
TempStr=sprintf('第 %g 次迭代',k);
disp(TempStr);
disp('----------------------------------------------------------')
%调用一步迭代的算法
%[ParSwarm,OptSwarm]=StepFindFunc(ParSwarm,OptSwarm,AdaptFunc,ParticleScope,0.95,0.4,LoopCount,k);
[ParSwarm,OptSwarm]=BaseStepPso(ParSwarm,OptSwarm,ParticleScope,0.95,0.4,LoopCount,k);
%在目标函数的图形上绘制2维以下的粒子的新位置
if IsDraw~=0
if 1==ParticleSize
for ParSwarmRow=1:SwarmSize
plot([ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,1)],[ParSwarm(ParSwarmRow,3),0],'r*-','markersize',8);
text(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,3),num2str(ParSwarmRow));
end
end
if 2==ParticleSize
for ParSwarmRow=1:SwarmSize
stem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);
end
end
end
XResult=OptSwarm(SwarmSize+1,1articleSize);%存取本次迭代得到的全局最优值
YResult=AdaptFunc(XResult); %计算全局最优值对应的粒子的适应度值
if IsStep~=0
%XResult=OptSwarm(SwarmSize+1,1articleSize);
%YResult=AdaptFunc(XResult);
str=sprintf('%g 步迭代的最优目标函数值 %g',k,YResult);
disp(str);
disp('下次迭代,按任意键继续');
pause
end
%记录每一步的平均适应度
MeanAdapt(1,k)=mean(ParSwarm(:,2*ParticleSize+1));%mean函数为取有效值函数
end
%for循环结束标志
%记录最小与最大的平均适应度
MinMaxMeanAdapt=[min(MeanAdapt),max(MeanAdapt)];
%计算离线与在线性能
for k=1oopCount
OnLine(1,k)=sum(MeanAdapt(1,1:k))/k;%求取在线性能的数据
OffLine(1,k)=max(MeanAdapt(1,1:k));
end
for k=1oopCount
OffLine(1,k)=sum(OffLine(1,1:k))/k;%求取离线性能的数据
end
%绘制离线性能与在线性能曲线
%subplot(m,n,p);%将图形窗口分成m行n列的子窗口,序号为p的子窗口为当前窗口
if 1==IsPlot
subplot(1,2,1);
%figure
hold on
title('离线性能曲线图')
xlabel('迭代次数');
ylabel('离线性能');
grid on
plot(OffLine);
subplot(1,2,2);
%figure
hold on
title('在线性能曲线图')
xlabel('迭代次数');
ylabel('在线性能');
grid on
plot(OnLine);
end
%记录本次迭代得到的最优值 适应度值
XResult=OptSwarm(SwarmSize+1,1articleSize);
YResult=AdaptFunc(XResult);
Result=[XResult,YResult];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%适应度函数
function y=AdaptFunc(x)
%Griewan函数
%输入x,给出相应的y值,在x=(0,0,…,0)处有全局极小点0.
%编制人:Jeary
%编制日期:2010.12.12
[row,col]=size(x);
if row>1
error('适应度函数:输入的参数错误');
end
y1=1/4000*sum(x.^2);
y2=1;
for h=1:col
y2=y2*cos(x(h)/sqrt(h));
end
y=y1-y2+1;
y=-y; |