获取更多资讯,赶快关注上面的公众号吧!

文章目录

  • 背景
  • 食肉植物算法的数学模型
    • 初始化
    • 分类和分组
    • 成长(探索)
    • 繁殖(利用)
    • 适应度更新和合并
    • 停止准则

  食肉植物算法 carnivorous plant algorithm (CPA)是由马拉西亚的Ong Kok Meng,于2020年受食肉植物如何适应恶劣环境(比如捕食昆虫和传粉繁殖)的启发而提出的。扫码关注公众号,后台回复“食肉植物”或“CPA”可以获取Matlab代码。

背景

  众所周知,大多数植物是动物的直接食物来源,但是自然界中也有例外,食肉植物就是其中一种。它们通常生长在缺乏营养的恶劣环境中,例如,湿地、沼泽和以水丰富为特征的泥泞海岸。为了获取生长和繁殖所需的氮和磷等额外的营养,食肉植物用它们分泌的酶吸引、诱捕和吃掉苍蝇、蝴蝶、蜥蜴和老鼠等动物。猪笼草、茅膏菜、狸藻、维纳斯捕蝇草等都是常见的食肉植物。[PS:北航还在猪笼草身上发现了水倒流的现象,并因此成功发表了全国机械领域的第一篇Nature]

图1 常见的食肉植物

食肉植物算法的数学模型

  那么接下来就介绍一下用于模拟食肉植物吸引、诱捕、消化和繁殖策略的数学模型。CPA从随机初始化一组解开始,然后这些解被分为食肉植物和猎物,再按生长和繁殖过程分组,进行适应度值的更新,最后将所有解合并。整个过程循环执行直到满足终止条件。

初始化

  CPA是一种基于种群的优化算法,因此首先需要初始化待求解问题的可能解,即在湿地中随机初始化nCPlantnCPlantnCPlant个食肉植物和nPreynPreynPrey个猎物个体,每个个体的位置由以下矩阵表示:
Pop=[Individual 1,1Individual 1,2⋯⋯Individual 1,dIndividual 2,1Individual 2,2⋯⋯Individual 2,d⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮Individual n,1Individual n,2⋯⋯Individual n,d](1)P o p=\left[\begin{array}{ccccc} \text { Individual }_{1,1} & \text { Individual }_{1,2} & \cdots & \cdots & \text { Individual }_{1, d} \\ \text { Individual }_{2,1} & \text { Individual }_{2,2} & \cdots & \cdots & \text { Individual }_{2, d} \\ \vdots & \vdots & \vdots & \vdots & \vdots \\ \vdots & \vdots & \vdots & \vdots & \vdots \\ \text { Individual }_{n, 1} & \text { Individual }_{n, 2} & \cdots & \cdots & \text { Individual }_{n, d} \end{array}\right] \tag{1} Pop=⎣⎢⎢⎢⎢⎢⎢⎡​ Individual 1,1​ Individual 2,1​⋮⋮ Individual n,1​​ Individual 1,2​ Individual 2,2​⋮⋮ Individual n,2​​⋯⋯⋮⋮⋯​⋯⋯⋮⋮⋯​ Individual 1,d​ Individual 2,d​⋮⋮ Individual n,d​​⎦⎥⎥⎥⎥⎥⎥⎤​(1)
其中ddd为维度,即变量个数,nnn为nCPlantnCPlantnCPlant和nPreynPreynPrey的总和,每个个体使用下式进行随机初始化:
Individual i,j=Lbj+(Ubj−Lbj)×rand (2)\text { Individual }_{i, j}=L b_{j}+\left(U b_{j}-L b_{j}\right) \times \text { rand }\tag{2}  Individual i,j​=Lbj​+(Ubj​−Lbj​)× rand (2)
其中,LbLbLb和UbUbUb分别为搜索域的下界和上界,即自变量的最小值和最大值,i∈[1,2,...,n]i\in[1,2,...,n]i∈[1,2,...,n],j∈[1,2,...,d]j\in[1,2,...,d]j∈[1,2,...,d],randrandrand为[0,1][0,1][0,1]之间的随机数。

  对于第iii个个体,通过将每一行(即所有维度)作为适应度函数的输入来评估适应度值,计算得到的适应度值存储在以下矩阵中:
Fit =[f(Individual 1,1Individual 1,2⋯⋯Individual 1,d)f(Individual 2,1Individual 2,2⋯⋯Individual 2,d)⋮⋮f(Individual n,1Individual n,2⋯⋯Individual n,d)](3)\text { Fit }=\left[\begin{array}{ccccc} f\left(\text { Individual }_{1,1}\right. & \text { Individual }_{1,2} & \cdots & \cdots & \text { Individual } \left._{1, d}\right) \\ f\left(\text { Individual }_{2,1}\right. & \text { Individual }_{2,2} & \cdots & \cdots & \text { Individual } \left._{2, d}\right) \\ & \vdots & & & \\ & \vdots & & & \\ f\left(\text { Individual }_{n, 1}\right. & \text { Individual }_{n, 2} & \cdots & \cdots & \text { Individual } \left._{n, d}\right) \end{array}\right]\tag{3}  Fit =⎣⎢⎢⎢⎢⎢⎢⎡​f( Individual 1,1​f( Individual 2,1​f( Individual n,1​​ Individual 1,2​ Individual 2,2​⋮⋮ Individual n,2​​⋯⋯⋯​⋯⋯⋯​ Individual 1,d​) Individual 2,d​) Individual n,d​)​⎦⎥⎥⎥⎥⎥⎥⎤​(3)

分类和分组

  接下来,式(1)中的每个个体按照其适应度值升序排序(考虑最小化问题),那么排在最前面的nCPlantnCPlantnCPlant个解就作为食肉植物CPCPCP,而剩余的nPreynPreynPrey个解就是猎物PreyPreyPrey。图2可视化了食肉植物和猎物种群。

图2 食肉植物和猎物种群,其中红色钻石表示全局最优解,黄色钻石表示局部最优解

  排序后的适应度值和种群可通过式(4)和式(5)表达:

Sorted_Fit =[fCP(1)fCP(2)⋮fCP(nCPlant)fPrey (nCPlant+1)fPrey (nCPlant+2)⋮fPrey (nCPlant+nprey)](4)\text { Sorted\_{Fit} }=\left[\begin{array}{c} f_{C P(1)} \\ f_{C P(2)} \\ \vdots \\ f_{C P(n C P l a n t)} \\ f_{\text {Prey }(n C P l a n t+1)} \\ f_{\text {Prey }(n C P l a n t+2)} \\ \vdots \\ f_{\text {Prey }(n C P l a n t+n p r e y)} \end{array}\right]\tag{4}  Sorted_Fit =⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​fCP(1)​fCP(2)​⋮fCP(nCPlant)​fPrey (nCPlant+1)​fPrey (nCPlant+2)​⋮fPrey (nCPlant+nprey)​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​(4)

Sorted_Pop
=[CP1,1CP1,2⋯⋯CP1,dCP2,1CP2,2⋯⋯CP2,d⋮⋮⋮⋮⋮CPnCPlant,1CPnCPlant,2⋯⋯CPnCPlant,dPrey nCPlant+1,1Prey nCPlant+1,2⋯⋯Prey nCPlant+1,dPrey nCPlant+2,1Prey nCPlant+2,2⋯⋯Prey nCPlant+2,d⋮⋮⋮⋮⋮Prey nCPlant+nPrey,1Prey nCPlant+nPrey,2⋯⋯Prey nCPlant+nPrey,d](5)=\left[\begin{array}{ccccc} C P_{1,1} & C P_{1,2} & \cdots & \cdots & C P_{1, d} \\ C P_{2,1} & C P_{2,2} & \cdots & \cdots & C P_{2, d} \\ \vdots & \vdots & \vdots & \vdots & \vdots \\ C P_{n C P l a n t}, 1 & C P_{n C P l a n t, 2} & \cdots & \cdots & C P_{n C P l a n t, d} \\ \text { Prey }_{n C P l a n t+1,1} & \text { Prey }_{n C P l a n t+1,2} & \cdots & \cdots & \text { Prey }_{n C P l a n t+1, d} \\ \text { Prey }_{n C P l a n t+2,1} & \text { Prey }_{n C P l a n t+2,2} & \cdots & \cdots & \text { Prey }_{n C P l a n t+2, d} \\ \vdots & \vdots & \vdots & \vdots & \vdots \\ \text { Prey }_{n C P l a n t+n P r e y, 1} & \text { Prey }_{n C P l a n t+n P r e y, 2} & \cdots & \cdots & \text { Prey }_{n C P l a n t+n P r e y, d} \end{array}\right]\tag{5} =⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​CP1,1​CP2,1​⋮CPnCPlant​,1 Prey nCPlant+1,1​ Prey nCPlant+2,1​⋮ Prey nCPlant+nPrey,1​​CP1,2​CP2,2​⋮CPnCPlant,2​ Prey nCPlant+1,2​ Prey nCPlant+2,2​⋮ Prey nCPlant+nPrey,2​​⋯⋯⋮⋯⋯⋯⋮⋯​⋯⋯⋮⋯⋯⋯⋮⋯​CP1,d​CP2,d​⋮CPnCPlant,d​ Prey nCPlant+1,d​ Prey nCPlant+2,d​⋮ Prey nCPlant+nPrey,d​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​(5)

  分组的过程主要是用于模拟每个食肉植物及其猎物的环境,在分组过程中,将适合度值最高的猎物分配给排名第一的食肉植物,类似地,第二名和第三名猎物分别属于第二和第三名食肉植物。重复该过程,直到排名第nCPlantnCPlantnCPlant的猎物分配给排名第nCPlantnCPlantnCPlant的食肉植物,然后第nCPlant+1nCPlant+1nCPlant+1名猎物分配给第1名食肉植物(所以这里默认猎物是多余食肉植物的)。整个分组过程入图3所示。对食肉植物进行分组主要是为了减少食肉植物生长过程中出现大量劣质猎物的可能性,这对提高食肉植物的生存能力至关重要。

