Java 实现LCRIME 雾凇变体算法

Java实现LCRIME雾凇算法变体

目录

一、LCRIME 算法(基于局部最优避免策略的雾凇算法变体)

二、LCRIME 算法核心原理

2.1雾凇算法基础流程:

2.2两大核心改进:

三、 代码

3.1 LCRIME类结构

3.2 核心改进

四、图像分割效果

五、源码获取


一、LCRIME 算法(基于局部最优避免策略的雾凇算法变体)

雾凇算法(RIME)作为一种新型群智能算法,通过 “软淞搜索 + 硬淞穿刺” 模拟自然雾凇凝结过程。

通过两大核心改进优化RIME雾凇算法:

  1. 局部最优避免策略:引导搜索方向跳出局部最优,加速全局最优收敛;
  2. 自适应多参考动态交叉策略:维持种群多样性,提升复杂场景下的阈值搜索精度

二、LCRIME 算法核心原理

2.1雾凇算法基础流程:

雾凇算法模拟自然界雾凇形成过程,分为两个阶段:

  • 软淞搜索:初始阶段快速覆盖搜索空间,通过游离粒子移动捕获潜在最优解;
  • 硬淞穿刺:粒子间信息交换,提升收敛性,但易导致种群多样性下降。

2.2两大核心改进:

(1)局部最优避免策略

针对雾凇算法易陷入局部最优的问题,LCRIME 通过以下逻辑调整搜索方向:

  1. 计算局部搜索范围系数L(随迭代次数从\(L_{max}\)线性降至\(L_{min}\));
  2. 随机选取两个存档个体,利用其差异调整当前个体的搜索方向,避免围绕局部最优 “打转”。

(2)自适应多参考动态交叉策略

为维持种群多样性,动态交叉策略通过以下设计实现:

  1. 基于父代适应度计算交叉权重(适应度高的父代贡献更多信息);
  2. 引入全局最优解作为参考,动态调整交叉方向;
  3. 加入随迭代衰减的扰动项,避免过早收敛。

三、 代码

3.1 LCRIME类结构

import common.KapurEntropy;
import common.Utils;
import org.jfree.chart.*;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYSplineRenderer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

class LCRIME {
    // 算法核心参数
    private int popSize;    // 种群规模
    private int dim;        // 维度(对应分割阈值数量)
    private double[] lb, ub;// 阈值上下界(通常为0-255)
    private int maxFEs;     // 最大评估次数(控制迭代终止)
    private double Lmax = 1.0, Lmin = 0.0; // 局部搜索范围
    
    // 新增:记录收敛数据(评估次数-最优Kapur熵)
    private List<Integer> feList = new ArrayList<>();
    private List<Double> bestFitnessList = new ArrayList<>();
    
    // 简化存档(复用种群,降低内存开销)
    private double[][] archive;

    // 构造函数:初始化参数
    public LCRIME(int popSize, int dim, double[] lb, double[] ub, int maxFEs) {
        this.popSize = popSize;
        this.dim = dim;
        this.lb = lb;
        this.ub = ub;
        this.maxFEs = maxFEs;
    }
}

3.2 核心改进

// 局部最优避免策略:引导算法跳出局部最优
private double[] avoidLocalOpt(double[] ri, double[] best, int t, int T) {
    // L:随迭代线性减小,控制局部搜索范围
    double L = Lmax - t * (Lmax - Lmin) / T;
    // 随机选取两个存档个体
    int a = (int) (Utils.random() * popSize);
    int b = (int) (Utils.random() * popSize);
    double[] ra = archive[a];
    double[] rb = archive[b];
    
    // 调整搜索方向:基于最优解和随机个体差异
    double[] rNew = ri.clone();
    for (int j = 0; j < dim; j++) {
        rNew[j] = best[j] + L * (ra[j] - rb[j]);
    }
    return bound(rNew); // 边界处理,避免阈值超出0-255
}
// 自适应多参考动态交叉:维持种群多样性
private double[] dynamicCrossover(double[] p1, double[] p2, double[] best, int t, int T, double[][] hist) {
    // 自适应权重:适应度高的父代贡献更多(加1e-10避免除零)
    double w1 = fitness(p2, hist) / (fitness(p1, hist) + fitness(p2, hist) + 1e-10);
    double w2 = 1 - w1;
    
    // 参考解引导系数:随迭代增大,增强向最优解靠拢的趋势
    double alpha = 0.5 * (double) t / T;
    
    // 动态交叉生成子代
    double[] child = new double[dim];
    for (int j = 0; j < dim; j++) {
        if (j % 2 == 0) { // 奇数区间:参考p1与最优解差异
            child[j] = w1 * p1[j] + w2 * p2[j] + alpha * (best[j] - p1[j]);
        } else { // 偶数区间:参考p2与最优解差异
            child[j] = w1 * p1[j] + w2 * p2[j] + alpha * (best[j] - p2[j]);
        }
        // 动态扰动:随迭代衰减,避免过早收敛
        double gamma = 0.1 * (1 - (double) t / T);
        child[j] += gamma * (Utils.random() * 2 - 1) * (ub[j] - lb[j]);
    }
    return bound(child);
}

四、图像分割效果

1、待分割图片

2、彩色分割图像展示

3、灰度分割图像展示

4、最优阈值求解收敛曲线

五、源码获取

见主页-个人简介。或见V公仲號【林不扣】

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值