24小时热门版块排行榜    

查看: 438  |  回复: 0

neos_leung

新虫 (初入文坛)

[求助] 期刊文章《基于空间缩放和吸引子的粒子群优化算法》的算法实现问题

文章来源  《计算机学报》 第34卷 第1期 2011年1月
《基于空间缩放和吸引子的粒子群优化算法》

具体问题是这样的。
我按照文章的算法用matlab编程语言实现了SzAPSO算法,但是在使用CEC2005的测试函数的时候算法的性能很低,收敛速度过快无法有效地进行全局搜索,在2维以上算法可以说是已经很难找到最优解了。
然后我自己实现了CEC2005的第一个sphere和第二个schwefel函数,实现的算法马上就体现出来比经典粒子群算法高效很多的性能。
所以我想问CEC2005提供的测试函数的实现代码是不是有什么特别,因为我之前实现的经典PSO算法在调用benchmark_func函数的时候并没有这样的问题,但是在我自己写的测试函数上测试的时候SzAPSO明显比经典的PSO算法有优越很多的性能。

SzAPSO_FR.m文件是算法的主程序
SzAPSO.m是算法的实现函数,在这个函数里面再再调用benchmark_func测试函数和我自己写的函数
schwefel_PSO.m是我自己写的函数,直接替换SzAPSO.m调用的测试函数名就可以使用了。
matlab-files.zip是CEC2005附的测试函数matlab实现代码

期刊文章《基于空间缩放和吸引子的粒子群优化算法》的算法实现问题

算法主程序
SzAPSO_FR.m
CODE:
clear all;
clc;
format short;

D=30;
P=15;
iter_max=5000;
Xmin=-100;
Xmax=100;
func_num=2;     
pop=rand(P,D)*200-100;
pop_val=ones(1,P);
global initial_flag
initial_flag=0;

SzAPSO(pop,pop_val,D,P,iter_max,Xmin,Xmax,func_num);

算法实现函数
SzAPSO.m
CODE:
function [Pg_val,Pg,fitcount] = SzAPSO(pop,  pop_val, D, P,     iter_max, Xmin,  Xmax,  func_num)
                                       %粒子 适应值   维 粒子数 最大迭代  最小值 最大值 函数代号

popbest = pop;  %记录局部最优解
Pg = pop(1,:);
Pg_val = benchmark_func(pop(1,:), func_num);

for i = 1:P                         %初始化粒子最优和全局最优
    pop_val(i) = benchmark_func(pop(i,:), func_num);
    if pop_val(i) < Pg_val
        Pg_val = pop_val(i);
        Pg = pop(i,:);
        end
end

fitcount = 0;
k = 100;

while fitcount<iter_max
    z = k * rand;
    for i = 1:P
        if abs(pop_val(i)-Pg_val) < 1e-6               %判断粒子是不是最优,计算吸引子Pa
            Pa = Pg * (rand+0.5) + (rand*2-1);          %围绕全局最优抖动
        else
            Pa = popbest(i)+(Pg-popbest(i)) * rand;     %局部最优和全局最优加权平均
        end
        
        for j = 1:D
            if Pa(j) > Xmax
                Pa(j) = Xmax;
                if pop(i,j) > Pa(j)
                    pop(i,j) = Xmax;
                else
                    pop(i,j) = update(pop(i,j),Pa(j),z);
                end
            elseif Pa(j) < Xmin
                Pa(j) = Xmin;
                if pop(i,j) < Pa(j)
                    pop(i,j) = Xmin;
                else
                    pop(i,j) = update(pop(i,j),Pa(j),z);
                end
            else
                pop(i,j) = update(pop(i,j),Pa(j),z);
            end
        end
        
        pop_val(i) = benchmark_func(pop(i,:), func_num);        %更新全局最优
        
        if pop_val(i) < benchmark_func(popbest(i), func_num)  %更新局部最优
            popbest(i) = pop(i);
        end
        
        if pop_val(i) < Pg_val      %更新全局最优
            Pg_val = pop_val(i);
            Pg = pop(i,:);
        end
        
    end

    fprintf('%f ,  %d\n\n',Pg_val,fitcount);
    if Pg_val<1e-6      %满足精度结束
        break;
    end
    fitcount = fitcount + 1;
%       if fitcount == 1000
%          keyboard;
%       end
end

disp('************************function*****************************');
disp(func_num);
disp('The best result is:')
disp(Pg_val);
disp(fitcount);
disp('*************************************************************');
keyboard;
clear all;
end

function num = update(Xid,Pa,z)     %更新后会有超界的情况(但是取模后在加上Pa应该是一定在取值空间内才对)

if Xid < Pa
    num = mod((Xid-Pa),((Pa - -100)*z))/z+Pa;
else
    num = mod((Xid-Pa),((Pa * -1 +100)*z))/z+Pa;
end

end

我自己另外写的测试函数,就是matlab里面的schwefel函数,功能一样(把算法实现函数里的benchmark_func替换成schwefel_PSO就可以调用)
schwefel_PSO.m
CODE:
function num = schwefel_PSO(pop,b)

num = 0;
a = length(pop);
temp(a) = 0;
for i = 1:a
    for j = 1:i
        temp(i) = temp(i) + pop(j);
    end
    num = num + temp(i)^2;
end

end

回复此楼

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : 基于空间缩放和吸引子的粒子群优化算法.pdf
  • 2014-10-12 16:36:10, 4.93 M
  • 附件 2 : matlab-files.zip
  • 2014-10-12 17:07:36, 1.58 M

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 neos_leung 的主题更新
信息提示
请填处理意见