樽海鞘算法


  樽海鞘是一種透明的桶狀生物,和水母比較相似。它通過吸水、噴水來移動的。由於它生活在寒帶的深海里面,給我們的研究造成了一定的困擾。但是,這並不影響我們對它的研究。在深海里,樽海鞘是以樽海鞘鏈的形式存在,這就是我們感興趣的群體行為之一。

  首先,我們將樽海鞘鏈分為兩組:1、領導者;2、追隨者。

  領導者就是樽海鞘鏈前端的部分;追隨者就是樽海鞘鏈后端的部分。

  首先,領導者的位置跟新公式:

  

 

  最后,更新追隨者位置

  為了不誤導大家,我給直接給出結果

  

clc;
clear all;
close all;
%%  問題定義

CostFunction = @(x) sphere(x);  %  目標函數

nVar = 5;                       %  變量的維數

VarSize = [1,nVar];             %  變量的矩陣大小

VarMin = -10;                   %  變量的下確界
VarMax =  10;                   %  變量的上確界

%%  SSA參數

MaxIt = 1000;            % 最大迭代次數

nPop = 50;               % 種群大小

%%  初始化

% 樽海鞘模板
empty_slaps.Position = [];
empty_slaps.Cost = [];
empty_slaps.Best.Position = [];
empty_slaps.Best.Cost = [];

% 創建種群數組
slaps = repmat(empty_slaps,nPop,1);

% 初始化食物的適應度
Food.Cost = inf;

% 初始化種群
for i=1:nPop
    
    % 生成隨機解
    slaps(i).Position = unifrnd(VarMin,VarMax,VarSize);
    
    % 評價
    slaps(i).Cost = CostFunction(slaps(i).Position);
    
    % 更新最優個體 
    slaps(i).Best.Position = slaps(i).Position;
    slaps(i).Best.Cost = slaps(i).Cost;
    
    % 更新食物的位置
    if slaps(i).Best.Cost < Food.Cost
       Food = slaps(i).Best;
    end
        
end

BestCosts = zeros(MaxIt,1);

%%  SSA算法的主程序

it = 1;
while it < MaxIt+1
    

    
    c1 = 2*exp(-(4*it/MaxIt)^2);               % 設置參數
    
    for i=1:nPop
        
        if i <= nPop/2
            c2=rand();
            c3=rand();
            %%%%%%%%%%%%% % Eq. (3.1) in the paper %%%%%%%%%%%%%%
            if c3<0.5 
                slaps(i).Position =Food.Position + c1*((VarMax - VarMin)*c2 + VarMin);
            else
                slaps(i).Position =Food.Position - c1*((VarMax - VarMin)*c2 + VarMin);
            end
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        elseif i > nPop/2 && i < nPop+1
            
            point1 = slaps(i-1).Position;
            point2 = slaps(i).Position;
            
            slaps(i).Position = (point2 + point1)/2;
        end
        
    end
    
    for i=1:nPop
        
        slaps(i).Position = max(slaps(i).Position,VarMin);
        
        slaps(i).Position = min(slaps(i).Position,VarMax);
        
        slaps(i).Cost = CostFunction(slaps(i).Position);            %  計算每個體的適應度值
        
        if slaps(i).Cost < slaps(i).Best.Cost
            
            slaps(i).Best.Position = slaps(i).Position;
            slaps(i).Best.Cost = slaps(i).Cost;
            
            if slaps(i).Best.Cost < Food.Cost
                
                Food = slaps(i).Best;
                
            end 
            
        end        
        
        
    end
    
    BestCosts(it) = Food.Cost;
    
    disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCosts(it))]);
   
    it = it + 1;
end

%%  Results

figure;
% plot(BestCosts,'LineWidth',2);
semilogy(BestCosts,'LineWidth',2);
xlabel('Iterations');
ylabel('Best Cost');
grid on;
function z = sphere(x)
%%  目標函數
    z = sum(x.^2);
end

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM