Halcom 发表于 2017-2-4 20:50:18

19人工蜂群算法ABC函数优化--视频分享

19人工蜂群算法ABC函数优化:百度网盘链接:
链接:http://pan.baidu.com/s/1ge8nCVT 密码:5h8n
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1
ABC算法的实现步骤,具体过程如下:Step1:随机产生CSN(蜂群规模)个初始解,将其中一半与采蜜蜂对应,并计算各个解的适应度值,将最优解记录下来;Step2:置Cycle=1;Step3:采蜜蜂进行邻域搜索产生新解;Step4:计算相关的选择概率;Step5:观察蜂根据轮盘赌选择法以概率选择食物源,并进行邻域搜索产生新解 ,计算适应度值;Step6:判断是否有要放弃的解,如果存在,则进行随机搜索产生一个新解替换旧解;Step7:记录迄今为止最好的解;Step8:Cycle = Cycle +1,若Cycle<MCN,则转Step3;否则,输出最优结果。蜜蜂执行搜索活动的过程可概括为:(1)采蜜蜂确定蜜源,对其进行开采并记忆蜜源的相关信息,与观察蜂共同分享它们所开采的蜜源的相关信息;(2)观察蜂以一定的选择策略在邻近的蜜源里选择蜜源;(3)被放弃的蜜源处的采蜜蜂转变为侦察蜂,并且开始随机搜索新的蜜源。
人工蜂群算法ABC函数优化PDF文档如下:链接:http://pan.baidu.com/s/1qXQmiVq 密码:8tak
具体的代码如下:% 人工蜂群算法
clc,clear,close all
warning off
feature jit off
tic
% 算法参数
NP=20;                                 % 蜂群大小
FoodNumber=NP/2;               % 蜂群食物源数量,也就是产生 解 的个数
limit=100;       % 经过“limit”次采蜜蜂和观察蜂的循环搜索之后,不能够被改进,那么该位置将被放弃
maxCycle=500;                            % 最大迭代循环

%/* Problem specific variables*/
objfun='Sphere';                     % 待优化函数
D=100;                               % 未知数为100个
ub=ones(1,D)*100;                  % 未知量取值下边界
lb=ones(1,D)*(-100);               % 未知量取值上边界
runtime=1;                           % 算法运行次数,一般设置1即可

GlobalMins=zeros(1,runtime);   % 适应度最小值初始化

for r=1:runtime

% 初始化变量值
Range = repmat((ub-lb),);       % 最大值
Lower = repmat(lb, );         % 最小值
Foods = rand(FoodNumber,D) .* Range + Lower;% 初始化个体

ObjVal=feval(objfun,Foods);                                       % 目标函数值
Fitness=calculateFitness(ObjVal);                                 % 适应度值,取其导数,为最小值

% 设定拖尾矩阵,初始化
trial=zeros(1,FoodNumber);

% 找到最好的食物源
BestInd=find(ObjVal==min(ObjVal));
BestInd=BestInd(end);
GlobalMin=ObjVal(BestInd);                           % 函数值最小
GlobalParams=Foods(BestInd,:);                         % 相应的食物源个体

iter=1;
while ((iter <= maxCycle)),% 迭代开始

% 采蜜蜂
    for i=1:(FoodNumber)
      % 参数随机可变
      Param2Change=fix(rand*D)+1;
      % 随机选择相连个体
      neighbour=fix(rand*(FoodNumber))+1;
      % 随机选择的个体不等于i
      while(neighbour==i)
            neighbour=fix(rand*(FoodNumber))+1;
      end;
      
       sol=Foods(i,:);% 个体选择
       %/*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
       sol(Param2Change)=Foods(i,Param2Change)+(Foods(i,Param2Change)-Foods(neighbour,Param2Change))*(rand-0.5)*2;
      
       % 个体取值范围约束
      ind=find(sol<lb);                                 % 最小值约束
      sol(ind)=lb(ind);
      ind=find(sol>ub);                         % 最大值约束
      sol(ind)=ub(ind);
      
      % 估计新的目标函数值和适应度值
      ObjValSol=feval(objfun,sol);
      FitnessSol=calculateFitness(ObjValSol);
      
       % 更新最优个体值
       if (FitnessSol>Fitness(i))               % 如果新产生的个体值适应度值越大,则表明函数值越小,则个体最优
            Foods(i,:)=sol;
            Fitness(i)=FitnessSol;
            ObjVal(i)=ObjValSol;
            trial(i)=0;
      else
            trial(i)=trial(i)+1; % /*if the solution i can not be improved, increase its trial counter*/
       end;
    end;
   
