饥饿游戏搜索算法(HGS)(含java实现代码)

Hunger games search: Visions, conception, implementation, deep analysis, perspectives, and towards performance shifts

期刊:Expert Systems With Applications SCI1区

主体框架

    public HGS(){initialize();calculateFitness();sortTheFitness();calculateHungry();for (t = 0;t<T;t++){UpdateWeight();UpdateLocation();calculateFitness();sortTheFitness();calculateHungry();savePoints();}}

ps:经过多次的复现以后,我发现实现一个算法最快的方式就是先将算法分模块搞好,所以上来先贴一个框架图。

在这里插入图片描述

这篇论文主要分为四个模块,分别是初始化模块,适应度与饥饿值设置模块,权重更新模块,位置更新模块。

论文有意思的点:

在这篇文章里面的公式非常的多,但是在这里我只想着重介绍这篇论文的创新点:饥饿机制。

文章定义了一个叫饥饿值的东西,如下公式所示。我们发现当且仅当i适应度值最小的时候,饥饿值为0,别的情况饥饿值为上次的饥饿值加上H。也就是说,只要适应度高,那么就会越来越饥饥饿。后面我们再说这个饥饿度怎么用。值得注意的是:每一轮迭代都会更新一次hungry值

hungry  ( i ) = { 0 , AllFitness  ( i ) = = B F hungry  ( i ) + H , AllFitness  ( i ) ! = B F \text { hungry }(i)=\left\{\begin{array}{c}0, \text { AllFitness }(i)==B F \\\text { hungry }(i)+H, \text { AllFitness }(i) !=B F\end{array}\right.  hungry (i)={0, AllFitness (i)==BF hungry (i)+H, AllFitness (i)!=BF

其中 B F BF BF为最差的适应度,也就是最小的适应度值。 H H H的定义如下所示

T H = F ( i ) − B F W F − B F × r 6 × 2 × ( U B − L B ) H = { L H × ( 1 + r ) , T H < L H T H , T H ≥ L H \begin{aligned}&T H=\frac{F(i)-B F}{W F-B F} \times r_6 \times 2 \times(U B-L B)\\&H=\left\{\begin{array}{c}L H \times(1+r), T H<L H \\T H, T H \geq L H\end{array}\right.\end{aligned} TH=WFBFF(i)BF×r6×2×(UBLB)H={LH×(1+r),TH<LHTH,THLH

其中 F ( i ) F(i) F(i)为适应度值, W F WF WF(Worse Fitness)为最大的适应度值(至今为止), U B 和 L B UB和LB UBLB为问题空间的上下界。 L H LH LH(Limit Hungry)则为饥饿感的下限,r是一个随机值。

也就是说当适应度值 F ( i ) F(i) F(i)越小的时候, T H TH TH(Temp Hungry)会越小,当低于上限的时候,本轮增加的饥饿度 H H H,将会被设置为大于 T H TH TH的一个随机值。

我们从上面的三个公式只要知道一个关键结论就好了:

适应度越小,越不饥饿。

适应度越大,这轮增加的饥饿度越高。

那么这个饥饿度值该怎么用呢?

W 1 ( i ) → = { hungry  ( i ) ⋅ N SHungry  × r 4 , r 3 < l 1 , r 3 > l \overrightarrow{W_1(i)}=\left\{\begin{array}{c}\text { hungry }(i) \cdot \frac{N}{\text { SHungry }} \times r_4, r_3<l \\1, r_3>l\end{array}\right. W1(i) ={ hungry (i) SHungry N×r4,r3<l1r3>l

W 2 ( i ) → = ( 1 − exp ⁡ ( − ∣ hungry  ( i ) − SHungry  ∣ ) ) × r 5 × 2 \overrightarrow{W_2(i)}=(1-\exp (-\mid \text { hungry }(i)-\text { SHungry } \mid)) \times r_5 \times 2 W2(i) =(1exp( hungry (i) SHungry ))×r5×2

论文构建了两个向量,分别是 W 1 ( i ) , W 2 ( i ) W_1(i),W_2(i) W1(i),W2(i),这两个向量负责对个体进行变异,这里最关键的点是 S H u n g r y SHungry SHungry,这是所有 h u n g r y hungry hungry的总和,我们可以发现,两个向量组的规律。

对于 W 1 ( i ) W_1(i) W1(i)而言,hungry越小,里面的值越小

对于 W 2 ( i ) W_2(i) W2(i)而言,hungry越小,里面的值越接近2也就是说里面的值越大。

X ( t + 1 ) → = { Game  1 : X ( t ) → ⋅ ( 1 + randn ⁡ ( 1 ) ) , r 1 < l Game  2 : W 1 → ⋅ X b → + R ⃗ ⋅ W 2 → ⋅ ∣ X b → − X ( t ) → ∣ , r 1 > l , r 2 > E Game  3 : W 1 → ⋅ X b → − R ⃗ ⋅ W 2 → ⋅ ∣ X b → − X ( t ) → ∣ , r 1 > l , r 2 < E \overrightarrow{X(t+1)}=\left\{\begin{array}{c}\text { Game }_1: \overrightarrow{X(t)} \cdot(1+\operatorname{randn}(1)), r_1<l \\\text { Game }_2: \overrightarrow{W_1} \cdot \overrightarrow{X_b}+\vec{R} \cdot \overrightarrow{W_2} \cdot\left|\overrightarrow{X_b}-\overrightarrow{X(t)}\right|, r_1>l, r_2>E \\\text { Game }_3: \overrightarrow{W_1} \cdot \overrightarrow{X_b}-\vec{R} \cdot \overrightarrow{W_2} \cdot\left|\overrightarrow{X_b}-\overrightarrow{X(t)}\right|, r_1>l, r_2<E\end{array}\right. X(t+1) =  Game 1:X(t) (1+randn(1)),r1<l Game 2:W1 Xb +R W2 Xb X(t) ,r1>l,r2>E Game 3:W1 Xb R W2 Xb X(t) ,r1>l,r2<E

最后,每轮迭代的时候都根据上面的公式对位置进行变换,在文中,l被设置为0.08,在公式1中,其实就是一个高斯变异,烟花算法也用到这个。

公式二和三,本质上是一个DE,差分进化的两个公式都是没头脑的,就算正向学习和反向学习,很多论文也有这个。最后还有个E,这个E也是作者自己设定的一个阈值,可以参照野狗群算法,不过作者将这个搜索阈值自己自定义了:

E = sech ⁡ ( ∣ F ( i ) − B F ∣ ) E=\operatorname{sech}(|F(i)-B F|) E=sech(F(i)BF)

( sech ⁡ ( x ) = 2 e x + e − x ) \left(\operatorname{sech}(x)=\frac{2}{e^x+e^{-x}}\right) (sech(x)=ex+ex2)

sech就是双曲正割函数

在这里插入图片描述

x越大,y越小,也就是说,当前解的适应度值越小,E就会越接近1,公式3被调用的概率就会变高。当前的解适应度越大,E就会越接近0,公式2被调用的概率越大。

最后再补充一个

R ⃗ = 2 × shrink  × rand  − shrink  shrink  = 2 × ( 1 − t T ) \begin{aligned}& \vec{R}=2 \times \text { shrink } \times \text { rand }- \text { shrink } \\& \text { shrink }=2 \times\left(1-\frac{t}{T}\right)\end{aligned} R =2× shrink × rand  shrink  shrink =2×(1Tt)

这个东西就是随着迭代次数,波动逐渐减少的向量,最后会收敛到0,值得注意的是R里面是有正有负的,意味着game2和game3是存在等效的情况。

实验的截图~
在这里插入图片描述
在这里插入图片描述

寻找sphere最小值。

实际代码

import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.util.List;
import java.util.function.Consumer;/*** Hunger games search: Visions, conception, implementation, deep analysis, perspectives, and towards performance shifts*/public class HGS {int N = 30;//5 10 30 50 100Double D;Double L = 0.08;Double H;Double SHungry;List<Double> Xb;double BF = Double.MAX_VALUE;double WF = -Double.MAX_VALUE;double lb = 0;double ub = 1;int dimension = 30;int t;int T = 1000;List<Double> R = new ArrayList<>(dimension);ArrayList<Point> res = new ArrayList<>();double LH = 10000;public HGS(){initialize();calculateFitness();sortTheFitness();calculateHungry();for (t = 0;t<T;t++){UpdateWeight();UpdateLocation();calculateFitness();sortTheFitness();calculateHungry();savePoints();}}public static void main(String[] args) {HGS hgs = new HGS();ArrayList<Point> points = hgs.res;// 创建绘制折线图的窗口JFrame frame = new JFrame("折线图");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.add(new LineChart(points));frame.setSize(800, 600);frame.setLocationRelativeTo(null);frame.setVisible(true);}public void savePoints(){System.out.println("curt:"+t+",BF="+BF);res.add(new Point(t,(int)(BF*100000)));}List<Individual> individuals = new ArrayList<>();public void initialize(){IndividualFactory individualFactory = new IndividualFactory(dimension,lb,ub);individuals = individualFactory.getRandomIndividuals(N);t = 0;}public void calculateFitness(){for (Individual i:individuals) {i.UpDateFitness();}}public void sortTheFitness(){individuals.sort((a,b)->new Double(a.fitness).compareTo(b.fitness));//按照适应度排序WF = Math.max(WF,individuals.get(N-1).fitness);if(BF>individuals.get(0).fitness){BF = individuals.get(0).fitness;Xb = new ArrayList<>(individuals.get(0).position);//copy一份}BF = Math.min(BF,individuals.get(0).fitness);}public void calculateHungry(){for (Individual i:individuals) {if(i.fitness==BF){i.hungry = 0;}else {double r6 = Math.random();Double TH = (i.fitness-BF)/(WF-BF)*r6*2*(ub-lb);Double H;if(TH<LH){H = LH*(1+Math.random());}else {H = TH;}i.hungry = i.hungry+H;}}}public void UpdateWeight(){double SHungry = 0;for (Individual i:individuals) {SHungry+=i.hungry;}for (Individual i:individuals) {i.updateW(N,SHungry,L);}}public void UpdateLocation(){for (Individual i:individuals) {i.upDateLocation(L,t,T,Xb,BF);}}
}class Individual{double hungry;double fitness;double lb;double ub;List<Double> position = new ArrayList<>();List<Double> w1;List<Double> w2;int dimension;public double getHungry() {return hungry;}public void setHungry(double hungry) {this.hungry = hungry;}public Individual(double lb, double ub, List<Double> position) {this.lb = lb;this.ub = ub;this.position = position;dimension = position.size();w1 = new ArrayList<>(dimension);w2 = new ArrayList<>(dimension);for (int i = 0; i < dimension; i++) {w1.add(0.0);w2.add(0.0);}}public void Game1(){//formula 2.1Random random = new Random();for (int i = 0; i < dimension; i++) {double originX = position.get(i);position.set(i,originX*(1+random.nextGaussian()));}}public void Game2(List<Double> R,List<Double> Xb){//formula 2.1for (int i = 0; i < dimension; i++) {position.set(i,w1.get(i)*Xb.get(i)+R.get(i)*w2.get(i)*Math.abs(Xb.get(i)-this.position.get(i)));}}public void Game3(List<Double> R,List<Double> Xb){//formula 2.1for (int i = 0; i < dimension; i++) {position.set(i,w1.get(i)*Xb.get(i)-R.get(i)*w2.get(i)*Math.abs(Xb.get(i)-this.position.get(i)));}}public void upDateLocation(double l,int t,int T,List<Double> Xb,double BF){double r1 = Math.random();double r2 = Math.random();if(r1<l){Game1();}else{List<Double> R = new ArrayList<>(dimension);for (int i = 0; i < dimension; i++) {R.add(0.0);}double shrink = 2.0*(1.0-t/T);for (int i = 0; i < dimension; i++) {R.set(i,2*shrink*Math.random()-shrink);}double E = sech(Math.abs(fitness-BF));if(r2>E){Game2(R,Xb);}else {Game3(R,Xb);}}}public static double sech(double x){return 2.0/(Math.exp(x)+Math.exp(-x));}public void updateW(int N,double SHungry,double l){for (int i = 0; i < dimension; i++) {//formula 2.6double r3 = Math.random();double r4 = Math.random();if (r3<l){w1.set(i,hungry*N/SHungry*r4);}else {w1.set(i,1.0);}double r5 = Math.random();//formula 2.6w2.set(i,(1-Math.exp(-Math.abs(hungry-SHungry)))*r5*2);}}public void UpDateFitness(){this.fitness = Sphere(this.position);}public static double Sphere(List<Double> x){double sum = 0;for (int i = 0; i < x.size(); i++) {sum += x.get(i)*x.get(i);}return sum;//修正函数}
}
class IndividualFactory{Random random = new Random();private int dimension;private double lb;private double ub;public IndividualFactory(int dimension,double lb,double ub){this.dimension = dimension;this.lb = lb;this.ub = ub;}public Individual getRandom(){List<Double> Position = new ArrayList<>(dimension);for (int i = 0; i < dimension; i++) {Position.add(lb+(ub-lb)*random.nextDouble());}Individual individual = new Individual(lb,ub,Position);individual.UpDateFitness();return individual;}public List<Individual> getRandomIndividuals(int N){List<Individual> individuals = new ArrayList<>(N);for (int i = 0; i < N; i++) {individuals.add(getRandom());}return individuals;}}
class LineChart extends JPanel {private ArrayList<Point> points;public LineChart(ArrayList<Point> points) {this.points = points;}@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);Graphics2D g2d = (Graphics2D) g;int margin = 50; // 留出一些边距int width = getWidth() - 2 * margin;int height = getHeight() - 2 * margin;// 绘制坐标轴g2d.drawLine(margin, margin, margin, margin + height); // 垂直轴g2d.drawLine(margin, margin + height, margin + width, margin + height); // 水平轴// 计算最大和最小的x和y值int minX = Integer.MAX_VALUE, minY = Integer.MAX_VALUE;int maxX = Integer.MIN_VALUE, maxY = Integer.MIN_VALUE;for (Point point : points) {if (point.x < minX) minX = point.x;if (point.x > maxX) maxX = point.x;if (point.y < minY) minY = point.y;if (point.y > maxY) maxY = point.y;}// 绘制折线g2d.setColor(Color.BLUE);for (int i = 0; i < points.size() - 1; i++) {int x1 = margin + (points.get(i).x - minX) * width / (maxX - minX);int y1 = margin + height - (points.get(i).y - minY) * height / (maxY - minY);int x2 = margin + (points.get(i + 1).x - minX) * width / (maxX - minX);int y2 = margin + height - (points.get(i + 1).y - minY) * height / (maxY - minY);g2d.drawLine(x1, y1, x2, y2);}}}

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

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

相关文章

硬核评测 | 百分点科技NLP、知识图谱产品获“可信AI”多项最高级

权威评测&#xff1a; 百分点科技“文本分析系统”以多项满分评分的优异表现&#xff0c;通过中国信通院“可信AI”功能模块最高级&#xff08;增强型&#xff09;评测&#xff1b;“数据科学基础平台-知识图谱构建系统”通过数据处理、知识构建、管理维护最高级&#xff08;4…

基于Uniapp+SpringBoot+Vue的电影交流平台小程序设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

【SpringCloud微服务全家桶学习笔记-服务注册zookeeper/consul】

SpringCloud微服务全家桶学习笔记 Eureka服务注册 gitee码云仓库 9.其他服务注册框架 &#xff08;1&#xff09;zookeeper安装与使用 zookeeper需安装在虚拟机上&#xff0c;建议使用CentOS&#xff0c;安装地址如下&#xff1a; zookeeper镜像源 选择第一个进入后下载ta…

新手怎样快速上手接口测试?掌握这几个知识点直接起飞!

接口测试是测试系统组件间接口的一种方式&#xff0c;接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是检查数据的增删改查操作&#xff0c;以及系统之间的逻辑关系等。 接口的几种类型 接口的类型包括&#xff1a;post &#xff0c;get&…

UWB定位模块

UWB定位模组是华星智控自研的小尺寸高集成度模组&#xff0c;模组长宽厚为30.1513.955.62毫米&#xff0c;天线采用IPEX接口分体式设计&#xff0c;方便集成于您的产品中&#xff0c;产品采用本安设计&#xff0c;可以用于煤矿等井下场景&#xff0c;通信距离>100米&#xf…

大健康行业千城万企信用建设工作启动大会在京召开

9月19日&#xff0c;为响应商务部、中宣部、国家发改委等13个部门共同举办的“诚信兴商宣传月”活动&#xff0c;中国国际电子商务中心所属北京国富泰信用管理有限公司联合北京华商国医堂集团及旗下东方岐黄商学院&#xff0c;北京华商国医堂中医药研究院举办的共筑信用月&…

直线模组怎么搭配电机?

直线模组在行业中主要做的是替代人工完成部分简单的操作&#xff0c;作为一款直线运动的设备&#xff0c;直线模组同样需要驱动设备去进行驱动&#xff0c;来完成整个模组的运转。 电机作为直线模组主要驱动设备&#xff0c;相信熟悉这个行业的人都清楚&#xff0c;而选择不同的…

抖音seo优化排名源码搭建

抖音seo优化排名技术开发源码搭建&#xff1a; 思路&#xff1a;看上去比较简单&#xff0c;貌似使用 get、set 这两个 trap 就可以&#xff0c;但实际上并不是。实际上还需要实现 has, ownKeys , getOwnPropertyDescriptor 这些 trap&#xff0c;这样就能最大限度的限制私有属…

Vuex状态管理最佳实践

文章目录 单一状态树使用模块使用常量定义Mutation类型使用Actions处理异步操作使用Getters计算属性严格模式分模块管理Getter、Mutation和Action&#xff1a;注释和文档&#xff1a;Vue Devtools ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮…

css,环形

思路&#xff1a; 1.先利用conic-gradient属性画一个圆&#xff0c;然后再叠加 效果图 <template><div class"ring"><div class"content"><slot></slot></div></div> </template> <script> import …

数字人民币如何将支付宝钱包余额转入到微信支付钱包余额?

数字人民币如何将支付宝钱包余额转入到微信支付钱包余额&#xff1f; 第一步&#xff1a;获取微信支付数字人民币钱包编号 1.1、手机上找到并打开数字人民币APP&#xff1b; 1.2、打开后找到微众银行&#xff08;微信支付&#xff09;微信钱包&#xff0c;并点击翻转获取收款…

超级好用绘图工具(Draw.io+Github)

超级好用绘图工具&#xff08;Draw.ioGithub&#xff09; 方案简介 绘图工具&#xff1a;Draw.io 存储方式&#xff1a; Github 1 Draw.io 1.2 简介 ​ 是一款免费开源的在线流程图绘制软件&#xff0c;可以用于创建流程图、组织结构图、网络图、UML图等各种类型的图表。…

pytorch学习1

前言 王者之争 核心之争在于动态图优先还是静态图优先 pytorch是动态计算生成新变量 tf是先定义变量&#xff0c;再生成 回归问题 1、梯度下降算法了解 [梯度算法是深度学习的核心&#xff0c;deep learning求解复杂问题主要靠的是梯度下降算法&#xff0c;故deep learning…

面向面试知识--Lottery项目

面向面试知识–Lottery项目 1.设计模式 为什么需要设计模式&#xff1f; &#xff08;设计模式是什么&#xff1f;优点有哪些&#xff1f;&#xff09; 设计模式是一套经过验证的有效的软件开发指导思想/解决方案&#xff1b;提高代码的可重用性和可维护性&#xff1b;提高团…

每日一题:请解释什么是闭包(Closure)?并举一个实际的例子来说明。(前端初级)

今天继续在前端初级笔试题中被AI虐&#xff1a; 碱面的答案&#xff0c;问题&#xff1a;初级&#xff0c;回答&#xff1a;初级https://bs.rongapi.cn/1702510598371151872/14我的回答如下&#xff1a; 闭包是指由大括号包裹的一个区域&#xff0c;这个区域代表了一个变量生效…

SpringMVC之JSON数据返回与异常处理机制---全方面讲解

一&#xff0c;JSON数据返回的理解 在Spring MVC中&#xff0c;当需要将数据以JSON格式返回给客户端时&#xff0c;可以使用ResponseBody注解或RestController注解将Controller方法的返回值直接转化为JSON格式并返回。这使得开发者可以方便地将Java对象转换为JSON&#xff0c;并…

vue基础知识十一:Vue组件之间的通信方式都有哪些?

一、组件间通信的概念 开始之前&#xff0c;我们把组件间通信这个词进行拆分 组件通信 都知道组件是vue最强大的功能之一&#xff0c;vue中每一个.vue我们都可以视之为一个组件通信指的是发送者通过某种媒体以某种格式来传递信息到收信者以达到某个目的。广义上&#xff0c;…

如何用Postman做接口自动化测试

前言 什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完…

Vue的路由使用,Node.js下载安装及环境配置教程 (超级详细)

前言&#xff1a; 今天我们来讲解关于Vue的路由使用&#xff0c;Node.js下载安装及环境配置教程 一&#xff0c;Vue的路由使用 首先我们Vue的路由使用&#xff0c;必须要导入官方的依赖的。 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务https://www.bootcdn.cn/ <…

2023年9月20日

画个钟 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QDebug> #include <QPainter> #include <QTimerEvent> #include <QTime> #include <QDateTime> #include <…