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

2024-03-16 06:44

本文主要是介绍【智能算法】人工水母搜索算法(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.

这篇关于【智能算法】人工水母搜索算法(JS)原理及实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/814624

相关文章

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug