clear all
close all
%G为迭代次数,n为个体长度(包括12个参数),m为总群规模
%w,c1,c2为粒子群算法中的参数
G =700;
n = 12;%个体长度,一个粒子的长度
m = 20;
w = 0.1;%惯性权重
c1 = 2;
c2 = 2;
%设置粒子的最小位置与最大位置
for i = 1:3
MinX(i) = 0.1*ones(1);
MaxX(i) = 3*ones(1);
end
for i = 4:1:9
MinX(i) = -3*ones(1);
MaxX(i) = 3*ones(1);
end
for i = 10:1:12
MinX(i) = -ones(1);
MaxX(i) = ones(1);
end
%产生初始粒子位置
pop = rands(m,n);%m:20个粒子。n:每个粒子可以设置12个值
for i = 1:m%对超过范围的粒子,进行处理
for j = 1:3
if pop(i,j) < MinX(j)
pop(i,j) = MinX(j);
end
if pop(i,j) > MaxX(j)
pop(i,j) = MaxX(j);
end
end
for j = 4:9
if pop(i,j) < MinX(j)
pop(i,j) = MinX(j);
end
if pop(i,j) > MaxX(j)
pop(i,j) = MaxX(j);
end
end
for j = 10:12
if pop(i,j) < MinX(j)
pop(i,j) = MinX(j);
end
if pop(i,j) > MaxX(j)
pop(i,j) = MaxX(j);
end
end
end
%初始化速度
V = 0.1*rands(m,n);%20行12列,每个粒子的每个值设置一个初始的速度,0,1为惯性权重
BsJ = 0; %误差的和,函数的返回值,值越小,说明得到的权值效果越好。即适应度值,适应度函数为神经网络输出与期望输出的差值的总和
%根据初始化的种群计算个体好坏,找出群体最优和个体最优
for s = 1:m%粒子群规模
indivi = pop(s,:);%取一个粒子,为一个行向量
[indivi,BsJ] = chap10_3b(indivi,BsJ);%调用
Error(s) = BsJ;%将次粒子的误差和赋值
end
[OderEr,IndexEr] = sort(Error);%将Error数组按升序排列
Error;
Errorleast = OderEr(1);%将最小值赋值
for i = 1:m%种群规模
if Errorleast == Error(i)
gbest = pop(i,:);%将第i个粒子赋值给gbest,即全局最优位置
break;
end
end
ibest = pop;%个体极值
for kg = 1:G%迭代次数
kg
for s = 1:m;%种群规模
%个体有4%的变异概率
for j = 1:n%粒子长度
for i = 1:m%种群规模,变异是针对某个粒子的某一个值的变异
if rand(1)<0.04
pop(i,j) = rands(1);
end
end
end
%r1,r2为粒子群算法参数
r1 = rand(1);%产生一个0-1之间的随机数
r2 = rand(1);
%个体和速度更新
V(s,:) = w*V(s,:) + c1*r1*(ibest(s,:)-pop(s,:)) + c2*r2*(gbest-pop(s,:));%w为惯性权重
pop(s,:) = pop(s,:) + 0.3*V(s,:);%有些地方加速度那里的03也为0.5,感觉像乘以时间
%对更新的位置进行判断,超过设定的范围就处理下。粒子中不同的值对应不同的范围
for j = 1:3
if pop(s,j) < MinX(j)
pop(s,j) = MinX(j);
end
if pop(s,j) > MaxX(j)
pop(s,j) = MaxX(j);
end
end
for j = 4:9
if pop(s,j) < MinX(j)
pop(s,j) = MinX(j);
end
if pop(s,j) > MaxX(j)
pop(s,j) = MaxX(j);
end
end
for j = 10:12
if pop(s,j) < MinX(j)
pop(s,j) = MinX(j);
end
if pop(s,j) > MaxX(j)
pop(s,j) = MaxX(j);
end
end
%求更新后的每个个体适应度值
[pop(s,:),BsJ] = chap10_3b(pop(s,:),BsJ);%输入为当前的粒子与上一个粒子对应的适应度值。输出为当前的粒子与当前粒子对应的适应度值
error(s) = BsJ;%将当前粒子对应的适应度值赋值给误差数组
%根据适应度值对个体最优和群体最优进行更新
if error(s)<Error(s)
ibest(s,:) = pop(s,:);
Error(s) = error(s);
end
if error(s)<Errorleast
gbest = pop(s,:);
Errorleast = error(s);
end
end
Best(kg) = Errorleast;
end
plot(Best);
save pfile1 gbest;