• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

你想要的CSO算法matlab实现

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

算法思想


与其他PSO的关键区别:

  1. 没有pbest和gbest,由竞争机制驱动粒子更新。
  2. 不需要记住历史优秀粒子的位置,只学习当前粒子群中的winner粒子。

算法流程

算法细节:

  1. n(n为偶数)个粒子构成的种群,构成n/2个竞争对。

  2. 成对竞争的粒子中,Fitness高者为Winner,低者为Loser。

  3. Loser的velocity更新策略:
    包括:stability component、cognitive component、social component

  4. position更新策略:

  5. Xmean可以是整个种群的平均位置也可以是预定义的领域中局部粒子平均位置。

Matlab代码

clc;
clear;

%参数设置
Vnum = 1;
N = 50;
XBound = [0 20];
VBound = [-1 1];
iterations = 100;
lambda = 0;

%初始粒子群

P = initializeParticles(N,Vnum,XBound,VBound);
newP = zeros(N,2*Vnum);

%初始评估
[Fitness] = EvaluatePartical(P(:,1:Vnum),1);

%初始种群
figure
x=linspace(0,20,1000);
y=x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x);
plot(x,y);
hold on 
x = P(:,1:Vnum);
y = Fitness;
plot(x,y,\'ro\');
hold off

for i = 1:iterations
    %随机构建竞争对
    index = randperm(N);
    P = P(index,:);Fitness = Fitness(index);
    Xmean = Cal_Xmean(P(:,1:Vnum));
    %竞争
    for j = 1:2:N-1
        F1 = Fitness(j);
        F2 = Fitness(j+1); 
        if(F1>=F2)
            Pwin = P(j,:);
            Plose = P(j+1,:);
        else
            Pwin = P(j+1,:);
            Plose = P(j,:);
        end
        newP(j,:) = Pwin;
        %更新Xlose
        Plose = UpdateVandP(Plose,Pwin(1:Vnum),Xmean,Vnum,lambda,XBound,VBound);
        newP(j+1,:) = Plose;
    end
    P = newP;
    [Fitness] = EvaluatePartical(P(:,1:Vnum),1);
end

[~,index] = max(Fitness);
disp(P(index,1:Vnum));
%末代
figure
x=linspace(0,20,1000);
y=x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x);
plot(x,y);
hold on 
X = P(:,1:Vnum);
Y = X .* sin(X) .* cos(2 * X) - 2 * X .* sin(3 * X);
plot(X,Y,\'ro\');
hold off

function [pop] = initializeParticles(N,Vnum,XBound,VBound)
%INITIALIZEPARTICLES 初始种群函数
    X = rand(N,Vnum)*(XBound(2)-XBound(1))+XBound(1);
    V = rand(N,Vnum)*(VBound(2)-VBound(1))+VBound(1);
    pop = [X V];
end

function [Fitness] = EvaluatePartical(X,type)
%EVALUATEPARTICAL 评估粒子函数
    f = @(x)x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x);
    if type == 1
        [N] = size(X,1);
        Fitness = zeros(N,1);

        for i = 1:N
            x = X(i,:);
            Fitness(i) = f(x); 
        end
        
    elseif type==2
        Fitness = f(X);
    end
end

function [newP] = UpdateVandP(Plose,Xwin,Xmean,Vnum,lambda,XBound,VBound)
%UPDATEVANDP 更新粒子函数
      Xmax = zeros(1,Vnum) + XBound(2);
      Xmin = zeros(1,Vnum) + XBound(1);
      Vmax = zeros(1,Vnum) + VBound(2);
      Vmin = zeros(1,Vnum) + VBound(1);
      
      Xlose = Plose(1:Vnum);Vlose = Plose(Vnum+1:2*Vnum);
      r = rand(3,Vnum);
      Vlose = r(1).*Vlose+r(2).*(Xwin-Xlose)+lambda*r(3).*(Xmean-Xlose);
      
      Vlose(Vlose>Vmax) = Vmax(Vlose>Vmax);
      Vlose(Vlose<Vmin) = Vmin(Vlose<Vmin);
      
      Xlose = Xlose + Vlose;
      
      Xlose(Xlose>Xmax) = Xmax(Xlose>Xmax);
      Xlose(Xlose<Xmin) = Xmin(Xlose<Xmin);
      newP = [Xlose Vlose];      
end

function [Xmean] = Cal_Xmean(X)
%CAL_XMEAN 计算Xmean 
    Xmean = mean(X,1);
end

实验结果

测试问题:f = xsin(x)cos(2x)-2xsin(3x)在[0,20]上的最大值。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[转]HowtosetthecontrolwordofFPUindelphi发布时间:2022-07-18
下一篇:
Delphi记录类型-结构指针发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap