我是靠谱客的博主 超级百褶裙,最近开发中收集的这篇文章主要介绍【优化求解】基于蝴蝶算法MBO求解最优目标matlab源码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1 简介

Sankalap Arora和Satvir Singh两位学者,通过观察蝴蝶觅食行为而受到启发,提出了一种新的群智能优化算法——蝴蝶优化算法(Butterfly Optimization Algorithm)。该算法的主要思想是模拟蝴蝶的觅食和求偶行为实现对目标问题的求解。

具体原理如下:

2 部分代码

%% Monarch Butterfly Optimization (MBO)

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %%
%% Notes:
% Different run may generate different solutions, this is determined by
% the the nature of metaheuristic algorithms.
%%

function [MinCost] = MBO(ProblemFunction, DisplayFlag, RandSeed)

% Monarch Butterfly Optimization (MBO) software for minimizing a general function
% The fixed Function Evaluations (FEs) is considered as termination condition.

% INPUTS: ProblemFunction is the handle of the function that returns
%         the handles of the initialization, cost, and feasibility functions.
%         DisplayFlag = true or false, whether or not to display and plot results.
%         ProbFlag = true or false, whether or not to use probabilities to update emigration rates.
%         RandSeed = random number seed
% OUTPUTS: MinCost = array of best solution, one element for each generation
%         Hamming = final Hamming distance between solutions
% CAVEAT: The "ClearDups" function that is called below replaces duplicates with randomly-generated
%         individuals, but it does not then recalculate the cost of the replaced individuals.

tic

if ~exist('ProblemFunction', 'var')
   ProblemFunction = @Ackley;
end
if ~exist('DisplayFlag', 'var')
   DisplayFlag = true;
end
if ~exist('RandSeed', 'var')
   RandSeed = round(sum(100*clock));
end

[OPTIONS, MinCost, AvgCost, InitFunction, CostFunction, FeasibleFunction, ...
   MaxParValue, MinParValue, Population] = Init(DisplayFlag, ProblemFunction, RandSeed);
nEvaluations = OPTIONS.popsize;

% % % % % % % % % % % %             Initial parameter setting         % % % % % % % % % % % %%%%
%% Initial parameter setting
Keep = 2; % elitism parameter: how many of the best habitats to keep from one generation to the next
maxStepSize = 1.0;        %Max Step size
partition = OPTIONS.partition;
numButterfly1 = ceil(partition*OPTIONS.popsize);  % NP1 in paper
numButterfly2 = OPTIONS.popsize - numButterfly1; % NP2 in paper
period = 1.2; % 12 months in a year
Land1 = zeros(numButterfly1, OPTIONS.numVar);
Land2 = zeros(numButterfly2, OPTIONS.numVar);
BAR = partition; % you can change the BAR value in order to get much better performance
% % % % % % % % % % % %       End of Initial parameter setting       % % % % % % % % % % % %%
%%

% % % % % % % % % % % %             Begin the optimization loop       % % % % % % % % % %%%%
% Begin the optimization loop
GenIndex = 1;
% for GenIndex = 1 : OPTIONS.Maxgen
while nEvaluations< OPTIONS.MaxFEs
   % % % % % % % % % % % %           Elitism Strategy           % % % % % % % % % % % %%%%%
   %% Save the best monarch butterflis in a temporary array.
   for j = 1 : Keep
       chromKeep(j,:) = Population(j).chrom;
       costKeep(j) = Population(j).cost;
   end
   % % % % % % % % % % % %       End of Elitism Strategy     % % % % % % % % % % % %%%%
   %%
   
   % % % % % % % % % % % %   Divide the whole population into two subpopulations % % % %%%
   %% Divide the whole population into Population1 (Land1) and Population2 (Land2)
   % according to their fitness.
   % The monarch butterflis in Population1 are better than or equal to Population2.
   % Of course, we can randomly divide the whole population into Population1 and Population2.
   % We do not test the different performance between two ways.
   for popindex = 1 : OPTIONS.popsize
       if popindex <= numButterfly1
           Population1(popindex).chrom = Population(popindex).chrom;
       else
           Population2(popindex-numButterfly1).chrom = Population(popindex).chrom;
       end
   end
   % % % % % % % % % % %   End of Divide the whole population into two subpopulations % % %%%
   %%
   
   % % % % % % % % % % % %%           Migration operator         % % % % % % % % % % % %%%%
   %% Migration operator
   for k1 = 1 : numButterfly1
       for parnum1 = 1 : OPTIONS.numVar
           r1 = rand*period;
           if r1 <= partition
               r2 = round(numButterfly1 * rand + 0.5);
               Land1(k1,parnum1) = Population1(r2).chrom(parnum1);
           else
               r3 = round(numButterfly2 * rand + 0.5);
               Land1(k1,parnum1) = Population2(r3).chrom(parnum1);
