【智能算法】人工水母搜索算法(JS)原理及实现

在这里插入图片描述

目录

    • 1.背景
    • 2.算法原理
      • 2.1算法思想
      • 2.2算法过程
    • 3.代码实现
    • 4.参考文献


1.背景

2020年,Chou 等人受到水母运动行为启发,提出了人工水母搜索算法(Artificial Jellyfish Search Optimizer, JS)。

2.算法原理

2.1算法思想

JS模拟了水母的搜索行为,包括追随海流、水母群内的主动和被动运动、时间控制机制以及群聚过程。
在这里插入图片描述

2.2算法过程

洋流
海洋中蕴含着大量的营养物质,这些物质会吸引水母。洋流的方向是通过对每个水母到处于最佳位置的水母(适应度度量)所有向量进行平均。
t r e n d → = 1 n P o p ∑ t r e n d → i = 1 n P o p ∑ ( X ∗ − e c X i ) = X ∗ − e c ∑ X i n P o p = X ∗ − e c μ \overrightarrow{\mathrm{trend}}=\frac{1}{\mathrm{n}_{\mathrm{Pop}}}\sum\overrightarrow{\mathrm{trend}}_{\mathrm{i}}=\frac{1}{\mathrm{n}_{\mathrm{Pop}}}\sum\left(X^{*}-\mathrm{e}_{\mathrm{c}}X_{\mathrm{i}}\right)=X^{*}-\mathrm{e}_{\mathrm{c}}\frac{\sum X_{\mathrm{i}}}{\mathrm{n}_{\mathrm{Pop}}}=X^{*}-\mathrm{e}_{\mathrm{c}}\mu trend =nPop1trend i=nPop1(XecXi)=XecnPopXi=Xecμ
这里,令 d f = e c μ \mathbf{df}=\mathbf{e}_{\mathbf{c}}\mu df=ecμ,则洋流方向可以描述为:
t r e n d → = X ∗ − d f \overrightarrow{\mathrm{trend}}=\mathrm{X}^{*}-\mathrm{df} trend =Xdf
假设水母在所有维度上分布服从正态空间分布:
在这里插入图片描述
因此,可以进行简化:
d f = β × r a n d ( 0 , 1 ) × μ \mathrm{df}=\beta\times\mathrm{rand}(0,1)\times\mu df=β×rand(0,1)×μ
每只水母位置更新:
X i ( t + 1 ) = X i ( t ) + r a n d ( 0 , 1 ) × ( X ∗ − β × r a n d ( 0 , 1 ) × μ \mathrm{X_i(t+1)=X_i(t)+rand(0,1)\times(X^*-\beta\times rand(0,1)\times\mu} Xi(t+1)=Xi(t)+rand(0,1)×(Xβ×rand(0,1)×μ
水母群体运动
在群集中,水母分别表现出被动(类型A)和主动(类型B)的运动 。最初,当群集刚形成时,大多数水母表现出类型A的运动。随着时间的推移,它们逐渐表现出类型B的运动。类型A运动是水母围绕自身位置的运动(全局探索),每个水母的相应更新位置由:
X i ( t + 1 ) = X i ( t ) + γ × r a n d ( 0 , 1 ) × ( U b − L b ) \mathrm{X_i(t+1)=X_i(t)+\gamma\times rand(0,1)\times(U_b-L_b)} Xi(t+1)=Xi(t)+γ×rand(0,1)×(UbLb)
B类型运动可以看作种群间根据食物数量(适应度衡量)进行互相迁移,比如当水母 i i i处食物数量大于水母 j j j处,则水母 j j j向水母 i i i移动,反之亦然。(此阶段为局部探索)
S t e p = X i ( t + 1 ) − X i ( t ) Direction → = X j ( t ) − X i ( t ) i f f ( X i ) ≥ f ( X j ) X i ( t ) − X j ( t ) i f f ( X i ) < f ( X j ) \mathrm{Step}=\mathrm{X_i(t+1)-X_i(t)} \\ \overrightarrow{\text{Direction}}=\begin{matrix}\mathsf{X_j(t)-X_i(t)~if~f(X_i)\geq f(X_j)}\\\mathsf{X_i(t)-X_j(t)~if~f(X_i)<f(X_j)}\end{matrix} Step=Xi(t+1)Xi(t)Direction =Xj(t)Xi(t) if f(Xi)f(Xj)Xi(t)Xj(t) if f(Xi)<f(Xj)
其中, S t e p → = r a n d ( 0 , 1 ) × D i r e c t i o n → \overrightarrow{\mathrm{Step}}=\mathrm{rand}(0,1)\times\overrightarrow{\mathrm{Direction}} Step =rand(0,1)×Direction ,因此整体可表述为:
X i ( t + 1 ) = X i ( t ) + S t e p → \mathrm{X_i(t+1)=X_i(t)+\overrightarrow{Step}} Xi(t+1)=Xi(t)+Step
时间控制机制
海洋流富含营养食物,吸引了水母的聚集形成水母群。随着温度或风向变化,水母群会转移至新的海洋流形成新的群体。水母群内的水母表现出被动和主动两种运动,其偏好会随着时间变化。引入时间控制机制来调节水母在海洋流和群内移动之间的转换。(这里是对全局与局部平衡,收敛性考虑)
在这里插入图片描述

c ( t ) = ∣ ( 1 − t M a x i t e r ) × ( 2 × r a n d ( 0 , 1 ) − 1 ) ∣ \mathbf{c(t)}=\left|\left(1-\frac{\mathbf{t}}{\mathbf{Max}_{\mathrm{iter}}}\right)\times(2\times\mathrm{rand}(0,1)-1)\right| c(t)= (1Maxitert)×(2×rand(0,1)1)
伪代码
在这里插入图片描述

3.代码实现

% 水母搜索算法
function [Best_pos, Best_fitness, Iter_curve, History_pos, History_best] = JS(pop, maxIter,lb,ub,dim,fobj)
%input
%pop 种群数量
%dim 问题维数
%ub 变量上边界
%lb 变量下边界
%fobj 适应度函数
%maxIter 最大迭代次数
%output
%Best_pos 最优位置
%Best_fitness 最优适应度值
%Iter_curve 每代最优适应度值
%History_pos 每代种群位置
%History_best 每代最优个体位置
%% 初始化种群
X = initialization(pop,dim,ub,lb);
VarSize = [1 dim];
%% 计算适应度
popCost = zeros(1,pop);
for i=1:poppopCost(i) = fobj(X(i,:));
end
%% 迭代
for it=1:maxIterMeanvl=mean(X,1);[value,index]=sort(popCost);Best_pos=X(index(1),:);BestCost=popCost(index(1));for i=1:pop% Calculate time control c(t) using Eq. (17);Ar=(1-it*((1)/maxIter))*(2*rand-1);if abs(Ar)>=0.5%% Folowing to ocean current using Eq. (11)newsol = X(i,:)+ rand(VarSize).*(Best_pos - 3*rand*Meanvl);% Check the boundary using Eq. (19)newsol = simplebounds(newsol,lb,ub);% EvaluationnewsolCost = fobj(newsol);% Comparisonif newsolCost<popCost(i)X(i,:) = newsol;popCost(i)=newsolCost;if popCost(i) < BestCostBestCost=popCost(i);Best_pos = X(i,:);endendelse%% Moving inside swarmif rand<=(1-Ar)% Determine direction of jellyfish by Eq. (15)j=i;while j==ij=randperm(pop,1);endStep = X(i,:) - X(j,:);if popCost(j) < popCost(i)Step = -Step;end% Active motions (Type B) using Eq. (16)newsol = X(i,:) + rand(VarSize).*Step;else% Passive motions (Type A) using Eq. (12)newsol = X(i,:) + 0.1*(ub-lb)*rand;end% Check the boundary using Eq. (19)newsol = simplebounds(newsol, lb,ub);% EvaluationnewsolCost = fobj(newsol);% Comparisonif newsolCost<popCost(i)X(i,:) = newsol;popCost(i)=newsolCost;if popCost(i) < BestCostBestCost=popCost(i);Best_pos = X(i,:);endendendend%% Store Record for Current IterationIter_curve(it)=BestCost;Best_fitness = BestCost;History_best{it} = Best_pos;History_pos{it} = X;
end
end
%% This function is for checking boundary by using Eq. 19
function s=simplebounds(s,Lb,Ub)
ns_tmp=s;
I=ns_tmp<Lb;
% Apply to the lower bound
while sum(I)~=0ns_tmp(I)=Ub(I)+(ns_tmp(I)-Lb(I));I=ns_tmp<Lb;
end
% Apply to the upper bound
J=ns_tmp>Ub;
while sum(J)~=0ns_tmp(J)=Lb(J)+(ns_tmp(J)-Ub(J));J=ns_tmp>Ub;
end
% Check results
s=ns_tmp;
end
%%
function pop=initialization(num_pop,nd,Ub,Lb)if size(Lb,2)==1Lb=Lb*ones(1,nd);Ub=Ub*ones(1,nd);
end
x(1,:)=rand(1,nd);
a=4;
for i=1:(num_pop-1)x(i+1,:)=a*x(i,:).*(1-x(i,:));
end 
for k=1:ndfor i=1:num_poppop(i,k)=Lb(k)+x(i,k)*(Ub(k)-Lb(k));end
end
end

在这里插入图片描述

4.参考文献

[1] Chou J S, Truong D N. A novel metaheuristic optimizer inspired by behavior of jellyfish in ocean[J]. Applied Mathematics and Computation, 2021, 389: 125535.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/747237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于OPC-UA客户端调用服务端方法CallMethod节点的问题

在OpcUaClient中可以通过CallMethodByNodeId调用方法节点 //// 摘要:// call a server method//// 参数:// tagParent:// 方法的父节点tag//// tag:// 方法的节点tag//// args:// 传递的参数//// 返回结果:// 输出的结果值public object[] CallMetho…

栈与队列|232.用栈实现队列

力扣题目链接 class MyQueue { public:stack<int> stIn;stack<int> stOut;/** Initialize your data structure here. */MyQueue() {}/** Push element x to the back of queue. */void push(int x) {stIn.push(x);}/** Removes the element from in front of que…

数据结构--线性表

1.线性表的定义&#xff1a; 存在唯一的一个被称为“第一个”的数据元素&#xff1b; 存在唯一的一个被称为“最后一个”的数据元素&#xff1b; 除第一个之外&#xff0c;集合中的每一个数据元素都只有一个前驱&#xff1b; 除最后一个之外&#xff0c;集合中的每一个数据…

大话设计模式——7.抽象工厂模式(Abstract Factory Pattern)

1.介绍 抽象工厂模式是工厂模式的进一步优化&#xff0c;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。属于创建型模式。 UML图&#xff1a; 2.示例 车辆制造工厂&#xff0c;不仅可以制造轿车也可以用来生产自行车。 1&#xff09;Abs…

vivado 逻辑优化约束、功率优化、Vivado Tools电源优化

逻辑优化约束 逻辑保护 Vivado设计套件在逻辑优化过程中尊重DONT_TOUCH属性。确实如此不优化具有这些特性的离开网或单元。为了加快网络选择过程&#xff0c;网络具有DONT_TOUCH的属性被预过滤并且不被考虑用于物理优化。对于有关详细信息&#xff0c;请参阅《Vivado Design …

10、MongoDB -- MongoDB 的 MongoTemplate 的功能和用法介绍

目录 MongoTemplate 的功能和用法演示前提&#xff1a;登录单机模式的 mongodb 服务器命令登录【test】数据库的 mongodb 客户端命令登录【admin】数据库的 mongodb 客户端命令 为 MongoDB 提供的两个 Starterspring-boot-starter-data-mongodb&#xff08;为以同步方式操作 Mo…

C语言:操作符详解(下)

目录 一、逗号表达式二、下标访问[ ]、函数调用()1. [ ]下标引用操作符2.函数调用操作符 三、结构成员访问操作符1.结构体(1) 结构的声明(2) 结构体变量的定义和初始化 2.结构成员访问操作符(1)结构体成员的直接访问(2)结构体成员的间接访问 四、操作符的属性&#xff1a;优先级…

深入理解JMM

一、什么是JMM JMM&#xff08;java memory model&#xff09;Java内存模型&#xff1a;是java虚拟机规范中定义的一组规范&#xff0c;用于屏蔽掉各种硬件和操作系统的内存访问差异&#xff0c;以实现让JAVA程序在各平台都能达到一致的并发结果。其主要规定了线程和内存之间的…

对称加密算法(DES、AES)

加密密钥 解密密钥 DES现在基本不再使用 3DES处理速度慢 AES通常用于移动通信系统加密以及基于SSH协议的软件

c++入门你需要知道的知识点(上)

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今日主菜&#xff1a;c入门 主厨&#xff1a;邪王真眼 所属专栏&#xff1a;c专栏 主厨的主页&#xff1a;Chef‘s blog 前言&#xff1a; 咱也是好久没有更…

Leet code 1658 将x减到0的最小操作数

解题思路&#xff1a;滑动窗口 主要思想&#xff1a;正难逆简 题目需要左找一个数 右找一个数 我们不如直接找中间最长的一连串子数让这串子树和为 数组子树和减去X 找不到就返回 -1 滑动窗口双指针从左端出发&#xff0c;进行 进窗口 判断 出窗口 更新结果四个步骤 代码…

防火墙中的SNAT 与DNAT

SNAT&#xff1a;让内网机器可以访问外网服务器 DNAT:让外网机器可以访问内网服务器 SNAT的原理 源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映射 数据包从内网发送到公网时&#xff0c;SNAT会把数据包的源IP由私网IP转换成公网IP 当响应…

【JetsonNano】onnxruntime-gpu 环境编译和安装,支持 Python 和 C++ 开发

1. 设备 2. 环境 sudo apt-get install protobuf-compiler libprotoc-devexport PATH/usr/local/cuda/bin:${PATH} export CUDA_PATH/usr/local/cuda export cuDNN_PATH/usr/lib/aarch64-linux-gnu export CMAKE_ARGS"-DONNX_CUSTOM_PROTOC_EXECUTABLE/usr/bin/protoc&qu…

OJ_点菜问题(背包问题)

题干 C实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> using namespace std;int main() {int c, n;scanf("%d%d", &c, &n);int p[101];int v[101];for (int i 0; i < n; i){scanf("%d%d", &p[i],…

Android Studio实现内容丰富的安卓宠物用品管理系统

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号128 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.系统公告 3.宠物社区&#xff08;可发布宠物帖子&#xf…

47、C++/引用,函数重载,类相关学习20240312

一、自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show()。 代码&…

架构设计-复杂度来源:高性能

对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力。例如计算机&#xff0c;从电子管计算机到晶体管计算机再到集成电路计算机&#xff0c;运算性能从每秒几次提升到每秒几亿次。但伴随性能越来越高&#xff0c;相应的方法和系统复杂度也是越来越高。现代的计算机 CPU 集…

Html+threejs数字孪生三维场景实现

程序示例精选 Htmlthreejs数字孪生三维场景实现 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Htmlthreejs数字孪生三维场景实现》编写代码&#xff0c;代码整洁&#xff0c;规则&#xf…

第十四届蓝桥杯省赛真题 Java 研究生 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 特殊日期试题 B: 与或异或试题 C: 棋盘试题 D: 子矩阵试题 E : \mathrm{E}: E: 互质数的个数试题 F: 小蓝的旅行计划试题 G: 奇怪的数试题 H: 太阳试题 I: 高塔试题 J \mathrm{J} J : 反异或 01 串 发现宝藏 前些天发现了一个巨牛的人…

helm部署hadoop

&#xff08;作者&#xff1a;陈玓玏&#xff09; 参考helm仓库的文档&#xff1a;https://artifacthub.io/packages/helm/apache-hadoop-helm/hadoop helm helm repo add pfisterer-hadoop https://pfisterer.github.io/apache-hadoop-helm/ helm install hadoop pfistere…