【Matlab】智能优化算法_亨利气体溶解度优化算法HGSO

news2024/12/26 2:34:21

【Matlab】智能优化算法_亨利气体溶解度优化算法HGSO

  • 1.背景介绍
  • 2.数学模型
    • 2.1 亨利定律
    • 2.2 HGSO
  • 3.文件结构
  • 4.伪代码
  • 5.详细代码及注释
    • 5.1 Create_Groups.m
    • 5.2 Evaluate.m
    • 5.3 fun_checkpoisions.m
    • 5.4 fun_getDefaultOptions.m
    • 5.5 HGSO.m
    • 5.6 main.m
    • 5.7 sumsqu.m
    • 5.8 update_positions.m
    • 5.9 update_variables.m
    • 5.10 worst_agents.m
  • 6.运行结果
  • 7.参考文献

1.背景介绍

以亨利定律的行为为基础,为HGSO提供了启示。亨利定律,由J.W.亨利于1800年首次提出。总的来说,在特定的温度或压力下,能够溶解在特定量的溶剂中的最大溶质量称为溶解度。因此,HGSO的行为受到了亨利定律的启发。根据等式(1)至(5),亨利定律可用于确定低溶解度气体在液体中的溶解度。

此外,温度和压力是影响溶解度的两个因素;在高温下,固体变得更易溶解,而气体则不易溶解。对于压力,气体的溶解度随着压力的增加而增加。我们的研究涉及气体的溶解度,如图1所示。

在这里插入图片描述

2.数学模型

2.1 亨利定律

1803年,威廉·亨利制定了亨利定律,即气体定律。亨利定律规定:在恒定温度下,溶解在给定类型和体积的液体中的给定气体的量与该气体与该液体平衡的分压成正比。因此,亨利定律高度依赖于温度,并表明气体的溶解度(Sg)与气体的分压(Pg)成正比,如以下方程所示:

在这里插入图片描述

其中H是亨利常数,该常数在给定温度下对于给定的气体-溶剂组合是特定的,并且气体的分压由Pg表示。

此外,还必须考虑温度对亨利定律常数的影响。亨利定律常数随系统温度的变化而变化,可以用Van’t Hoff方程描述如下:

在这里插入图片描述

其中∇sol E是溶解焓,R是气体常数,A和B是H的T依赖性的两个参数。因此,方程(1)可以积分如下:

在这里插入图片描述

其中H是参数a和B的函数,其中a和B是H的T依赖性的两个参数。或者,可以在参考温度T=298.15K下基于H创建表达式。

在这里插入图片描述

Van’t Hoff方程是有效的,当∇sol E是一个常数时,因此,方程(4)可以重新表述如下:

在这里插入图片描述

2.2 HGSO

步骤1:初始化过程。气体的数量(种群大小N)和气体的位置基于以下等式初始化:

在这里插入图片描述

其中,种群N中第i个气体的位置由X(i)表示,r是0和1之间的随机数,Xmin、Xmax是问题的边界,t是迭代时间。气体i的数量、类型j的亨利常数值(Hj(t))、簇j中气体i的分压Pi,j和类型j(Ci)的∇solE/R常数值使用以下方程初始化:

在这里插入图片描述

其中,l1、l2和l3分别定义为值等于(5E−02、100和1E−02)的常数。

步骤2:聚类。种群因子被划分为等同于气体类型数量的相等簇。每个星团都有相似的气体,因此具有相同的亨利常数值(Hj)。

步骤3:评估。对每个簇j进行评估,以从其类型中的其他簇中识别出达到最高平衡状态的最佳气体。然后,对气体进行排序,以获得整个群体中的最佳气体。

步骤4:更新亨利系数。亨利系数根据以下方程式进行更新:

在这里插入图片描述

其中,Hj是簇j的亨利系数,T是温度,Tθ是常数,等于298.15,iter是迭代总数。

步骤5:更新溶解度。溶解度根据以下方程式进行更新:

在这里插入图片描述

其中Si,j是气体i在簇j中的溶解度,Pi,j是簇j中气体i的分压,K是常数。

步骤6:更新位置。职位更新如下:

在这里插入图片描述

其中气体i在簇j中的位置表示为X(i,j),并且r和t分别是随机常数和迭代时间。X(i,best)是簇j中最好的气体i,而Xbest是群中最好的气。此外,γ是团簇i中气体j与其团簇中气体相互作用的能力,α是其他气体对团簇j中气体i的影响,等于1,β是常数。F(i,j)是簇j中气体i的适应度,相反,Fbest是整个系统中最佳气体的适应度。F是改变搜索代理方向并提供分集=±的标志。

X(i,best)和Xbest是负责平衡勘探和开发能力的两个参数。具体而言,X(i,best)是簇j中最好的气体i,而Xbest是群中最好的气。

步骤7:逃离局部最优。此步骤用于脱离局部最优。使用以下等式对最差代理的数量(Nw)进行排序和选择:

在这里插入图片描述

其中N是搜索代理的数量。

步骤8:更新最差代理的位置。

在这里插入图片描述

其中,G(i,j)是气体i在簇j中的位置,r是随机数,Gmin,Gmax是问题的边界。

最后,给出了该算法的伪代码,包括初始种群大小、种群评估和更新参数。

3.文件结构

在这里插入图片描述

Create_Groups.m					% 创建组
Evaluate.m						% 评估位置
fun_checkpoisions.m				% 检查位置
fun_getDefaultOptions.m 		% 获得默认选项
HGSO.m 							% 亨利气体溶解度优化算法
main.m							% 主函数
sumsqu.m 						% 归属权
update_positions.m 				% 更新位置
update_variables.m 				% 更新变量
worst_agents.m 					% 获取最差代理

4.伪代码

在这里插入图片描述

5.详细代码及注释

5.1 Create_Groups.m

function[Group]=Create_Groups(var_n_gases,var_n_types,X)
N=var_n_gases/var_n_types;
i=1;
for j=1:var_n_types
    Group{j}.Position=X(i:i+N,:);
    i=j*N+1;
    if i+N>var_n_gases
        i= j*N;
    end
end
end

5.2 Evaluate.m

function [X,best_fit,best_pos] = Evaluate(objfunc,var_n_types,var_n_gases, X,Xnew,init_flag)
if init_flag==1
    for j=1:var_n_gases/var_n_types
        X.fitness(j) = objfunc(X.Position(j,:));
    end
    
else
    for j=1:var_n_gases/var_n_types
        temp_fit = objfunc(Xnew.Position(j,:));
        if temp_fit<X.fitness(j)
            X.fitness(j)=temp_fit;
            X.Position(j,:)= Xnew.Position(j,:);
        end
    end
end
[best_fit,index_best]=min(X.fitness(:));
best_pos=X.Position(index_best,:);
end

5.3 fun_checkpoisions.m

function Group=fun_checkpoisions(dim,Group,var_n_gases,var_n_types,var_down,var_up)
Lb=var_down*ones(1,dim);
% Upper bounds
Ub=var_up*ones(1,dim);
for j=1:var_n_types
    for i=1:var_n_gases/var_n_types
        isBelow1 = Group{j}.Position(i,:) < Lb;
        isAboveMax = (Group{j}.Position(i,:) > Ub);
        if isBelow1 == true
            Group{j}.Position(i,:) =Lb;
        elseif find(isAboveMax== true)
            Group{j}.Position(i,:) = Ub;
        end
    end
    
end
end

5.4 fun_getDefaultOptions.m

function [var_n_gases,var_n_types,var_niter] = fun_getDefaultOptions()
var_n_gases          = 35;       % The swarm size.
var_n_types         = 5;       % The number of group.
var_niter          = 1000;      % The number of iterations.

end

5.5 HGSO.m

function [vec_Xbest, var_Gbest,vec_Gbest_iter] = HGSO(objfunc, dim,var_down,var_up,var_niter,var_n_gases,var_n_types)
if nargin<5
    [var_n_gases,var_n_types,var_niter]=fun_getDefaultOptions();
end
%constants in eq (7)
l1=5E-03;
l2=100;
l3=1E-02;
%constants in eq (10)
alpha=1;
beta=1;
%constant in eq (11)
M1=0.1;
M2=0.2;
%paramters setting in eq. (7)
K=l1*rand(var_n_types,1);
P=l2*rand(var_n_gases,1);
C=l3*rand(var_n_types,1);
%randomly initializes the position of agents in the search space
X=var_down+rand(var_n_gases,dim)*(var_up-var_down);
%The population agents are divided into equal clusters with the same Henry痴 constant value
Group=Create_Groups(var_n_gases,var_n_types,X);
% Compute cost of each agent
for i = 1:var_n_types
    [Group{i},best_fit(i),  best_pos{i}] = Evaluate(objfunc,var_n_types,var_n_gases, Group{i},0,1);
end
[var_Gbest, var_gbest] = min(best_fit);
vec_Xbest = best_pos{var_gbest};
for var_iter = 1:var_niter
    [S]=update_variables(var_iter,var_niter,K,P,C,var_n_types,var_n_gases);
    Groupnew=update_positions(Group,best_pos,vec_Xbest,S,var_n_gases,var_n_types,var_Gbest,alpha,beta,dim);
    Groupnew=fun_checkpoisions(dim,Groupnew,var_n_gases,var_n_types,var_down,var_up);
    for i = 1:var_n_types
        [Group{i},best_fit(i),  best_pos{i}] = Evaluate(objfunc,var_n_types,var_n_gases, Group{i},Groupnew{i},0);
        Group{i}=worst_agents(Group{i},M1,M2,dim,var_up,var_down,var_n_gases,var_n_types);
    end
    [var_Ybest, var_index] = min(best_fit);
    vec_Gbest_iter(var_iter)=var_Ybest;
    if var_Ybest<var_Gbest
        var_Gbest=var_Ybest;
        vec_Xbest = best_pos{var_index};
    end
    
end
end

5.6 main.m

clc;clear all;
close all;
fitfun = @sumsqu;
dim=30;
var_niter=1000;
Lb=-10;
Ub=10;
% var_n_gases=35;
% var_n_types=5;
[xf,fval,vec_Gbest_iter]=HGSO(fitfun,dim,Lb,Ub);
figure,
semilogy(vec_Gbest_iter,'r')
xlim([0 var_niter]);

5.7 sumsqu.m

function [y] = sumsqu(xx)


d = length(xx);
sum = 0;
for ii = 1:d
	xi = xx(ii);
	sum = sum + ii*xi^2;
end

y = sum;

end

5.8 update_positions.m

function [Group]=update_positions(Group,best_pos,vec_Xbest,S,var_n_gases,var_n_types,var_Gbest,alpha,beta,var_nvars)
vec_flag=[1,-1];
for i=1:var_n_types    
    for j=1:var_n_gases/var_n_types;
        gama=beta*exp(-(var_Gbest+.05)/(Group{i}.fitness(j)+.05));
        flag_index = floor(2*rand()+1);
        var_flag=vec_flag(flag_index);
        for k=1:var_nvars
            Group{i}.Position(j,k)=  Group{i}.Position(j,k)+var_flag*rand*gama*(best_pos{i}(k)-Group{i}.Position(j,k))+rand*alpha*var_flag*(S(i)*vec_Xbest(k)-Group{i}.Position(j,k));
        end
    end
end
end

5.9 update_variables.m

function [S]=update_variables(var_iter,var_niter,K,P,C,var_n_types,var_n_gases)
T=exp(-var_iter/var_niter);
T0= 298.15;
i=1;
N=var_n_gases/var_n_types;
for j=1:var_n_types
    K(j)=K(j)*exp(-C(j)*(1/T-1/T0));
    S(i:i+N,:)=P(i:i+N,:)*K(j);
    i=j*N+1;
    if i+N>var_n_gases
        i= j*N;
    end
end
end

5.10 worst_agents.m