2
   SavePopSize = OPTIONS.popsize;
   OPTIONS.popsize = numButterfly2;
   % Make sure each individual is legal.
   NewPopulation2 = FeasibleFunction(OPTIONS, NewPopulation2);
   % Calculate cost
   NewPopulation2 = CostFunction(OPTIONS, NewPopulation2);
   % the number of fitness evaluations
   nEvaluations = nEvaluations +  OPTIONS.popsize;
   OPTIONS.popsize = SavePopSize;
   % % % % % % % % % % % %       End of Evaluate NewPopulation2     % % % % % % % % % % % %%
   %%
   
   % % % % % % % Combine two subpopulations into one and rank monarch butterflis       % % % % % %
   %% Combine Population1 with Population2 to generate a new Population
   Population = CombinePopulation(OPTIONS, NewPopulation1, NewPopulation2);
   % Sort from best to worst
   Population = PopSort(Population);
   % % % % % %     End of Combine two subpopulations into one and rank monarch butterflis % %% % %
   %%
   
   % % % % % % % % % % % %           Elitism Strategy         % % % % % % % % % % % %%% %% %
   %% Replace the worst with the previous generation's elites.
   n = length(Population);
   for k3 = 1 : Keep
       Population(n-k3+1).chrom = chromKeep(k3,:);
       Population(n-k3+1).cost = costKeep(k3);
   end % end for k3
   % % % % % % % % % % % %     End of Elitism Strategy     % % % % % % % % % % % %%% %% %
   %%
   
   % % % % % % % % % %           Precess and output the results         % % % % % % % % % % % %%%
   % Sort from best to worst
   Population = PopSort(Population);
   % Compute the average cost
  [AverageCost, nLegal] = ComputeAveCost(Population);
   % Display info to screen
   MinCost = [MinCost Population(1).cost];
   AvgCost = [AvgCost AverageCost];
   if DisplayFlag
       disp(['The best and mean of Generation # ', num2str(GenIndex), ' are ',...
           num2str(MinCost(end)), ' and ', num2str(AvgCost(end))]);
   end
   % % % % % % % % % % %   End of Precess and output the results     %%%%%%%%%% %% %
   %%
   
   %% Update generation number
   GenIndex = GenIndex+1;
   
end % end for GenIndex
Conclude2(DisplayFlag, OPTIONS, Population, nLegal, MinCost, AvgCost);

toc

% % % % % % % % % %     End of Monarch Butterfly Optimization implementation     %%%% %% %
%%


function [delataX] = LevyFlight(StepSize, Dim)

%Allocate matrix for solutions
delataX = zeros(1,Dim);

%Loop over each dimension
for i=1:Dim
   % Cauchy distribution
   fx = tan(pi * rand(1,StepSize));
   delataX(i) = sum(fx);
end

3 仿真结果

4 参考文献

[1]王希彤. 基于MBO的约束满足问题求解算法研究[D]. 吉林大学.

部分理论引用网络文献,若有侵权联系博主删除。

5 MATLAB代码与数据下载地址

见博客主页

最后

以上就是超级百褶裙为你收集整理的【优化求解】基于蝴蝶算法MBO求解最优目标matlab源码的全部内容,希望文章能够帮你解决【优化求解】基于蝴蝶算法MBO求解最优目标matlab源码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(84)

评论列表共有 0 条评论

立即
投稿
返回
顶部