使用粒子群算法求取适应度函数的最小值(适应度函数值最小为零)
使用粒子群算法求取适应度函数的最小值(适应度函数值最小为零),出现的图像是一条在0值的直线,问题出现在哪里?
% author zhaoyuqiang
clear all ;
close all ;
clc ;
N = 40 ; %种群规模
D = 2 ; % 粒子维度
T = 50 ; %迭代次数
Xmax = 1 ;
Xmin = 0 ;
C1 = 1.5 ; %学习因子1
C2 = 1.5 ; %学习因子2
W = 0.8 ; %惯性权重
Vmax = 1 ; %最大飞行速度
Vmin = -1 ; %最小飞行速度
popx = rand(N,D)*(Xmax-Xmin)+Xmin ; % 初始化粒子群的位置(粒子位置是一个D维向量)
% OO=popx
popv = rand(N,D)*(Vmax-Vmin)+Vmin ; % 初始化粒子群的速度(粒子速度是一个D维度向量)
%初始化每个历史最优粒子
pBest = popx;
pBestValue =func_objValue(pBest) ;
%初始化全局历史最优粒子
[gBestValue,index] = min(func_objValue(popx)) ;
gBest = popx(index,:) ;
for t=1:T
for i=1:N
% 更新个体的位置和速度
popv(i,:) = W*popv(i,:)+C1*rand*(pBest(i,:)-popx(i,:))+C2*rand*(gBest-popx(i,:));
popv(i,find(popv(i,:)>Vmax))=Vmax;
popv(i,find(popv(i,:)<Vmin))=Vmin;
popx(i,:) = popx(i,:)+0.5*popv(i,:);
popx(i,find(popx(i,:)>Vmax))=Xmax;
popx(i,find(popx(i,:)<Vmin))=Xmin;
% 边界处理,超过定义域范围就取该范围极值
% index = find(popv(i,:)>Vmax | popv(i,:)<Vmin);
% popv(i,index) = rand*(Vmax-Vmin)+Vmin ; %#ok<*FNDSB>
% index = find(popx(i,:)>Xmax | popx(i,:)<Xmin);
% popx(i,index) = rand*(Xmax-Xmin)+Xmin ;
%新粒子适应度
pBestValue(i)=func_objValue(popx(i,:));
% 更新粒子历史最优
if func_objValue(popx(i,:))<pBestValue(i)
pBest(i,:) = popx(i,:) ;
pBestValue(i) = func_objValue(popx(i,:));
else
if pBestValue(i)<gBestValue
gBest = pBest(i,:) ;
gBestValue = pBestValue(i) ;
end
end
end
% 每代最优解对应的目标函数值
tBest(t) = func_objValue(gBest); %#ok<*SAGROW>
end
figure
plot(tBest);
xlabel('迭代次数') ;
ylabel('适应度值') ;
title('适应度进化曲线');