Java 实现LCRIME 雾凇变体算法
目录
一、LCRIME 算法(基于局部最优避免策略的雾凇算法变体)
二、LCRIME 算法核心原理
2.1雾凇算法基础流程:
2.2两大核心改进:
三、 代码
3.1 LCRIME类结构
3.2 核心改进
四、图像分割效果
五、源码获取
一、LCRIME 算法(基于局部最优避免策略的雾凇算法变体)
雾凇算法(RIME)作为一种新型群智能算法,通过 “软淞搜索 + 硬淞穿刺” 模拟自然雾凇凝结过程。
通过两大核心改进优化RIME雾凇算法:
- 局部最优避免策略:引导搜索方向跳出局部最优,加速全局最优收敛;
- 自适应多参考动态交叉策略:维持种群多样性,提升复杂场景下的阈值搜索精度
二、LCRIME 算法核心原理
2.1雾凇算法基础流程:
雾凇算法模拟自然界雾凇形成过程,分为两个阶段:
- 软淞搜索:初始阶段快速覆盖搜索空间,通过游离粒子移动捕获潜在最优解;
- 硬淞穿刺:粒子间信息交换,提升收敛性,但易导致种群多样性下降。
2.2两大核心改进:
(1)局部最优避免策略
针对雾凇算法易陷入局部最优的问题,LCRIME 通过以下逻辑调整搜索方向:
- 计算局部搜索范围系数L(随迭代次数从\(L_{max}\)线性降至\(L_{min}\));
- 随机选取两个存档个体,利用其差异调整当前个体的搜索方向,避免围绕局部最优 “打转”。
(2)自适应多参考动态交叉策略
为维持种群多样性,动态交叉策略通过以下设计实现:
- 基于父代适应度计算交叉权重(适应度高的父代贡献更多信息);
- 引入全局最优解作为参考,动态调整交叉方向;
- 加入随迭代衰减的扰动项,避免过早收敛。
三、 代码
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公仲號【林不扣】