function [X]=worst_agents(X,M1,M2,dim,G_max,G_min,var_n_gases,var_n_types)
%Rank and select number of worst agents eq.(11)
  [X_sort,X_index]=sort(X.fitness(:),'descend');
        M1N =M1*var_n_gases/var_n_types;
        M2N = M2*var_n_gases/var_n_types;
        Nw = round((M2N-M1N).*rand(1,1) + M1N);
        for k=1:Nw
            X.Position(X_index(k),:)=G_min+rand(1,dim)*(G_max-G_min);
        end
        
end

6.运行结果

在这里插入图片描述

7.参考文献

[1]Hashim A F,Houssein H E,Mabrouk S M, et al. Henry gas solubility optimization: A novel physics-based algorithm[J]. Future Generation Computer Systems,2019,101©.

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

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

相关文章

机器学习总览

机器学习 1.什么是机器学习&#xff1f; 机器学习是使计算机像人类一样学习与行动的科学&#xff0c;并通过观察与现实世界交互的形式向计算机提供数据和信息&#xff0c;从而随着时间的推移以自主的方式改善其学习。 通过经验提高某些任务性能的计算机程序。 人工智能>机器…

FreeRTOS ~(六)信号量 ~ (1/3)信号量解决同步缺陷

前情提要 FreeRTOS ~&#xff08;四&#xff09;同步互斥与通信 ~ &#xff08;1/3&#xff09;同步的缺陷 FreeRTOS ~&#xff08;五&#xff09;队列的常规使用 ~ &#xff08;1/5&#xff09;队列解决同步缺陷 举例子说明&#xff1a;利用信号量解决前述的"同步的缺陷&…

最具价值开源项目收藏--持续更新

轻量级开源笔记应用&#xff08;memos&#xff09; 该项目基于 Go React.js SQLite 技术栈开发&#xff0c;兼具高性能与可定制性&#xff0c;适用于日常生活办公中的各类笔记管理场景。 开源地址&#xff1a;https://github.com/usememos/memos 跨平台无缝传输文件&#…

揭秘python函数:编程艺术的核心力量(3)

文章目录 前言递归lambda表达式lambda 的参数形式无参数位置参数关键字参数缺省参数可变参数1.包裹位置传递2.包裹关键字传递 带判断条件的lambda表达式列表数据按照字典key的值进行排序 高阶函数的使用内置高阶函数1.map()2.reduce()3.filter() 前言 前面我们已经学习了 pyth…

7-测试模型(2个)

目录 1.软件测试V模型 2.软件测试W模型&#xff08;双V模型&#xff09; 1.软件测试V模型 V模型最早是由Paul Rook在2&#xff10;世纪&#xff18;&#xff10;年代后期提出的&#xff0c;目的是改进软件开发的效率和效果。是瀑布模型的变种。 明确地标注了测试过程中存在的…

前端工程打包部署

打包 直接执行第二个脚本build即可 打包后的文件将会放在dist目录下 部署 NGINX&#xff1a;是一款轻量级的Web服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。其特点是占用内存少&#xff0c;并发能力强&#xff0c;在各大型互联网公司都有非…

R中高效安装包,以ComplexHeatmap包为例

包安装问题解决方案 1. Biocmanager安装 [2. 手动安装]&#xff08;正在更新……&#xff09; 目录 包安装问题解决方案前言1. install.packages()的介绍1.1 install.packages()的工作原理1.2 install.packages()安装失败的原因1.3 解决方案 2. BiocManage安装ComplexHeatmap总…

kubernetes的概念以及部署

简介&#xff1a; kubernetes&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本&#xff0c;于2014年9月发布第一个版本&#xff0c;2015年7月发布第一个正式版本。 kubernetes的本质是…

PDF怎么免费分割成多个文件?这几个方法非常好用!

记灵在线工具是一种常用的电子工具&#xff0c;尤其在工作和学习中&#xff0c;我们经常需要使用记灵工具进行文档处理和整理。其中&#xff0c;记灵工具的分割功能是非常有用的&#xff0c;因为它可以将一个大的文件分割成多个较小的文件&#xff0c;从而便于我们对文件进行分…

Ubuntu22.04如何安装steam游戏平台