% 观察蜂
% 计算概率
% 观察蜂根据与蜜源相关的概率值选择蜜源,概率值计算公式
% prob(i)=a*fitness(i)/max(fitness)+b*/
prob=(0.9.*Fitness./max(Fitness))+0.1;
i=1;
t=0;
while(t<FoodNumber)
    if(rand<prob(i))
      t=t+1;
      % 继续随机选择个体
      Param2Change=fix(rand*D)+1;
      % 随机选择相连个体
      neighbour=fix(rand*(FoodNumber))+1;
      % 随机选择的个体不等于i      
      while(neighbour==i)
            neighbour=fix(rand*(FoodNumber))+1;
      end;
       sol=Foods(i,:);                                  % 个体选择
       %/*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
       sol(Param2Change)=Foods(i,Param2Change)+(Foods(i,Param2Change)-Foods(neighbour,Param2Change))*(rand-0.5)*2;
      
       % 个体取值范围约束
       ind=find(sol<lb);                                 % 最小值约束
       sol(ind)=lb(ind);
       ind=find(sol>ub);                                 % 最大值约束
       sol(ind)=ub(ind);
      
       % 估计新的目标函数值和适应度值
       ObjValSol=feval(objfun,sol);
       FitnessSol=calculateFitness(ObjValSol);
      
       % 更新最优个体值
       if (FitnessSol>Fitness(i))               %如果新产生的个体值适应度值越大,则表明函数值越小,则个体最优
            Foods(i,:)=sol;
            Fitness(i)=FitnessSol;
            ObjVal(i)=ObjValSol;
            trial(i)=0;
      else
            trial(i)=trial(i)+1; % /*if the solution i can not be improved, increase its trial counter*/
       end;
    end;
   
    i=i+1;
    if (i==(FoodNumber)+1)
      i=1;
    end;   
end;

    % 记录最好的目标函数值
    ind=find(ObjVal==min(ObjVal));
    ind=ind(end);
    if (ObjVal(ind)<GlobalMin)
      GlobalMin=ObjVal(ind);                      % 最优目标函数值
      GlobalParams=Foods(ind,:);                  % 最优个体
    end;
         
% 侦察蜂
% 如果某一次循环拖尾次数大于设定limit,则重新更新个体,重新计算
ind=find(trial==max(trial));
ind=ind(end);
if (trial(ind)>limit)
    Bas(ind)=0;
    sol=(ub-lb).*rand(1,D)+lb;
    ObjValSol=feval(objfun,sol);
    FitnessSol=calculateFitness(ObjValSol);
    Foods(ind,:)=sol;
    Fitness(ind)=FitnessSol;
    ObjVal(ind)=ObjValSol;
end;

fprintf('iter=%d ObjVal=%g\n',iter,GlobalMin);
iter=iter+1;

end % End of ABC

GlobalMins(r)=GlobalMin;
end; % end of runs
toc
% save all
disp('最优解为:')
GlobalParams
disp('最优目标函数值为:')
GlobalMin简化的代码如下:% 人工蜂群算法函数寻优
% ABC算法
clc,clear,close all
warning off
format longG

% ABC 参数初始化
maxiter = 20;% 迭代次数
sizepop = 10;% 种群数量
popmin1 = -1;popmax1 = 1; % x1
popmin2 = -1;popmax2 = 1; % x2
trail(1:sizepop,1) = 0;   % 未找到更优解的迭代次数
limit = sizepop;            % 拖尾最大次数

% 初始化种群
for i=1:sizepop
    x1 = popmin1+(popmax1-popmin1)*rand;
    x2 = popmin2+(popmax2-popmin2)*rand;
    pop(i,:) = ;
    fitness(i) = fun();% 适应度函数值--目标函数值--最小目标函数值
end

% 记录一组最优值
=min(fitness);
zbest=pop(bestindex,:);   %全局最佳
fitnesszbest=bestfitness; %全局最佳适应度值