图3 CPA的分组过程

成长(探索)

  由于土壤营养不良,食肉植物会吸引、诱捕和消化猎物来生长。这种植物的香味能引诱猎物,但猎物也能偶尔成功地从食肉植物的魔爪中逃脱,所以这里引入了一个吸引率。

  每一种群都随机选择一个猎物,如果吸引率高于随机生成的数字,食肉植物就会捕获猎物并消化来生长。新的食肉植物的生长模型为:
NewCP i,j=growth ×CPi,j+(1−growth )×Prey v,j(6)\text { NewCP }_{i, j}=\text { growth } \times C P_{i, j}+(1-\text { growth }) \times \text { Prey }_{v, j}\tag{6}  NewCP i,j​= growth ×CPi,j​+(1− growth )× Prey v,j​(6)

growth =growth_rate×rand i,j(7)\text { growth }= growth\_rate \times \text { rand }_{i, j}\tag{7}  growth =growth_rate× rand i,j​(7)

其中CPi,jCP_{i,j}CPi,j​是排名第iii的食肉植物,Preyv,jPrey_{v,j}Preyv,j​为随机选择的猎物,成长率growth_rate{ growth\_rate}growth_rate为预定义的值,randrandrand为[0,1][0,1][0,1]之间的随机数。在CPA中,每一个种群内部只有一个食肉植物,而猎物的数量必须多于两个。大多数情况下,CPA的吸引率设置为0.8。

  另一方面,如果吸引率低于产生的随机值,则猎物设法逃脱陷阱并继续生长,数学上表示为:

NewPrey i,j=growth ×Prey u,j+(1−growth )×Prey v,j,u≠v(8)\text { NewPrey }_{i, j}=\text { growth } \times \text { Prey }_{u, j}+(1-\text { growth }) \times \text { Prey }_{v, j}, \quad u \neq v\tag{8}  NewPrey i,j​= growth × Prey u,j​+(1− growth )× Prey v,j​,u​=v(8)

