如图的粒子群优化问题,为什么我的结果比100小,x也没超出范围呀,而且每次结果都不一样,差的还挺多,但迭代完成后是收敛的。求解!感谢!
代码如下:
%%%%%%%%%%%%%粒子群算法求函数极值%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
N=100; %群体粒子个数
D=30; %粒子维数
T=800; %最大迭代次数
c1=1.5; %学习因子1
c2=1.5; %学习因子2
Wmax=0.8; %惯性权重最大值
Wmin=0.4; %惯性权重最小值
Xmax=5.12; %位置最大值
Xmin=-5.12; %位置最小值
Vmax=5; %速度最大值
Vmin=-5; %速度最小值
%%%%%%%%%%初始化种群个体(限定位置和速度)%%%%%%%%%
x=rand(N,D) * (Xmax-Xmin)+Xmin;
v=rand(N,D) * (Vmax-Vmin)+Vmin;
%%%%%%%%%%%%%初始化个体最优位置和最优值%%%%%%%%%%
p=x;
pbest=ones(N,1);
for i=1:N
pbest(i)=func2(x(i,:));
end
%%%%%%%%%%%%%初始化全局最优位置和最优值%%%%%%%%%%
g=ones(1,D);
gbest=inf;
for i=1:N
if(pbest(i)1,T);
%%%%%%%%按照公式依次迭代直到满足精度或者迭代次数%%%%%%
for i=1:T
% if mod(T,20) == 0
% figure
% plot(x(:,1),x(:,2),'*');
% end
for j=1:N
%%%%%%%%%%更新个体最优位置和最优值%%%%%%%%%
if (func2(x(j,:))if(pbest(j)rand*(p(j,:)-x(j,:))...
+c2*rand*(g-x(j,:));
x(j,:)=x(j,:)+v(j,:);
%%%%%%%%%%%边界条件处理%%%%%%%%%%%%%%%
%可以做镜像反弹的操作,这样可以对原始信息有一定保留
for ii=1:D
if (v(j,ii)>Vmax) || (v(j,ii)< Vmin)
v(j,ii)=rand * (Vmax-Vmin)+Vmin;
end
if (x(j,ii)>Xmax) || (x(j,ii)< Xmin)
x(j,ii)=rand * (Xmax-Xmin)+Xmin;
end
end
end
%%%%%%%%%%%%记录历代全局最优值%%%%%%%%%%%%%
gb(i)=gbest;
end
g; %最优个体
gb(end); %最优值
figure
plot(gb)
xlabel('迭代次数');
ylabel('适应度值');
title('适应度进化曲线')
fprintf('最优值为:%f',gb(end));
%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%
function value=func2(x)
value=sum(x.^2-10.*cos(2.*pi.*x)+10);
end
结果:
把算出来的x带入原来的式子中看一下答案是否真的比100小,如果所有的x符合范围条件并且最后的结果也确实是比100小,那么最优值就是80多