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

news2024/9/26 5:17:02

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 100
    Double 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.1
        Random 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.1
        for (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.1
        for (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.6
            double 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.6
            w2.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;
    }

    @Override
    protected 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.coloradmin.cn/o/1026521.html

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

相关文章

分享团队在软件开发中用到的神仙工具

目前使用的是JNPF框架。 技术栈上使用的SpringBoot、SpringCloud、Spring Web、MyBatis、Swagger、Vue、Element。 这些都是比较主流的技术&#xff0c;无论是技术层面的先进性还是学习难度都是比较低的&#xff0c;目前网络上有大量可供参考学习的资料。 并且它支持前后端分离…

中文转拼音(带音调)

导入maven依赖 <!--导入pinyin4j库--><dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.1</version></dependency>demo如下&#xff1a; import com.github.stuxuhai.jpiny…

方案:数智化视频AI技术为智慧防汛筑基,构建防汛“数字堤坝”

一、背景分析 在过去的几年中&#xff0c;全球气候变化导致许多城市在雨季面临严重的洪涝灾害。这些灾害不仅对人们的生命安全和财产造成威胁&#xff0c;也影响了城市的正常运转。传统的防汛手段主要依赖人力监控和应急指挥&#xff0c;但存在响应速度慢、处理效率低等问题。…

【操作系统】进程控制与进程通信

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 操作系统 一、进程控制1.1 什么是进程控制1…

vue element 搜索框根据后台的接口实现模糊查询 + 分页特殊处理+重置表格

模糊查询效果图 1.配置接口 search: "/api/goods/search", //搜索接口/goods/search 2.get接口 search(params) { return axios.get(base.search, { params });//后台传参 再写这个params }, 3.异步请求接口 // 搜索接口async search(search){let res await this…

基于Java社区生鲜电商平台设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

离子风刀的特点以及应用领域

静电消除器离子风刀是一种用于消除静电的设备&#xff0c;它通过在空气中产生离子&#xff0c;将静电从物体表面或人体上释放掉&#xff0c;以保护电子设备和人体免受静电的损害。 离子风刀的特点包括&#xff1a; 1、高效&#xff1a;离子风刀能够快速消除静电&#xff0c;提…

CRM软件系统趣味性——游戏化销售管理

对于企业销售来说&#xff0c;高薪酬也伴随着更高的压力与挑战。高强度的单一工作会让销售人员逐渐失去对工作的兴趣&#xff0c;导致售状态缺少动力和激情&#xff0c;工作开展愈加困难。您可以通过CRM系统进行游戏化销售管理&#xff0c;让销售人员重新干劲满满。 游戏并不是…

SkyWalking使用讲解

文章目录 1 SkyWalking1.1 简介1.2 如何选择1.3 Skywalking架构1.4 服务端搭建1.4.1 下载安装包1.4.2 配置修改1.4.2.1 config/application.yml1.4.2.2 webapp/webapp.yml 1.4.3 启动服务 1.5 客户端搭建1.6 数据持久化1.6.1 修改配置文件1.6.2 添加MySQL的jdbc依赖 1.7 日志监…

Java面经整理(1)

一)Java中支持多继承吗,为什么? 答案:在JAVA中是不支持多继承的,原因是多继承会存在菱形继承的问题 菱形继承: 1)菱形继承也被称之为是钻石继承,是一种在JAVA面向对象编程的时候遇到的一个可能出现的继承问题; 2)假设JAVA支持多继承,那么就有可能一个类D继承两个不同的类…

一文总结提示工程框架,除了CoT还有ToT、GoT、AoT、SoT、PoT

夕小瑶科技说 原创 编译 | 谢年年 大语言模型LLM被视为一个巨大的知识库&#xff0c;它可以根据你提出问题或陈述的方式来提供答案。就像人类可能会根据问题的不同提供不同的答案一样&#xff0c;LLM也可以根据输入的不同给出不同的答案。因此&#xff0c;你的问题或陈述方式就…

视频太大怎么压缩变小?把视频变小这样做

随着科技的不断发展&#xff0c;视频已经成为了我们日常生活中不可或缺的一部分&#xff0c;然而&#xff0c;有时候我们会遇到视频体积太大&#xff0c;无法上传或者传输的问题&#xff0c;那么&#xff0c;如何将过大的视频压缩变小呢&#xff1f;下面就给大家分享几个方法&a…

如何检测出鸡蛋壳上的裂缝(个人想法,正确性有待研究)

问题 老师在课上提出了一个项目&#xff0c;是关于如何通过某些方式来找出有裂缝的鸡蛋壳&#xff0c;但是鸡蛋壳上的裂缝非常小&#xff0c;问有什么办法处理。 想法 通过瞬间增大气压使得有裂缝的鸡蛋破裂。 具体实施 在图中&#xff0c;我们可以看到鸡蛋受外界气压的力&…

TS自动监视ts文件修改

当我们对ts文件进行编译后会生成js文件 当我们在ts文件中进行修改时&#xff0c;js文件并不会进行变化 那我们该如何监视ts文件中的变化呢&#xff1f;可以在控制台中输入如下命令&#xff1a; tsc 文件名.ts -w 这下在ts中代码改变就可以被监听&#xff08;这里报错是因为同时…

【UML】类图详解

UML UML ——Unified modeling language UML&#xff08;统一建模语言&#xff09;&#xff0c;是一种用于软件系统分析和设计的语言工具&#xff0c;它用
于帮助软件开发人员进行思考和记录思路的结果 UML图有哪些 用例图静态结构图∶类图、对象图、包图、组件图、部署图动…

Python 搭建编程环境

一、搭建编程环境 1、下载python 官网&#xff1a;https://www.python.org 2、开始安装 下载安装版本&#xff0c;双击下载的安装包&#xff0c;如下&#xff1a; 步骤一&#xff1a; 步骤二&#xff1a; 步骤三&#xff1a; 安装完成后执行下面的操作&#xff0c;判断是否…

[移动通讯]【Carrier Aggregation-4】【LTE-5】

前言&#xff1a; 前面讲过通过能力上报&#xff0c;以及RRC Connection Reconfiguration 添加SCell,添加完成后&#xff0c;UE 处于Inactive 状态。 本章主要讨论一下 Inactive 状态Active 状态的切换. 3GPP TS 36.321 V11.1.0 section 6.1.3.8 "Activation/Deactivat…

使用Python抢购商品

使用Python抢购商品 前言准备工作安装selenium库下载ChromeDriver 编写抢购商品py脚本导入库selenium使用方法 示例代码淘宝网华为商城 前言 注意&#xff1a;示例代码仅供学习使用&#xff0c;禁止不正当盈利。 本文使用Python的selenium库通过Chrome浏览器来抢购商品。首先…

Vue3-初识Vue3、创建Vue3工程、vue3组合式API(setup、ref函数、reactive函数)、响应式原理、计算属性、监视属性

Vue3&#xff08;1&#xff09; 目录 Vue3&#xff08;1&#xff09;一、Vue3简介二、创建Vue3.0工程1、使用vue-cli创建2、使用vite创建 三、常用的Composition API&#xff08;组合式API&#xff09;1、拉开序幕的setup2、ref函数3、reactive函数4、Vue3中响应式原理&#xf…

Django:五、登录界面实现动态图片验证码

一、下载包 pip install pillow 二、代码 这是一个函数&#xff0c;无输入&#xff0c;返回两个值。一个值是图片&#xff0c;一个值是图片中的数字及字母。 需要注意&#xff1a;font_fileMonaco.ttf 是一个验证码字体文件&#xff0c;如有需要&#xff0c;可三连私信。 …