【优化求解】基于花朵授粉FPA算法求解最优目标matlab代码

1 简介

花朵授粉算法( Flower Pollination Algorithm,FPA)是由英国剑桥大学学者Yang 于2012年提出的,其基本思想来源于对自然界花朵自花授粉、异花授粉的模拟,是一种新的元启发式群智能随机优化技术 。

据统计,目前在自然界中被人类发现的植物大约有 37 万 种,显花植物大约占有 20 万种,而其中 80% 的植物依靠生物授粉繁衍后代。花植物已经进化了大约 1. 25 亿年,在演化过程中,花朵授粉在花植物繁衍过程中承担着举足轻重的作用,对于花植物,如果没有花,很难想象植物世界是个什么样子。人类的发展和生存与跟花植物也是息息相关的,例如人们生活中吃的苹果等水果都是花朵授粉的结果。花朵授粉是通过花粉的传播来实现,而花粉的传播主要是靠昆虫及动物来完成。在实际授粉过程中,一些花朵仅仅吸引和依靠一种特定的昆虫来成功授粉,即一些花朵与传粉者之间形成了一种非常特别的花—传粉者伙伴关系。授粉形式主要有非生物和生物两种,大概 90% 的显花植物是属于生物授粉植物,即花粉主要是通过动物和昆虫来传播而实现繁衍后代。大约 10% 的显花植物是属于非生物授粉植物,不需要任何传粉者来传播花粉,而是通过自然风或者扩散途径来完成传粉,以实现子代的繁殖。在依赖生物传粉的显花植物中大约有 85% 的植物是由蜜蜂完成传粉的,蜜蜂在实际传粉中可能只对一些特定花植物进行传粉,而忽视其他种类的花植物,这样以便以最小的代价获得最大的收益。同时对于一些花植物而言,也获得更多的传粉机会,繁衍更多的后代。根据显花植物的授粉对象不同,可分为异花授粉和自花授粉两种。在一般情况下,异花授粉是两性花,一般一朵花的雌蕊接受的花粉是另一朵花的雄蕊的花粉,这就是所谓的异花授粉。自花授粉是显花植物成熟的花粉粒传到同一朵花的柱头上或同一种显花植物的不同花之间进行传粉,并能正常地受精结实的过程。由于传粉者鸟、蜜蜂等能飞行很长的距离,故异花授粉可以发生在远距离的地方,这种方式称为全局授粉。另外,鸟和蜜蜂具有 Levy 飞行的行为,跳或飞行的步长服从 Levy飞行分布。而自花授粉称为局部授粉。

花朵授粉算法是模拟自然界中显花植物花朵传粉的过程,该算法的理想条件假设如下:

a) 生物异花授粉是带花粉的传粉者通过 Levy 飞行进行的全局授粉过程。

b) 非生物自花授粉是局部授粉过程。

c) 花的常性可以被认为是繁衍概率,繁衍概率与参与的两朵花的相似性成比例关系。

d) 转换概率 p∈[0,1]控制全局授粉与局部授粉之间的转换,由于物理上的邻近性和风等其他因素的影响,局部授粉在整个授粉活动中是一个非常重要的部分 p。

然而,在现实的自然界中,每一棵显花植物可以开好多朵花,每朵花产生数百万甚至数十亿的花粉配子。但是,为了把问题简单化,假设每棵显花植物仅仅只开一朵花,且每朵花仅产生一个花粉配子。因此,问题经过简化后,意味着一朵花或一个配子就对应于优化问题中的一个解。

【优化求解】基于花朵授粉FPA算法求解最优目标matlab代码_第1张图片

2 部分代码

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%Flower Pollination Algorithm for Multimodal Optimization (MFPA)
%Jorge G醠vez, Erik Cuevas and Omar Avalos
%%This is the line to execute the code:
%%[mem,bestSol,bestFit,optima,FunctionCalls]=FPA([50 0.25 500 2]);
%FitFunc implements the function to be optimized
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [mem,bestSol,bestFit,optima,FunctionCalls]=FPA(para)
% Default parameters
if nargin<1,
  para=[50 0.25 500];   
end

n=para(1);           % Population size
p=para(2);           % Probabibility switch
N_iter=para (3);  % Number of iterations

phase = 1; %First state
phaseIte= [0.5,0.9,1.01]; %State vector

%Deb Function
d = 1;
Lb = 0;
Ub = 1;
optima = [.1;.3;.5;.7;.9];


% Initialize the population
for i=1:n,
 Sol(i,:)=Lb+(Ub-Lb).*rand(1,d);
 Fitness(i)=fitFunc(Sol(i,:));  %%Evaluate fitness function
end

% Initialice the memory
[mem,bestSol,bestFit,worstF] = memUpdate(Sol,Fitness, [], zeros(1,d), 100000000, 0, phase,d,Ub,Lb);

S = Sol;

FunctionCalls = 0;
% Main Loop
for ite = 1 : N_iter,
                   %For each pollen gamete, modify each position acoording
                   %to local or global pollination
                   for i = 1 : n,
                               % Switch probability
                               if rand>p,
                                           
                                           L=Levy(d);
                                           dS=L.*(Sol(i,:)-bestSol);
                                           S(i,:)=Sol(i,:)+dS;
                                           S(i,:)=simplebounds(S(i,:),Lb,Ub);
                               else
                                           epsilon=rand;
                                           % Find random flowers in the neighbourhood
                                           JK=randperm(n);
                                           % As they are random, the first two entries also random
                                           % If the flower are the same or similar species, then
                                           % they can be pollenated, otherwise, no action.
                                           % Formula: x_i^{t+1}+epsilon*(x_j^t-x_k^t)
                                           S(i,:)=S(i,:)+epsilon*(Sol(JK(1),:)-Sol(JK(2),:));
                                           % Check if the simple limits/bounds are OK
                                           S(i,:)=simplebounds(S(i,:),Lb,Ub);
                               end
                               Fitness(i)=fitFunc(S(i,:));
                   end
                   %Update the memory
                  [mem,bestSol,bestFit,worstF] = memUpdate(S,Fitness,mem,bestSol,bestFit,worstF,phase,d,Ub,Lb);
                   
                  Sol = get_best_nest(S, mem, p);
                  
                  FunctionCalls = FunctionCalls + n;
               
                  if ite/N_iter > phaseIte(phase)
                       %Next evolutionary process stage
                       phase = phase + 1;
                      [m,~]=size(mem);
                       %Depurate the memory for each stage
                       mem = cleanMemory(mem);
                       FunctionCalls = FunctionCalls + m;
                  end
end

%Plot the solutions (mem) founded by the multimodal framework
x = 0:.01:1;
y = ((sin(5.*pi.*x)).^ 6);
plot(x,y)
hold on
plot(mem(:,1),-mem(:,2),'r*');

3 仿真结果

【优化求解】基于花朵授粉FPA算法求解最优目标matlab代码_第2张图片

4 参考文献

[1]陈西成, and 刘曙. "基于改进花朵授粉算法的防空部署优化研究." 计算技术与自动化 038.003(2019):74-78.​

 

你可能感兴趣的:(优化求解,matlab,算法,开发语言)