本站首页    管理页面    写新日志    退出


[算法]带交叉因子的粒子群优化算法matlab源程序
sunshine 发表于 2007/11/20 20:04:56

带交叉因子的粒子群优化算法matlab源程序 大明 发表于 2006-8-26 17:04:00       程序源代码:其中PSOGA.m文件,也就是主程序如下 %-----------------------------------------------%------名称:带交叉因子的改进PSO算法%------功能:求解多维无约束优化问题%------特点:收敛性强,还可以加入变异算子%------作者:孙明杰 <dreamsun2001@126.com>%------单位:中国矿业大学计算数学硕2005%------日期:2006年8月26日%----------------------------------------------- %格式标准化clear all;clc;format long;%初始化各个因子c1=1.4962;    %学习因子c1c2=1.4962;    %学习因子c2w=0.7298;     %惯性权重wN=20;         %粒子群规模D=6;          %搜索空间维数(本程序适合3维及以上,不能求解1,2维)eps=10^(-6);  %满足条件限制的误差(在不知道最小值时候不用设置)MaxDT=500;    %粒子群繁殖的代数 %初始化粒子的速度和位置,数据结构用矩阵A表示for i=1:N    for j=1:2*D        A(i,j)=rand;    endendfor i=1:N    for j=2*D+1:3*D        A(i,j)=A(i,j-2*D);    endend%计算各个粒子的适应度for i=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);for i=1:N/2    for j=1:3*D+1        NextGeneration(i,j)=B(i,j);    endend%后一半粒子进行遗传选择和交叉操作for i=1:N/2    for j=1:3*D+1        Cross(i,j)=B(i+N/2,j);    endend%产生一个随机的交叉位置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;    endend%交叉结束,进行更新for i=1:N/2    Cross(i,3*D+1)=fitness(Cross(i,1:D),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    endend%下面选择最好的粒子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);    endendfor i=1+N/2:N    for j=1:3*D+1        Pool(i,j)=Cross(i-N/2,j);    endend%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);    endendPbest=NextGeneration(i,2*D+1:3*D);for i=2:N    if NextGeneration(i,3*D+1)<fitness(Pbest,D)        Pbest=NextGeneration(i,2*D+1:3*D);    endend%根据粒子群公式进行迭代(Stander PSO Step)%速度更新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));    endend%位置更新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);    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    endend%下面进入主要循环,循环到最大次数得到最优解和最小值%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);        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);        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=2:N        if NextGeneration(i,3*D+1)<fitness(Pbest,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));       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);        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    Pg(time)=fitness(Pbest,D);    %DDTime=DDTime+1;    %if fitness(Pbest,D)<eps        %break;    %endend%算法结束,得到的结果显示如下:disp('****************************************************')disp('最后得到的最优位置为:')X=Pbest'disp('得到的函数最小值为:')Minimize=fitness(Pbest,D)disp('****************************************************')%绘制进化代数和适应度关系曲线图xx=linspace(1,MaxDT,MaxDT);yy=Pg(xx);plot(xx,yy,'b-')hold ongrid ontitle('带交叉因子的粒子群优化算法进化代数与适应度值关系曲线图')legend('粒子适应度曲线走势')%------算法结束---DreamSun GL & HF-------------------------

阅读全文(7756) | 回复(9) | 编辑 | 精华

回复:带交叉因子的粒子群优化算法matlab源程序
tingting(游客)发表评论于2009/3/31 9:33:54

大哥太感谢你了

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:带交叉因子的粒子群优化算法matlab源程序
SDD(游客)发表评论于2009/2/27 15:28:48

哪位大哥传个基本粒子群优化算法 luckzheng86@163.com
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:带交叉因子的粒子群优化算法matlab源程序
浪(游客)发表评论于2008/12/17 16:21:13

下了,非常感谢! 现在正在研究交叉,变异,模拟退火思想在一起的混合粒子群算法. 能给指点指点吗! 谢谢!QQ:695562181
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:带交叉因子的粒子群优化算法matlab源程序
shelly(游客)发表评论于2008/11/28 9:43:03

再谢!!!
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:带交叉因子的粒子群优化算法matlab源程序
慢慢(游客)发表评论于2008/10/21 13:09:39

呵呵,哥们果然厉害,我计算机基础太差,最近想研究下支持向量机参数优化的问题,有机会大家探讨一下,我的qq:410513582:)
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:带交叉因子的粒子群优化算法matlab源程序
1021398(游客)发表评论于2008/6/24 11:36:55

大哥太厉害了! 人中之龙啊
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:带交叉因子的粒子群优化算法matlab源程序
Inzaghi0514(游客)发表评论于2008/3/21 16:09:16

谢谢楼主,正在研究,看先!帮助挺大……
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:带交叉因子的粒子群优化算法matlab源程序
dangdang (游客)发表评论于2008/3/10 10:32:05

呵呵,谢谢楼主,我正在学习,先研究一下
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:带交叉因子的粒子群优化算法matlab源程序
minmin(游客)发表评论于2008/3/9 10:45:12

真好啊,太厉害了,我也做粒子群相关的东东,但是我一点程序都不会,郁闷啊。
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

 
«September 2025»
123456
78910111213
14151617181920
21222324252627
282930

  公告

有一种鸟儿是永远关不住的
因为它的每片羽翼上都沾满了自由的光辉

方向:计算机视觉 人工智能 演化算法

 


  我的分类(专题)
  最近日志

  最新评论

  留言板

  链接

  Blog信息
blog名称:阳光海岸心
日志总数:166
评论数量:237
留言数量:-4
访问次数:1455683
建立时间:2006年6月2日



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.051 second(s), page refreshed 144763467 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号