f(n)={growth_rate ×rand i,j,f(prey v)>f(prey u)1−growth_rate ×rand i,j,f(prey v)<f(prey u)(9)f(n)= \begin{cases} \text { growth\_rate } \times \text { rand }_{i, j},& f\left(\text { prey }_{v}\right)>f\left(\text { prey }_{u}\right) \\ 1-\text { growth\_rate } \times \text { rand }_{i, j},& f\left(\text { prey }_{v}\right)< f\left(\text { prey }_{u}\right) \end{cases}\tag{9} f(n)={ growth_rate × rand i,j​,1− growth_rate × rand i,j​,​f( prey v​)>f( prey u​)f( prey v​)<f( prey u​)​(9)

其中Preyu,jPrey_{u,j}Preyu,j​是第iii个种群中随机选择的另一个猎物。食肉植物和猎物的生产过程都将持续group_iter\text{group\_iter}group_iter代。

  式(6)和(8)用于将新的解向高质量解空间方向指引,同时也为了保证在猎物的生长过程中起到类似的作用,引入了式(9),因为随机选择的PreyuPrey_uPreyu​可能劣于PreyvPrey_vPreyv​。如式(6)和(8)所示,算法的探索受生长率的影响,生长率越高,探索范围越大,错失全局最优解的可能性业越大。因此需要选择一个合适的生长率。

繁殖(利用)

  食肉植物吸收猎物的营养,并利用这些营养生长和繁殖。在繁殖方面,只有排名第一的食肉植物,即种群中最好的解,才允许繁殖。这是为了确保CPA的利用只关注最优解,从而避免对其他解进行不必要的利用,节省计算成本。最优食肉植物的繁殖过程如下:
NewCP i,j=CP1,j+Reproduction_rate ×rand i,j×mate i,j(10)\text { NewCP }_{i, j}=C P_{1, j}+\text { Reproduction\_rate } \times \text { rand }_{i, j} \times \text { mate }_{i, j}\tag{10}  NewCP i,j​=CP1,j​+ Reproduction_rate × rand i,j​× mate i,j​(10)

mate i,j={CPv,j−CPi,jf(CPi)>f(CPv)CPi,j−CPv,jf(CPi)<f(CPv),i≠v≠1(11)\text { mate }_{i, j}=\begin{cases} C P_{v, j}-C P_{i, j} & f\left(C P_{i}\right)> f\left(C P_{v}\right) \\ C P_{i, j}-C P_{v, j} & f\left(C P_{i}\right)< f\left(C P_{v}\right) \end{cases}, i \neq v \neq 1\tag{11}  mate i,j​={CPv,j​−CPi,j​CPi,j​−CPv,j​​f(CPi​)>f(CPv​)f(CPi​)<f(CPv​)​,i​=v​=1(11)

其中CP1,jCP_{1,j}CP1,j​为最优解,CPv,jCP_{v,j}CPv,j​为随机选择的食肉植物,繁殖率Reproduction_rateReproduction\_rateReproduction_rate是预定义的用于利用的值。繁殖过程重复nCPlantnCPlantnCPlant次,繁殖过程中,为每个维度jjj都随机选择一个食肉植物vvv。

适应度更新和合并

  将新生成的食肉植物和猎物于先前的种群进行合并,就得到了一个新的维度为[n+nCPlant(group_iter+nCPlant)]xd[n+nCPlant({group\_iter}+nCPlant)]\text{x} d[n+nCPlant(group_iter+nCPlant)]xd维(nnn个原始个体,nCPlant(group_iternCPlant({group\_iter}nCPlant(group_iter个生长过程个体和nCPlantnCPlantnCPlant个繁殖过程个体)的新种群,之后,新种群按照适应度值升序排序,选择排名前nnn的个体作为新的候选解,保证种群大小不变。这种精英选择策略保证了选择更优的解用于下一代的繁殖。

停止准则

  重复整个分类、分组、生长和繁殖的过程,直到到达终止停止准则。如下 为CPA的伪代码。

食肉植物算法

1.定义目标函数f(x⃗),x⃗=(x1,x2,..,xd)f(\vec{x}), \quad \vec{x}=\left(x_{1}, x_{2}, . ., x_{d}\right)f(x),x=(x1​,x2​,..,xd​)

2.定义组内迭代次数group_iter{group\_iter}group_iter、吸引率attraction_rate{attraction\_rate}attraction_rate、生长率growth_rate{growth\_rate}growth_rate、繁殖率reproduction_rate{reproduction\_rate}reproduction_rate、食肉植物数量nCPlantnCPlantnCPlant和猎物数量nPreynPreynPrey

3.随机初始化大小为nnn、维度为ddd的种群

4.评估每个个体的适应度值

5.找到最优个体g∗g^*g∗作为排名第一的食肉植物

6.Repeat until 满足终止条件

7. 将排名前nCPlantnCPlantnCPlant的个体分类为食肉植物

8. 将剩余的nPreynPreynPrey个个体分类为猎物

9. 将食肉植物和猎物进行分组

10. // 食肉食物和猎物的生长过程

11. for i=1:nCPlanti=1:nCPlanti=1:nCPlant

12.  for Group_cycle=1:group_iterGroup\_cycle=1:{group\_iter}Group_cycle=1:group_iter

13.   if attraction_rate>随机数{attraction\_rate}>随机数attraction_rate>随机数

14.    根据式(6)生成新的食肉植物

15.   else

16.    根据式(8)生成新的猎物

17.  end for

18. end for

19. //最优食肉植物的繁殖过程

20. for i=1:nCPlanti=1:nCPlanti=1:nCPlant

21.  根据式(10)基于最优食肉植物生成新的食肉植物

22. end for

23. 评估新生成的每个食肉植物和猎物

24. 合并之前和新生成的食肉植物和猎物

25. 对个体进行排序,并选择前nnn个个体进入下一代

26. 确定当前最优个体g∗g^*g∗作为排名第一的食肉植物

27.end while

28.展示当前最优解g∗g^*g∗

智能优化算法(源码)-食肉植物算法(Carnivorous Plant Algorithm ,CPA)相关推荐

  1. 【老生谈算法】matlab实现census算法源码——census算法

    census算法matlab程序 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]census算法matlab程序.docx ...

  2. linux页面算法源码,LRU算法原理解析

    LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的. 现代操作系统提供了一种对主存的抽象概念虚拟内存,来对主存进行更好地管理.他将主存 ...

  3. 【老生谈算法】matlab实现AHP算法源码——AHP算法

    用Matlab实现AHP的算法 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]用Matlab实现AHP的算法.doc 2.算 ...

  4. 【老生谈算法】matlab实现匈牙利算法源码——匈牙利算法

    matlab匈牙利算法代码实现 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]matlab匈牙利算法.doc 2.算法详解: ...

  5. 【老生谈算法】matlab实现LMS算法源码——LMS算法

    matlab的LMS算法详解 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]matlab的LMS算法.doc 2.算法详解: ...

  6. 【老生谈算法】matlab实现最短路径算法源码——最短路径算法

    每对顶点之间的最短路径 matlab程序 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]最短路径的Floyd算法的Matla ...

  7. 【老生谈算法】matlabAP近邻传播聚类算法源码——聚类算法

    AP近邻传播聚类算法原理及Matlab实现 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]AP近邻传播聚类算法原理及Matl ...

  8. 【老生谈算法】matlab实现RSA算法源码——RSA算法

    RSA算法的matlab实现 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]RSA算法的matlab实现-doc 2.算法详 ...

  9. 【老生谈算法】matlab实现K-means算法源码——K-means算法

    K-means算法matlab是实现 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]K-means算法matlab是实现.d ...

最新文章

  1. Centos6.3下利用open***部署远程×××服务
  2. R语言ggplot2可视化树状图、层次聚类系统树图、树状图根据给定的距离度量将相似点分组在一起、并根据点的相似性将它们组织成树状图链接起来(Hierarchical Dendrogram)
  3. 【HIMI转载推荐之三】基于Cocos2dx引擎UI扩展引擎包[cocos2d-x-3c]
  4. Android图片处理
  5. 吴裕雄 python 机器学习——数据预处理标准化StandardScaler模型
  6. 优化方法的基本认识 overview
  7. mysql半同步复制
  8. 【GoLang】golang中可以直接返回slice吗?YES
  9. 三次样条插值_2.6 三次样条插值
  10. 有多个script怎么放一起_在南方我们觉得儿菜的特种蔬菜,对它得如何处理?怎么做出美味?...
  11. 自动化专业现在行业前景如何,吃香吗?
  12. 魔方口诀(个人备忘)
  13. WLAN适配器故障(消失)的最快解决办法
  14. centos ping 路由_centos服务器怎么ping命令
  15. .lnk文件格式解析
  16. Android按键音
  17. 原始资料的收集方法———定性资料的收集
  18. QT之qss教程- QScrollBar
  19. Java设计模式策略模式(附实例代码)每天一学设计模式
  20. PKCS1_SignatureScheme_PSS

热门文章

  1. 移动硬盘无法被识别怎么办?
  2. 家庭组网 光猫+交换机利用VLAN划分实现客厅单线复用(下) 将各房间网口接入家庭局域网
  3. eas bos客户端获取组织,人员,用户的方法
  4. 计算机都学什么数学,计算机专业的数学应学到什么水平?应该学习数学的那些分支?...
  5. TCP三次握手和四次挥手?TCP如何保证可靠性?什么是TCP滑动窗口?
  6. TX云游戏平台 WeGame 1.0.3.8中文版
  7. 复旦大学硕士盲审 计算机学院,《复旦大学论文抽检、盲审工作的通知.doc
  8. VSC | vscode 常用快捷键
  9. Jenkins学习(执行命令路径,脚本上传静态html代码)(一)
  10. 物联网开发笔记(25)- 使用Micropython开发ESP32开发板之控制LCD1602显示屏