% 迭代寻优
for i=1:maxiter
   
    % 采蜜峰开始工作
    for j=1:sizepop
      % 选择采蜜的个体
      x2y = randi(2);   % 两个未知数
      % 选择相连的种群
      neighbour = randi(sizepop);
      % neighbour != j
      while( neighbour==j)
            neighbour = randi(sizepop);
      end
      
      % 种群更新(解)
      tempx = pop(j,:);% 当前的解
      tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*(rand-0.5)*2;
%         tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*rand;
      
      % x1越界限制
      if tempx(1)>popmax1
            tempx(1)=popmax1;
      end
      if tempx(1)<popmin1
            tempx(1)=popmin1;
      end
      % x2越界限制
      if tempx(2)>popmax2
            tempx(2)=popmax2;
      end
      if tempx(2)<popmin2
            tempx(2)=popmin2;
      end
      
      % 适应度更新
      temp_fitness = fun( tempx );% 当前的适应度函数值--目标函数值--最小目标函数值
      % 比较个体间比较
      if temp_fitness<fitness(j)
            fitness(j) = temp_fitness;
            pop(j,:) = tempx;
      end
      if temp_fitness<bestfitness
            bestfitness = temp_fitness;
            zbest =tempx;
      end
    end
   
    % 观察峰
    % 计算概率
    prob = 0.9*fitness./max(fitness) + 0.1;
    for j=1:sizepop
      if(rand<prob(j))
            
            % 选择采蜜的个体
            x2y = randi(2);   % 两个未知数
            % 选择相连的种群
            neighbour = randi(sizepop);
            % neighbour != j
            while( neighbour==j)
                neighbour = randi(sizepop);
            end

            % 种群更新(解)
            tempx = pop(j,:);% 当前的解
            tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*(rand-0.5)*2;
%             tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*rand;

            % x1越界限制
            if tempx(1)>popmax1
                tempx(1)=popmax1;
            end
            if tempx(1)<popmin1
                tempx(1)=popmin1;
            end
            % x2越界限制
            if tempx(2)>popmax2
                tempx(2)=popmax2;
            end
            if tempx(2)<popmin2
                tempx(2)=popmin2;
            end

            % 适应度更新
            temp_fitness = fun( tempx );% 当前的适应度函数值--目标函数值--最小目标函数值
            % 比较个体间比较
            if temp_fitness<fitness(j)
                fitness(j) = temp_fitness;
                pop(j,:) = tempx;
            end
            if temp_fitness<bestfitness
                bestfitness = temp_fitness;
                zbest =tempx;
            else
                trail(j) = trail(j)+1;
            end
      end
    end
   
    % 侦察峰开始工作
    = max(trail);
    index = index(1);
    if(maxTrial(1)>limit)
      x1 = popmin1+(popmax1-popmin1)*rand;
      x2 = popmin2+(popmax2-popmin2)*rand;
      pop(index,:) = ;
      fitness(index) = fun();% 适应度函数值--目标函数值--最小目标函数值
    end
   
    fitness_iter(i) = bestfitness;
end

disp('最优解')
disp(zbest)
fprintf('\n')

figure('color',)
plot(fitness_iter,'ro-','linewidth',2)

figure('color',)
loglog(fitness_iter,'ro-','linewidth',2)
axis tight





zzzlovez 发表于 2017-2-19 20:09:59

谢谢楼主,刚开始学习,多多交流

清风 发表于 2017-2-26 18:18:52

呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜

zxshuitian 发表于 2017-3-19 21:39:32

非常好,谢谢分享

huwenping 发表于 2017-3-23 22:55:45

感谢分享,学习ABC算法。

18795873308 发表于 2017-4-4 15:29:08

想学人工蜂群算法,谢谢分享

mzch 发表于 2017-5-8 11:39:23

谢谢楼主分享

kkarumi 发表于 2017-5-10 22:05:15

感谢楼主!

wal1985 发表于 2017-5-14 09:34:19

非常好的代码,谢谢

lee3554592 发表于 2017-7-4 12:29:56

谢谢分享,好好学习,天天巡航上
页: [1] 2
查看完整版本: 19人工蜂群算法ABC函数优化--视频分享