%格式标准化
clear all;
format long;
%初始化各个因子
c1=1.4962; %学习因子c1
c2=1.4962; %学习因子c2
w_max=0.9;
w_min=0.4;
N=60; %粒子群规模
D=2; %搜索空间维数(本程序适合3维及以上,不能求解1,2维)
max_velocity=0.6;
eps=10^(-6); %满足条件限制的误差(在不知道最小值时候不用设置)
MaxDT=280; %粒子群繁殖的代数
%初始化粒子的速度和位置,数据结构用矩阵A表示
kmax=1.2;
kmin=0.1;
Bmax=0.6;
Bmin=0.1;
Pmax=[1.2;0.6];
Pmin=[0.1;0.1];
for i=1:N
for j=1:D
A(i,j)=(Pmax(j,:)-Pmin(j,:))*rand()+Pmin(j,:);
end
end
for i=1:N
for j=D+1:2*D
A(i,j)=0.2*rand()-0.1; %设置粒子初始值和速度
end
end
for i=1:N
for j=2*D+1:3*D
A(i,j)=A(i,j-2*D); %局部最优状态值
end
end
%计算各个粒子的适应度
for i=1:N
A(i,3*D+1)=fitness(A(i,1:D),D,Pmax(i,1:D),Pmin(i,1:D));
end
%对粒子的适应度进行排序
B=sortrows(A,3*D+1);
%排序后适应度低的前面一半粒子直接进入下一代
NextGeneration=zeros(N,3*D+1);
for i=1:N/2
for j=1:3*D+1
NextGeneration(i,j)=B(i,j);
end
end
%后一半粒子进行遗传选择和交叉操作
for i=1:N/2
for j=1:3*D+1
Cross(i,j)=B(i+N/2,j);
end
end
%产生一个随机的交叉位置
for i=1:N/4
Anumber=randperm(D-1);
if Anumber(1)~=1
position=Anumber(1);
else
position=Anumber(2);
end
%交叉进行
for j=position:D-1
temp=Cross(i,j);
Cross(i,j)=Cross(N/2-i+1,j);
Cross(N/2-i+1,j)=temp;
end
end
%交叉结束,进行更新
for i=1:N/2
Cross(i,3*D+1)=fitness(Cross(i,1:D),D,Pmax(1:D,:),Pmin(1:D,:));
if Cross(i,3*D+1)<B(i+N/2,3*D+1)
for j=2*D+1:3*D
Cross(i,j)=Cross(i,j-2*D);
end
else
for j=2*D+1:3*D
%Cross(i,j)=B(N/2,j);
Cross(i,j)=B(i,j);
end
end
end
%下面选择最好的粒子N/2个进入下一代
Pool=zeros(N,3*D+1);
for i=1:N/2
for j=1:3*D+1
Pool(i,j)=B(i+N/2,j);
end
end
for i=1+N/2:N
for j=1:3*D+1
Pool(i,j)=Cross(i-N/2,j);
end
end
%POOLX表示排序后的粒子选择池
PoolX=sortrows(Pool,3*D+1);
for i=1+N/2:N
for j=1:3*D+1
NextGeneration(i,j)=PoolX(i-N/2,j);
end
end
Pbest=NextGeneration(i,2*D+1:3*D);
%for i=2:N
for i=1:N-1
if NextGeneration(i,3*D+1)<fitness(Pbest,D,Pmax(1:D,:),Pmin(1:D,1),a(1:D,1:3),bj(1,1:D))
Pbest=NextGeneration(i,2*D+1:3*D);
end
end
%根据粒子群公式进行迭代(Stander PSO Step)
%速度更新
time=0;
w=w_max-time*(w_max-w_min)/MaxDT;
for i=1:N
for j=D+1:2*D
A(i,j)=w*NextGeneration(i,j)+c1*rand*(NextGeneration(i,j+D)-NextGeneration(i,j-D))+c2*rand*(Pbest(j-D)-NextGeneration(i,j-D));
if abs(A(i,j))>max_velocity
if A(i,j)>0
A(i,j)=max_velocity;
else
A(i,j)=-max_velocity;
end
end
end
end
%位置更新
for i=1:N
for j=1:D
A(i,j)=NextGeneration(i,j)+A(i,j+D);
%if abs(A(i,j))>2.048
%A(i,j)=4.096*rand()-2.048;
%end
end
A(i,3*D+1)=fitness(A(i,1:D),D,Pmax(1:D,:),Pmin(1:D,1),a(1:D,1:3),bj(1,1:D));
if A(i,3*D+1)<NextGeneration(i,3*D+1)
for j=2*D+1:3*D
A(i,j)=A(i,j-2*D);
end
else
for j=2*D+1:3*D
A(i,j)=NextGeneration(i,j-2*D);
end
end
end
%下面进入主要循环,循环到最大次数得到最优解和最小值
%DDTime=1;
for time=1:MaxDT
B=sortrows(A,3*D+1);
NextGeneration=zeros(N,3*D+1);
for i=1:N/2
for j=1:3*D+1
NextGeneration(i,j)=B(i,j);
end
end
%遗传选择交叉
for i=1:N/2
for j=1:3*D+1
Cross(i,j)=B(i+N/2,j);
end
end
for i=1:N/4
Anumber=randperm(D-1);
if Anumber(1)~=1
position=Anumber(1);
else
position=Anumber(2);
end
for j=position:D-1
temp=Cross(i,j);
Cross(i,j)=Cross(N/2-i+1,j);
Cross(N/2-i+1,j)=temp;
end
end
%交叉结束,进行更新
for i=1:N/2
Cross(i,3*D+1)=fitness(Cross(i,1:D),D,Pmax(1:D,:),Pmin(1:D,:),a(1:D,1:3),bj(1,1:D));
if Cross(i,3*D+1)<B(i+N/2,3*D+1)
for j=2*D+1:3*D
Cross(i,j)=Cross(i,j-2*D);
end
else
for j=2*D+1:3*D
Cross(i,j)=B(i,j);
end
end
end
%下面选择最好的粒子N/2个进入下一代
Pool=zeros(N,3*D+1);
for i=1:N/2
for j=1:3*D+1
Pool(i,j)=B(i+N/2,j);
%Pool(i,j)=B(i,j);
end
end
for i=1+N/2:N
for j=1:3*D+1
Pool(i,j)=Cross(i-N/2,j);
end
end
PoolX=sortrows(Pool,3*D+1);
for i=1+N/2:N
for j=1:3*D+1
NextGeneration(i,j)=PoolX(i-N/2,j);
end
end
Pbest=NextGeneration(i,2*D+1:3*D);
for i=1:N-1
if NextGeneration(i,3*D+1)<fitness(Pbest,D,Pmax(1:D,:),Pmin(1:D,1),a(1:D,1:3),bj(1,1:D))
Pbest=NextGeneration(i,2*D+1:3*D);
end
end
%根据粒子群公式进行迭代
for i=1:N %粒子速度更新
for j=D+1:2*D
A(i,j)=w*NextGeneration(i,j)+c1*rand*(NextGeneration(i,j+D)-NextGeneration(i,j-D))+c2*rand*(Pbest(j-D)-NextGeneration(i,j-D));
if abs(A(i,j))>max_velocity
if A(i,j)>0
A(i,j)=max_velocity;
else
A(i,j)=-max_velocity;
end
end
end
end
for i=1:N %粒子位置更新
for j=1:D
A(i,j)=NextGeneration(i,j)+A(i,j+D);
end
A(i,3*D+1)=fitness(A(i,1:D),D,Pmax(1:D,:),Pmin(1:D,1),a(1:D,1:3),bj(1,1:D));
if A(i,3*D+1)<NextGeneration(i,3*D+1)
for j=2*D+1:3*D
A(i,j)=A(i,j-2*D);
end
else
for j=2*D+1:3*D
A(i,j)=NextGeneration(i,j-2*D);
end
end
end
w=w_max-time*(w_max-w_min)/MaxDT;
Pg(time)=fitness(Pbest,D,Pmax(1:D,:),Pmin(1:D,1),a(1:D,1:3),bj(1,1:D));
%DDTime=DDTime+1;
%if fitness(Pbest,D)<eps
%break;
%end
end
%算法结束,得到的结果显示如下:
disp('****************************************************')
disp('最后得到机组提供的最优容量为:')
Pbest
disp('机组的实际出力:')
for i=1:D
X(i)=Pbest(1,i)*bj(1,i);
end
X
disp('得到的函数最小值为:')
Minimize=object(Pbest,D,a(1:D,1:3),bj(1,1:D))
disp('****************************************************')
%绘制进化代数和适应度关系曲线图
xx=linspace(1,MaxDT,MaxDT);
yy=Pg(xx);
plot(xx,yy,'b-')
hold on
grid on
title('带交叉因子的粒子群优化算法进化代数与适应度值关系曲线图')
legend('粒子适应度曲线走势')
%------算法结束---DreamSun GL & HF-------------------------