带交叉因子的粒子群优化算法MATLAB源程序.docx

上传人:b****9 文档编号:26360557 上传时间:2023-06-18 格式:DOCX 页数:10 大小:16.59KB
下载 相关 举报
带交叉因子的粒子群优化算法MATLAB源程序.docx_第1页
第1页 / 共10页
带交叉因子的粒子群优化算法MATLAB源程序.docx_第2页
第2页 / 共10页
带交叉因子的粒子群优化算法MATLAB源程序.docx_第3页
第3页 / 共10页
带交叉因子的粒子群优化算法MATLAB源程序.docx_第4页
第4页 / 共10页
带交叉因子的粒子群优化算法MATLAB源程序.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

带交叉因子的粒子群优化算法MATLAB源程序.docx

《带交叉因子的粒子群优化算法MATLAB源程序.docx》由会员分享,可在线阅读,更多相关《带交叉因子的粒子群优化算法MATLAB源程序.docx(10页珍藏版)》请在冰豆网上搜索。

带交叉因子的粒子群优化算法MATLAB源程序.docx

带交叉因子的粒子群优化算法MATLAB源程序

带交叉因子的粒子群优化算法matlab源程序(2009-08-2811:

05:

06)

标签:

 

分类:

程序源代码:

其中文件,也就是主程序如下

%-----------------------------------------------

%------名称:

带交叉因子的改进PSO算法

%------功能:

求解多维无约束优化问题

%------特点:

收敛性强,还可以加入变异算子

%------作者:

孙明杰<>

%------单位:

中国矿业大学计算数学硕2005

%------日期:

2006年8月26日

%-----------------------------------------------

%格式标准化

clearall;

clc;

formatlong;

%初始化各个因子

c1=;   %学习因子c1

c2=;   %学习因子c2

w=;    %惯性权重w

N=20;        %粒子群规模

D=6;         %搜索空间维数(本程序适合3维及以上,不能求解1,2维)

eps=10^(-6); %满足条件限制的误差(在不知道最小值时候不用设置)

MaxDT=500;   %粒子群繁殖的代数

%初始化粒子的速度和位置,数据结构用矩阵A表示

fori=1:

N

   forj=1:

2*D

       A(i,j)=rand;

   end

end

fori=1:

N

   forj=2*D+1:

3*D

       A(i,j)=A(i,j-2*D);

   end

end

%计算各个粒子的适应度

fori=1:

N

   A(i,3*D+1)=fitness(A(i,1:

D),D);

end

%对粒子的适应度进行排序

B=sortrows(A,3*D+1);

%排序后适应度低的前面一半粒子直接进入下一代

NextGeneration=zeros(N,3*D+1);

fori=1:

N/2

   forj=1:

3*D+1

       NextGeneration(i,j)=B(i,j);

   end

end

%后一半粒子进行遗传选择和交叉操作

fori=1:

N/2

   forj=1:

3*D+1

       Cross(i,j)=B(i+N/2,j);

   end

end

%产生一个随机的交叉位置

fori=1:

N/4

   Anumber=randperm(D-1);

   ifAnumber

(1)~=1

       position=Anumber

(1);

   else

       position=Anumber

(2);

   end

   %交叉进行

   forj=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

%交叉结束,进行更新

fori=1:

N/2

   Cross(i,3*D+1)=fitness(Cross(i,1:

D),D);

   ifCross(i,3*D+1)

       forj=2*D+1:

3*D

           Cross(i,j)=Cross(i,j-2*D);

       end

   else

       forj=2*D+1:

3*D

           Cross(i,j)=B(i,j);

       end

   end

end

%下面选择最好的粒子N/2个进入下一代

Pool=zeros(N,3*D+1);

fori=1:

N/2

   forj=1:

3*D+1

       Pool(i,j)=B(i+N/2,j);

   end

end

fori=1+N/2:

N

   forj=1:

3*D+1

       Pool(i,j)=Cross(i-N/2,j);

   end

end

%POOLX表示排序后的粒子选择池

PoolX=sortrows(Pool,3*D+1);

fori=1+N/2:

N

   forj=1:

3*D+1

       NextGeneration(i,j)=PoolX(i-N/2,j);

   end

end

Pbest=NextGeneration(i,2*D+1:

3*D);

fori=2:

N

   ifNextGeneration(i,3*D+1)

       Pbest=NextGeneration(i,2*D+1:

3*D);

   end

end

%根据粒子群公式进行迭代(StanderPSOStep)

%速度更新

fori=1:

N

   forj=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));

   end

end

%位置更新

fori=1:

N

   forj=1:

D

       A(i,j)=NextGeneration(i,j)+A(i,j+D);

   end

   A(i,3*D+1)=fitness(A(i,1:

D),D);

   ifA(i,3*D+1)

       forj=2*D+1:

3*D

           A(i,j)=A(i,j-2*D);

       end

   else

       forj=2*D+1:

3*D

           A(i,j)=NextGeneration(i,j-2*D);

       end

   end

end

%下面进入主要循环,循环到最大次数得到最优解和最小值

%DDTime=1;

fortime=1:

MaxDT

   B=sortrows(A,3*D+1);

   NextGeneration=zeros(N,3*D+1);

   fori=1:

N/2

       forj=1:

3*D+1

           NextGeneration(i,j)=B(i,j);

       end

   end

   %遗传选择交叉

   fori=1:

N/2

       forj=1:

3*D+1

           Cross(i,j)=B(i+N/2,j);

       end

   end

   fori=1:

N/4

       Anumber=randperm(D-1);

       ifAnumber

(1)~=1

           position=Anumber

(1);

       else

           position=Anumber

(2);

       end

       

       forj=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

   %交叉结束,进行更新

   fori=1:

N/2

       Cross(i,3*D+1)=fitness(Cross(i,1:

D),D);

       ifCross(i,3*D+1)

           forj=2*D+1:

3*D

               Cross(i,j)=Cross(i,j-2*D);

           end

       else

           forj=2*D+1:

3*D

               Cross(i,j)=B(i,j);

           end

       end

   end

   %下面选择最好的粒子N/2个进入下一代

   Pool=zeros(N,3*D+1);

   fori=1:

N/2

       forj=1:

3*D+1

           Pool(i,j)=B(i+N/2,j);

       end

   end

   fori=1+N/2:

N

       forj=1:

3*D+1

           Pool(i,j)=Cross(i-N/2,j);

       end

   end

   

   PoolX=sortrows(Pool,3*D+1);

   fori=1+N/2:

N

       forj=1:

3*D+1

           NextGeneration(i,j)=PoolX(i-N/2,j);

       end

   end

   Pbest=NextGeneration(i,2*D+1:

3*D);

   fori=2:

N

       ifNextGeneration(i,3*D+1)

           Pbest=NextGeneration(i,2*D+1:

3*D);

       end

   end

   %根据粒子群公式进行迭代

   fori=1:

N

       forj=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));

      end

   end

   

   fori=1:

N

       forj=1:

D

           A(i,j)=NextGeneration(i,j)+A(i,j+D);

       end

       A(i,3*D+1)=fitness(A(i,1:

D),D);

       ifA(i,3*D+1)

           forj=2*D+1:

3*D

               A(i,j)=A(i,j-2*D);

           end

       else

           forj=2*D+1:

3*D

               A(i,j)=NextGeneration(i,j-2*D);

           end

       end

   end

   Pg(time)=fitness(Pbest,D);

   %DDTime=DDTime+1;

   %iffitness(Pbest,D)

       %break;

   %end

end

%算法结束,得到的结果显示如下:

disp('****************************************************')

disp('最后得到的最优位置为:

')

X=Pbest'

disp('得到的函数最小值为:

')

Minimize=fitness(Pbest,D)

disp('****************************************************')

%绘制进化代数和适应度关系曲线图

xx=linspace(1,MaxDT,MaxDT);

yy=Pg(xx);

plot(xx,yy,'b-')

holdon

gridon

title('带交叉因子的粒子群优化算法进化代数与适应度值关系曲线图')

legend('粒子适应度曲线走势')

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿理论经验

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1