linux终端安装 安装命令1 打开终端&#xff0c;输入以下命令安装&#xff1a; sudo snap install steam 安装命令2 1.在这种安装模式下&#xff0c;我们使用的是指令安装&#xff0c;这时我们需要打开终端&#xff08;cmd/控制台&#xff09;随后输入此指令&#xff1a;“su…

口语理解任务源码详解系列(三)利用BiRNN-attention模型实现

利用RNN-attention模型实现 写在前面 在前文介绍了项目的数据集构建&#xff1a;传送门&#xff0c;以及利用seq2seq-attention模型实现意图分类与槽位填充任务&#xff1a;传送门 本文利用BiRNN-attention实现&#xff1a;实现细节请参考论文&#xff1a;《Attention-Based Re…

一键搞定发布自己Jar到Maven中央仓库

做java 开发那当然离不开jar包管理, 不知何时一直想想封装一个自己的jar包 然后发布到maven中央仓库给别人使用。 hhh 我感觉自己写一个jar包工具然后&#xff0c;被很多人使用是一件很牛&#xff0c;很快乐事情。 终于有了这个机会&#xff0c;和时间。SpringBoot stater出来了…

Steam搬砖项目介绍

Steam搬砖项目&#xff1a;轻松赚取稳定收入的副业选择 对于许多数字游戏玩家来说&#xff0c;Steam平台并不陌生。今天&#xff0c;我将向您介绍一个稳定的副业选择——Steam搬砖项目。通通过简单的操作&#xff0c;您可以轻松获得几十上百元的利润。 介绍 Steam搬运砖项目…

css 伪元素和浮动

展示为行内元素 inline-block <style>div {/* 浏览器解析行内块或行内标签的时候, 如果标签换行书写会产生一个空格的距离, 展示为行内元素 */display: inline-block;width: 100px;height: 100px;}.one {background-color: pink;}.two {background-color: skyblue;}</…

基于OpenCV 实现车牌号码识别--附免费源码

在本教程中,您将学习如何使用 OpenCV 和 EasyOCR 包自动执行车牌/车牌识别 (LPR/NPR)。 EasyOCR是一个开源 Python 包,用于执行光学字符识别 - OCR(从图像中提取文本)。 该软件包非常易于使用,在撰写本文时,它支持 80 多种语言,包括中文、阿拉伯语、法语、英语、西里尔…

多元回归预测 | Matlab主成分分析PCA降维,BP神经网络回归预测。PCA-BP回归预测模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab主成分分析PCA降维,BP神经网络回归预测。PCA-BP回归预测模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环境变量 warnin…

【脚本语言】Shell Script - 日期的获取、设置和延时操作

目录 基础概念 基础语法 打印当前日期 打印纪元时 将日期转换为纪元时 打印要求格式的日期 设置日期和时间 基础概念 Bash可以帮助我们以不同的格式打印日期、设置日期&#xff0c;又或根据日期或时间进行操作等。 在类Unix系统中&#xff0c;日期被存储为一个整数&#xff0…

阿里云服务器架构x86、GPU、ARM、裸金属和超级计算集群说明

阿里云服务器架构有什么区别&#xff1f;X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、超级计算集群有什么区别&#xff1f;阿里云服务器网分享云服务器ECS架构详细说明&#xff1a; 目录 阿里云服务器ECS架构说明 X86计算 ARM计算 GPU/FPGA/ASIC 弹性裸金属服务…

在 CI/CD流水线中运行自动化单元测试的4个原因

目录 什么是单元测试&#xff1f; C#中的单元测试示例 我需要在CI/CD 流水线中运行自动化测试吗&#xff1f; 开发人员代码验证反馈循环 预验证 步步为营 减少“另一个开发人员写了这段代码”的问题 什么是单元测试&#xff1f; 单元测试 什么是单元测试&#xff1f; 单…

【MySQL】内置函数详解

【MySQL】内置函数详解 日期函数字符串函数数学函数加密函数与其它 日期函数 --获取当前日期 mysql> select current_date(); ---------------- | current_date() | ---------------- | 2023-07-09 | ---------------- --获取当前时间 mysql> select current_time();…