海洋捕食者算法 MPA
前言
这个算法介绍很少,所以想边学习边记录一下。可能更新有点慢(近期大概率不更新),各位小伙伴们见谅。
原论文: Marine Predators Algorithm: A nature-inspired metaheuristic
代码: https://github.com/afshinfaramarzi/Marine-Predators-Algorithm
本文链接: 原创
https://blog.csdn.net/weixin_43850253/article/details/110724958
思想
海洋捕食者算法启发于自然界中捕食者的捕食策略。该算法认为顶级捕食者具有最大的搜索本领。
顶级捕食者们构成精英矩阵(一个顶级捕食者即为问题的一个解)。
海洋捕食者算法(MPA)是一种新型元启发式优化算法。参考作者论文, 给出算法的流程:
(1) 初始化精英矩阵(Elite)和猎物矩阵(Prey)
猎物矩阵(Prey) 矩阵每一个元素 Xij 的初始化方法:
Xij=Xmin+rand(Xmax−xmin)X_{ij} = X_{min} ~+~ rand(X_{max} ~-~ x_{min}) Xij=Xmin + rand(Xmax − xmin)
最终得到的Prey矩阵:
其中,n是种群的规模,d是每个维度的位置(问题的解的维度)。
对每一个Prey个体Xi = [Xi,1, Xi,2, …, Xi,d], 计算其适应度, 然后使用适应度最优的个体 XI 复制n份构成Elite矩阵
其中n是种群的规模,d是每个维度的位置(问题的解的维度),Elite的维度与Prey的维度相同。
(2)接着我们开始进行优化。在优化的过程中,具有三个步骤。
步骤一:
当迭代次数小于最大迭代次数的三分之一的时候,
si=RB⨂(Elitei−RB⨂Preyi),i=1...nPreyi=Preyi+P.R⨂sis_i = R_B \bigotimes ~(Elite_i - R_B \bigotimes Prey_i), ~i = 1...n \\ Prey_i = Prey_i ~+~ P.R \bigotimes s_i ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ si=RB⨂ (Elitei−RB⨂Preyi), i=1...nPreyi=Preyi + P.R⨂si
其中,RB 是采用布朗随机游走产生的随机数组成的向量,维度是 d(问题的求解规模,下同)。si 代表移动的步长。 P是一个常数,等于0.5。R是一个0到1之间的均匀分布的随机数组成的向量,维度是 d。
RB相当于一般化的高斯分布(Normal Gaussian distribution)。每一个元素 RBi 可以通过下列表达式来计算:
RBi=12πexp(−x22)R_{Bi} = \frac{1}{\sqrt{2\pi}}exp(-\frac{x^2}{2}) RBi=2π1exp(−2x2)
步骤二:
当迭代次数大于最大迭代次数的三分之一而小于其三分之二时,种群分两部分进行操作。
前半部分种群跟新规则如下:
si=RL⨂(Elitei−RL⨂Preyi),i=1,...,n/2Preyi=Preyi+P.R⨂sis_i = R_L \bigotimes ~(Elite_i ~-~ R_L \bigotimes Prey_i),~i=1,...,n/2 \\ Prey_i = Prey_i ~+~ P.R \bigotimes s_i ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ si=RL⨂ (Elitei − RL⨂Preyi), i=1,...,n/2Preyi=Preyi + P.R⨂si
其中, RL 是 Levy 分布组成的出来的一个向量,维度是 d。P是一个常数,等于0.5。R是一个0到1之间的均匀分布的随机数组成的向量,维度是 d。
RL 的每一项元素 RLi 可以由下列式子计算得来:
RLi=C×xy1/aR_{Li} = C ~\times~ \frac{x}{y^{1/a}} RLi=C × y1/ax
其中,C 和 α是一个常数,分别等于0.05和1.5。
x=Normal(0,σx2)y=Normal(0,σy2)x = Normal(~0,~ \sigma_x^2~) \\ y = Normal(~0,~ \sigma_y^2~) x=Normal( 0, σx2 )y=Normal( 0, σy2 )
在上面的表达式中
σx=[Γ(1+α)sin(πα2)Γ(1+α2)α2α−12]1/ασy=1α=1.5\sigma_x = [\frac{\Gamma(1 + α)sin(\frac{\piα}{2})}{\Gamma(\frac{1+α}{2})α2^{\frac{α-1}{2}}}]^{1/α} \\ \sigma_y = 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\ α = 1.5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ σx=[Γ(21+α)α22α−1Γ(1+α)sin(2πα)]1/ασy=1 α=1.5
后半部分种群跟新规则如下:
si=RB⨂(RB⨂Elitei−Preyi),i=n/2,...,nPreyi=Elitei+P.CF⨂sis_i = R_B \bigotimes~(R_B \bigotimes Elite_i - Prey_i),~i=n/2,...,n \\ Prey_i = Elite_i + P.CF \bigotimes s_i ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ si=RB⨂ (RB⨂Elitei−Preyi), i=n/2,...,nPreyi=Elitei+P.CF⨂si
这里RB 是采用布朗随机游走产生的随机数组成的向量,维度是 d。P是常数,等于0.5。CF是步长si 的自适应参数(下同), 定义为
CF=(1−IterMax_Iter)(2IterMax_Iter)CF = (1 - \frac{Iter}{Max\_Iter})^{(2\frac{Iter}{Max\_Iter})} CF=(1−Max_IterIter)(2Max_IterIter)
其中, Iter是迭代次数,Max_Iter是最大迭代次数。
步骤三:
当迭代次数大于最大迭代次数的三分之二时,进入第三个阶段,此时种群更新规则如下:
si=RL⨂(RL⨂Elitei−Preyi),i=1,...,nPreyi=Elitei+P.CF⨂sis_i = R_L \bigotimes ~(R_L \bigotimes Elite_i ~-~ Prey_i), i=1,...,n \\ Prey_i = Elite_i + P.CF \bigotimes s_i~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ si=RL⨂ (RL⨂Elitei − Preyi),i=1,...,nPreyi=Elitei+P.CF⨂si
(3) 解决涡流形成和FADS效应(Eddy formation and FADs’ effect)
此操作的作用是让算法在迭代过程中尽可能跳出局部最优解,已达到更好的寻优精度。
Preyi={Preyi+CF[Xmin+R⨂(Xmax−Xmin)]⨂U,ifr<=FADSPreyi+[FADs(1−r)+r](Preyr1−Preyr2),ifr>FADSPrey_i = \left\{ \begin{array}{l} Prey_i + CF[X_{min} + R \bigotimes(X_{max} - X_{min})] \bigotimes U, if~ r <= FADS \\ Prey_i + [FADs(1-r)+r](Prey_{r1}-Prey_{r2}), ~if r~> FADS \end{array} \right. Preyi={Preyi+CF[Xmin+R⨂(Xmax−Xmin)]⨂U,if r<=FADSPreyi+[FADs(1−r)+r](Preyr1−Preyr2), ifr >FADS
其中r是一个随机数, FADS是一个影响优化过程的常数,等于0.2。r1和r2是Prey两个随机下标, 1 ≤ r1,r2 ≤ n。 U是一个包含0和1的二进制向量,维度是d。U的每一个元素 Ui 定义为
Ui={0,ifrandom≤FADs1,ifrandom>FADsU_i = \left\{ \begin{array}{l} 0, ~~~if~ random ≤ FADs \\ 1, ~~~if~ random > FADs \end{array} \right. Ui={0, if random≤FADs1, if random>FADs
其中random是一个0到1的随机数,FADs等于0.2。
(4) 海洋记忆(Marine memory)
这一步骤进行对Elite(精英)矩阵的更新。
针对每一个Prey矩阵中的个体Preyi ,计算其适应度,若适应度由于Elite矩阵矩阵中相应的位置的适应度时,则将该个体替代原来精英矩阵中相应的个体。
然后在计算整个精英矩阵中最优个体的适应度,若符合要求,则算法结束,否则继续迭代。
算法的流程图总结出来如下:
当然,Afshin Faramarzi[6]等人在论文中也提到,这只是MPA算法的第一个版本,后续还可以继续改进。尽管如此MPA在他们和其他学者的实验中都发现,MPA算法具有很高的寻优精确度。
李代华和崔东文[7]将海洋捕食者算法(MPA)与自适应神经模糊推理系统(ANFIS)相结和的方法来预测径流。Mohammed A. A. Al-qaness[8] 等人用MPA算法来预测意大利,美国,伊朗和韩国的新冠肺炎确诊病例。
代码
2022.4.21更,这是我2020年写的代码,当时为了应付课程作业,还没来得及优化和排小bug
# %%
import numpy as np
import pandas as pd # 读取csv文件的库
import matplotlib.pyplot as plt
import random
import oscur = os.getcwd().replace("\\", '/')
if cur.split('/')[-1] != 'MPA':os.chdir('D:/project/pyCharmProject/cal_intelligent/report/MPA')
print(os.getcwd())# %%
filename = 'data/ENB_nor.xlsx'
if filename.split('.')[-1] == 'csv':df = pd.read_csv('../' + filename, encoding='gbk')
elif filename.split('.')[-1] == 'xlsx' or filename.split('.')[-1] == 'xls':df = pd.read_excel('../' + filename, sheet_name=0)
else:df = 'error! 不支持的文件格式'
print(df)# %%
x_m = df[['X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8']].values.tolist()
y_lt = df['Y1'].tolist()
print('shape of x_m: {} * {}'.format(len(x_m), len(x_m[0])))
print('shape of y_lt: {}'.format(len(y_lt)))# %%
length = len(x_m)
x = x_m[:int(length * 0.8)]
y = y_lt[:int(length * 0.8)]# %%
def fc_MSE(w, x, y):"""适应度函数:param w: w是一系列参数的组合, 其中, 0到31是ANN输入层到隐藏层的32个w权重,32到35是输入层到隐藏层的4个偏置b,36到39是隐藏层到输出层的4个w权重, 40是隐藏层到输出层的1个偏置b, 因此len(w) = 41:param x: 特征矩阵, n * 8 维度, n是数据条数:param y: 标签, n * 1 维度, n是数据条数:return: 适应度值"""# 注意切片运算时左闭右开 w[a:b] -> [a,b)w1 = np.array(w[:32]).reshape((8, 4))b1 = np.array(w[32:36]).reshape((1, 4))w2 = np.array(w[36:40]).reshape((4, 1))b2 = np.array(w[40])x_n = np.array(x).reshape((len(x), 8))y_n = np.array(y).reshape((len(x), 1))temp = x_n.dot(w1) + b1temp = 1 / (1 + np.exp(-temp))result = y_n - temp.dot(w2) + b2MSE = np.mean(np.square(y - result))# print('MSE: ', MSE)# https://blog.csdn.net/qq_42257962/article/details/108265730# RMSE = np.sqrt(np.mean(np.square(y - y_hat)))# MAE = np.mean(np.abs(y - y_hat))# MAPE = np.mean(np.abs((y - y_hat) / y)) * 100return MSEdef Levy_lt(dimension: int):# gamma(1.25) = 0.9064# gamma(2.5) = 1.329340388179137sigma_x = 0.6965757716463266sigma_y = 1levy_list = []while True:levy_x = np.random.normal(loc=0, scale=sigma_x ** 2, size=1)[0]levy_y = np.random.normal(loc=0, scale=sigma_y ** 2, size=1)[0]levy_a = 0.05 * levy_x / (levy_y ** (1 / 1.5))if np.isnan(levy_a):continuelevy_list.append(levy_a)if len(levy_list) >= dimension:break# print(levy_a)return np.array(levy_list)# %%
# 这里用MPA来求解神经网络的参数, 求解的函数为使得 y - f(w, x) 的向量的MSE最小
def MPA(x, y, func: str):"""使用 pso 来算出神经网络连接的初始化权重:param x: 特征矩阵, n * 8 维度, n是数据条数:param y: 标签, n * 1 维度, n是数据条数:param func: 适应度函数的函数名:return: 长度为41的 w, 将作为神经网络的权重"""# 先定义一些参数x_min, x_max = -5, 5 # 解的范围, 及将要传入神经元的参数的范围N = 4 # 种群规模D = 41 # 觅食空间,解的维度Max_Iter = 300 # 最大迭代次数,建议500~1000FADs = 0.2 # the probability of FADs effect on the optimization processP = 0.5 # 在 Max_Iter/3 代数内中会用到# 开始操作# Prey 代表 Prey矩阵Prey = np.array([(x_min + np.random.random((D, 1)) * (x_max - x_min)).reshape(41).tolist()for i in range(N)])# print(Prey)# print(len(Prey)) # 4# print(len(Prey[0])) # 41# 存放精英矩阵中最好的解g_best = [i for i in Prey[0]]g_best_value = eval(func)(Prey[0], x, y)# 找出现阶段全局最优解for i in range(1, N):temp = eval(func)(Prey[i], x, y)if temp < g_best_value:g_best_value = tempg_best = [j for j in Prey[i]]# 再将最好的x_i复制 N 份构成精英矩阵Elite = np.array([[i for i in g_best] for j in range(N)])# for i in Elite:# print(i)# 存放精英矩阵中每一行的解的值e_value_lt = [g_best_value for i in range(N)]print('g_best: {}\ng_best_value: {}'.format(g_best, g_best_value))print()generation_num = 0while generation_num < Max_Iter:generation_num += 1CF = (1 - generation_num / Max_Iter) ** (2 * generation_num / Max_Iter)# 开始三阶段演变# 第一阶段if generation_num < Max_Iter / 3:R_B = np.random.normal(loc=0, scale=1, size=D)R = np.random.random(size=D)for i in range(N):step_size = R_B * (Elite[i] - R_B * Prey[i]) # numpy中矩阵间*代表相同位置元素相乘Prey[i] += P * R * step_size# 第二阶段if Max_Iter / 3 <= generation_num < 2 * Max_Iter / 3:for i in range(int(N / 2)):R_L = Levy_lt(D)R = np.random.random(size=D)step_size = R_L * (Elite[i] - R_L * Prey[i])Prey[i] += P * R * step_sizefor i in range(int(N / 2), N):R_B = np.random.normal(loc=0, scale=1, size=D)step_size = R_B * (R_B * Elite[i] - Prey[i])Prey[i] = Elite[i] + P * CF * step_size# 第三阶段if generation_num >= 2 * Max_Iter / 3:for i in range(N):R_L = Levy_lt(D)step_size = R_L * (R_L * Elite[i] - Prey[i])Prey[i] = Elite[i] + P * CF * step_size# Eddy formation and FADs’ effect 增加跳出局部最优的能力random_num = random.random()if random_num <= FADs:U = np.array([0 if random.random() <= 0.2 else 1 for i in range(D)])for i in range(N):R = np.random.random(size=D)Prey[i] += CF * (x_min + R * (x_max - x_min)) * Uelse: # random_num > FADsfor i in range(N):temp = np.random.randint(0, N, size=2)# r1 and r2 subscripts denote random indexes of prey matrix.r1, r2 = temp[0], temp[1]Prey[i] += (FADs * (1 - random_num) + random_num) * (Prey[r1] - Prey[r2])# 评估和替换for i in range(N):temp = eval(func)(Prey[i], x, y)# 比表上相应位置还要优if temp < e_value_lt[i]:Elite[i] = [value for value in Prey[i]]e_value_lt[i] = temp# 比全局最优还要优if temp < g_best_value:g_best = [value for value in Prey[i]]g_best_value = tempprint('gen_num_{}更新啦...\n g_best: {}, g_best_value: {}'.format(generation_num, g_best,g_best_value))print('final g_best: {}\ng_best_value: {}'.format(g_best, g_best_value))return g_best, g_best_valueMPA(x, y, "fc_MSE")
结语
参考文献: a paper:
Marine Predators Algorithm: A nature-inspired metaheuristic
Afshin Faramarzi…
海洋捕食者算法 MPA相关推荐
- 基于非线性参数的海洋捕食者算法
文章目录 一.理论基础 1.海洋捕食者算法(MPA) 2.非线性海洋捕食者算法(NMPA) 二.仿真实验与结果分析 三.参考文献 一.理论基础 1.海洋捕食者算法(MPA) 请参考这里. 2.非线性海 ...
- 基于海洋捕食者算法的无线传感器网络覆盖优化
文章目录 一.理论基础 1.节点覆盖模型 2.海洋捕食者算法(MPA) (1)初始化阶段 (2)MPA优化阶段 (3)FADs效应或涡流 二.实验仿真与结果分析 三.参考文献 一.理论基础 1.节点覆 ...
- MPA海洋捕食者算法学习笔记
mpa算法是2020年提出来的新型群体智能算法,原文Marine Predators Algorithm: A nature-inspired metaheuristic的doi:https://do ...
- MATLAB:海洋捕食者算法(MPA)优化BP神经网络权值和阈值用于月径流预测
海洋捕食者算法(Marine Predators Algorithm,MPA)是Afshin Faramarzi等人于2020年提出的一种新型元启发式优化算法,其灵感来源于海洋"适者生存&q ...
- MATLAB实战系列(三十九)-matlab多目标优化之海洋捕食者算法
前言 文中涉及代码可参见 matlab多目标优化之海洋捕食者算法 海洋捕食者算法(Marine Predators Algorithm, MPA)是Afshin Faramarzi等人于2020年提出 ...
- 多子群改进的海洋捕食者算法-附代码
多子群改进的海洋捕食者算法 文章目录 多子群改进的海洋捕食者算法 1.海洋捕食者算法 2.改进海洋捕食者算法 2.1 高斯变异 2.2 MSMPA 算法 3.实验结果 4.参考文献 5.Matlab代 ...
- 海洋捕食者算法介绍及TSP求解代码实现
海洋捕食者算法介绍及TSP求解代码实现 前言 一.海洋捕食者算法是什么? 二.MPA的具体内容 1.思想 2.相关术语 3.过程 三.用MPA求解旅行商(TSP)问题 1.TSP简介 2.过程与问题 ...
- MATLAB算法实战应用案例精讲-【智能优化算法】海洋捕食者算法(MPA) (附MATLAB和python代码实现)
目录 前言 知识储备 Lévy 飞行 布朗运动 算法原理 算法思想 数学模型
- MATLAB算法实战应用案例精讲-【智能优化算法】海洋捕食者算法(MPA)(补充篇) (附实战应用案例)
目录 前言 几个相关概念 算法原理 算法思想 伪代码 算法过程 知识拓展
最新文章
- tensorflow错误:Shape (10, ?) must have rank at least 3
- python报错'str' object is not callable
- Java Review - Java进程内部的消息中间件_Event Bus设计模式
- Linux网络编程 之 套接字(四)
- Tensorflow 之 name/variable_scope 变量管理
- FFT(快速傅里叶) c语言版
- 设计模式(八)桥接模式
- TP-LINK实现远程办公
- 04_python爬虫爬取超星回放
- Ubuntu 18.04缺少libstdc++.so.6共享库解决方案
- 配置路由器用SSH登陆
- oracle同义词删除重建,Oracle同义词的创建与删除
- android 电池容量修改,Android 使用adb查看和修改电池信息
- 粉条要经过什么检查才符合315?
- 班主任工作中如何融入生态文明教育?
- C语言程序设计李,C语言程序设计4--李2012.ppt
- linux中的nobody
- python中for无限循环_关于循环:在Python中从1循环到无穷大
- 条码打印机碳带装反了会怎么样
- linux开通80端口命令,Linux iptables开启80端口
热门文章
- 番外篇15:libevent简单理解(附libevent官方代码解析,和跨平台服务器、客户端链接代码)
- 关于Oculus无法下载应用:(OVR40779122) 的解决方案
- 【58沈剑架构系列】一分钟了解负载均衡的一切
- EXSI 中新建虚拟机
- 蛋白质结构信息获取与解析(基于Biopython)
- MATLAB GUIDE 面板(panel)上的控件消失问题和不靠谱的解决方案
- Android 6.0运行时权限管理
- Number Guessing
- 微信小程序中使用腾讯地图,导航到目的地
- 全国计算机等级考试二级公共,全国计算机等级考试二级公共基础知识.