精英-探索双群协同优化(Elite-Exploration Dual Swarm Cooperative Optimization, EEDSCO)

news2025/6/4 16:57:04

一种多群体智能优化算法,其核心思想是通过两个分工明确的群体——精英群探索群——协同工作,平衡算法的全局探索局部开发能力,从而提高收敛精度并避免早熟收敛。

一 核心概念

在传统优化算法(如粒子群优化、遗传算法)中,单一的搜索策略往往难以兼顾搜索广度精度。例如:

全局探索不足:易陷入局部最优。

局部开发不够:难以精细调优解的质量。

EEDSCO的突破

分工明确:精英群专注局部开发(利用好解),探索群负责全局探索(发现新区域)。

动态协同:两群通过信息交互,共享搜索经验,实现互补。

二 算法步骤

步骤一:初始化

将总群体随机分配为两个子群:

精英群(Elite Swarm):由适应度高的个体组成,负责深度开发。

探索群(Exploration Swarm):适应度较低或随机生成的个体,负责广域搜索。

设定参数:两群比例、信息交换频率、收敛阈值等。

 # 初始化群体
        self.population = np.random.uniform(-10, 10, (pop_size, dim))
        self.fitness = np.array([sphere_func(ind) for ind in self.population])
        
        # 初始划分精英群和探索群
        self.split_swarms()

    def split_swarms(self):
        """根据适应度划分精英群和探索群"""
        sorted_indices = np.argsort(self.fitness)
        elite_size = int(self.pop_size * self.elite_ratio)
        
        self.elite_swarm = self.population[sorted_indices[:elite_size]]      # 精英群:适应度最好的一部分
        self.explore_swarm = self.population[sorted_indices[elite_size:]]    # 探索群:其余个体
self.dim = dim              # 问题维度
self.pop_size = pop_size    # 总群体大小
self.elite_ratio = elite_ratio  # 精英群比例
self.max_iter = max_iter    # 最大迭代次数
self.exchange_freq = 5      # 信息交换频率
self.global_best = None     # 全局最优解
self.convergence = []       # 收敛曲线记录

步骤二:协同迭代

While (未达到终止条件):
    # 精英群操作:局部开发
    精英群更新策略(如梯度下降、小步长变异)
    更新精英群个体并保留历史最优解
    
    # 探索群操作:全局探索
    探索群更新策略(如大变异幅度、随机跳跃)
    探索新区域并记录潜在优质解
    
    # 信息交互
    if 达到信息交换频率:
        精英群接收探索群中发现的高质量解
        探索群引入精英群的引导方向
    
    # 动态调整
    根据收敛程度调整群体比例或搜索范围

 代码示例:

 # ---- 精英群操作: 局部开发 ----
    def update_elite(self):
        """精英群: 小步长高斯扰动 + 梯度引导"""
        for i in range(len(self.elite_swarm)):
            # 高斯变异(局部微调)
            mutation = np.random.normal(0, 0.1, self.dim)  # 标准差较小
            candidate = self.elite_swarm[i] + mutation
            
            # 梯度方向引导(模拟梯度下降)
            gradient = 2 * self.elite_swarm[i]  # Sphere函数梯度解析解
            candidate = candidate - 0.05 * gradient
            
            # 更新精英个体
            if sphere_func(candidate) < self.fitness[i]:
                self.elite_swarm[i] = candidate
    # ---- 探索群操作: 全局探索 ----
    def update_explore(self):
        """探索群: Lévy飞行 + 随机重启"""
        for i in range(len(self.explore_swarm)):
            # 以一定概率进行随机重启(跳出局部区域)
            if np.random.rand() < 0.1:
                self.explore_swarm[i] = np.random.uniform(-10, 10, self.dim)
                continue
                
            # Lévy飞行生成步长(长尾分布,允许大跳跃)
            step = np.random.standard_cauchy(self.dim) * 0.5
            candidate = self.explore_swarm[i] + step
            
            # 确保不越界
            candidate = np.clip(candidate, -10, 10)
            
            # 更新探索个体
            if sphere_func(candidate) < sphere_func(self.explore_swarm[i]):
                self.explore_swarm[i] = candidate
    # ---- 信息交互机制 ----
    def exchange_information(self):
        """精英群与探索群交互:迁移最优解"""
        # 探索群中前10%个体迁入精英群
        explore_fitness = np.array([sphere_func(x) for x in self.explore_swarm])
        top_k = int(0.1 * len(self.explore_swarm))
        best_indices = np.argsort(explore_fitness)[:top_k]
        
        # 精英群移除适应度最差的个体,腾出空间
        elite_fitness = np.array([sphere_func(x) for x in self.elite_swarm])
        worst_idx = np.argmax(elite_fitness)
        
        # 替换操作
        self.elite_swarm[worst_idx] = self.explore_swarm[best_indices[0]]
        self.explore_swarm = np.delete(self.explore_swarm, best_indices[0], axis=0)

三 关键策略

3.1 精英群的深度开发

策略

小范围变异(如高斯变异)。

梯度方向跟踪(适用于连续优化问题)。

模拟退火的邻域搜索(组合优化场景)。

特点

避免“过开发”:通过适应度方差检测早熟,必要时重置部分个体。

3.2 探索群的广域搜索

策略

Lévy飞行(大跨度跳跃,兼顾长距离与短距离搜索)。

随机重启(以一定概率重置个体位置)。

反向学习(生成对称解,扩展搜索空间)。

特点

强制多样性:引入排斥机制,避免个体聚集。

3.3 信息交互机制

  • 精英←探索:探索群中适应度前N%的个体迁移至精英群。
  • 精英→探索:精英群的全局最优解作为“引力点”,引导探索群方向。
  • 频率控制:初期高频交互提升效率,后期降低频率避免干扰收敛。

四 参数设置

  • 群体比例:通常精英群占20%~40%,可根据问题复杂度调整。
  • 信息交换频率:每5~10代交互一次。
  • 探索步长:随迭代次数指数衰减,平衡早期探索与后期收敛。
  • 自适应机制
    • 若精英群适应度长期不变,增大探索群比例。
    • 若探索群发现更优解,触发精英群重置。

五 适用场景

适用场景

多模态优化(如Rastrigin函数)。

高维复杂问题(如神经网络超参数优化)。

实际工程问题(如物流路径规划、电力系统调度)。

优势

全局最优概率高:两群互补降低漏解风险。

收敛速度快:精英群的局部开发快速提升解质量。

鲁棒性强:动态参数适应不同问题。

六 代码示例

import numpy as np
import matplotlib.pyplot as plt

# === 目标函数: Sphere函数 (最小化) ===
def sphere_func(x):
    return np.sum(x**2)

# === EEDSCO算法类 ===
class EEDSCO:
    def __init__(self, dim=2, pop_size=50, elite_ratio=0.3, max_iter=100):
        # 参数设置
        self.dim = dim              # 问题维度
        self.pop_size = pop_size    # 总群体大小
        self.elite_ratio = elite_ratio  # 精英群比例
        self.max_iter = max_iter    # 最大迭代次数
        self.exchange_freq = 5      # 信息交换频率
        self.global_best = None     # 全局最优解
        self.convergence = []       # 收敛曲线记录

        # 初始化群体
        self.population = np.random.uniform(-10, 10, (pop_size, dim))
        self.fitness = np.array([sphere_func(ind) for ind in self.population])
        
        # 初始划分精英群和探索群
        self.split_swarms()

    def split_swarms(self):
        """根据适应度划分精英群和探索群"""
        sorted_indices = np.argsort(self.fitness)
        elite_size = int(self.pop_size * self.elite_ratio)
        
        self.elite_swarm = self.population[sorted_indices[:elite_size]]      # 精英群:适应度最好的一部分
        self.explore_swarm = self.population[sorted_indices[elite_size:]]    # 探索群:其余个体
        
    # ---- 精英群操作: 局部开发 ----
    def update_elite(self):
        """精英群: 小步长高斯扰动 + 梯度引导"""
        for i in range(len(self.elite_swarm)):
            # 高斯变异(局部微调)
            mutation = np.random.normal(0, 0.1, self.dim)  # 标准差较小
            candidate = self.elite_swarm[i] + mutation
            
            # 梯度方向引导(模拟梯度下降)
            gradient = 2 * self.elite_swarm[i]  # Sphere函数梯度解析解
            candidate = candidate - 0.05 * gradient
            
            # 更新精英个体
            if sphere_func(candidate) < self.fitness[i]:
                self.elite_swarm[i] = candidate

    # ---- 探索群操作: 全局探索 ----
    def update_explore(self):
        """探索群: Lévy飞行 + 随机重启"""
        for i in range(len(self.explore_swarm)):
            # 以一定概率进行随机重启(跳出局部区域)
            if np.random.rand() < 0.1:
                self.explore_swarm[i] = np.random.uniform(-10, 10, self.dim)
                continue
                
            # Lévy飞行生成步长(长尾分布,允许大跳跃)
            step = np.random.standard_cauchy(self.dim) * 0.5
            candidate = self.explore_swarm[i] + step
            
            # 确保不越界
            candidate = np.clip(candidate, -10, 10)
            
            # 更新探索个体
            if sphere_func(candidate) < sphere_func(self.explore_swarm[i]):
                self.explore_swarm[i] = candidate

    # ---- 信息交互机制 ----
    def exchange_information(self):
        """精英群与探索群交互:迁移最优解"""
        # 探索群中前10%个体迁入精英群
        explore_fitness = np.array([sphere_func(x) for x in self.explore_swarm])
        top_k = int(0.1 * len(self.explore_swarm))
        best_indices = np.argsort(explore_fitness)[:top_k]
        
        # 精英群移除适应度最差的个体,腾出空间
        elite_fitness = np.array([sphere_func(x) for x in self.elite_swarm])
        worst_idx = np.argmax(elite_fitness)
        
        # 替换操作
        self.elite_swarm[worst_idx] = self.explore_swarm[best_indices[0]]
        self.explore_swarm = np.delete(self.explore_swarm, best_indices[0], axis=0)

    # ---- 主优化循环 ----
    def optimize(self):
        # 初始全局最优
        self.global_best = self.elite_swarm[0]
        best_fitness = sphere_func(self.global_best)
        self.convergence.append(best_fitness)

        for iter in range(self.max_iter):
            # 更新两个子群
            self.update_elite()     # 精英群局部开发
            self.update_explore()   # 探索群全局探索

            # 合并群体并更新全局最优
            combined_pop = np.vstack([self.elite_swarm, self.explore_swarm])
            current_best = combined_pop[np.argmin([sphere_func(x) for x in combined_pop])]
            
            if sphere_func(current_best) < best_fitness:
                self.global_best = current_best.copy()
                best_fitness = sphere_func(current_best)
            self.convergence.append(best_fitness)

            # 周期性信息交互
            if iter % self.exchange_freq == 0:
                self.exchange_information()

        return self.global_best, self.convergence

# === 算法测试与可视化 ===
if __name__ == "__main__":
    eedsco = EEDSCO(dim=10, pop_size=50, max_iter=100)
    best_solution, convergence = eedsco.optimize()
    
    print(f"全局最优解: {best_solution}")
    print(f"最优适应度: {sphere_func(best_solution)}")
    
    # 绘制收敛曲线
    plt.plot(convergence)
    plt.title("EEDSCO收敛曲线")
    plt.xlabel("迭代次数")
    plt.ylabel("适应度")
    plt.yscale('log')
    plt.show()

输出为:

但是这个输出的效果不是很理想,可以通过修改参数来优化。

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

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

相关文章

解决Ubuntu20.04上Qt串口通信 QSerialPort 打开失败的问题

运行Qt串口通信 open(QIODevice::ReadWrite) 时&#xff0c;总是失败。 1、打印失败原因 QString QSerialHelper::openSerail() {if(this->open(QIODevice::ReadWrite) true){return this->portName();}else{return "打开失败";//return this->errorStri…

设计模式——观察者设计模式(行为型)

摘要 本文详细介绍了观察者设计模式&#xff0c;包括其定义、结构、实现方式、适用场景以及实战示例。通过代码示例展示了如何在Spring框架下实现观察者模式&#xff0c;以及如何通过该模式实现状态变化通知。同时&#xff0c;对比了观察者模式与消息中间件在设计理念、耦合程…

【计算机系统结构】习题2

目录 1.有一条静态多功能流水线由5段组成&#xff0c;加法用1、2、4、5段&#xff0c;乘法用1、3、5段&#xff0c;第3段时间为&#xff0c;其余各段为&#xff0c;且流水线的输出可直接返回输入端或暂存器&#xff0c;若计算&#xff0c;试计算吞吐量、加速比、效率 2.有一动…

用户资产化视角下开源AI智能名片链动2+1模式S2B2C商城小程序的应用研究

摘要&#xff1a;在数字化时代&#xff0c;平台流量用户尚未完全转化为企业的数字资产&#xff0c;唯有将其沉淀至私域流量池并实现可控、随时触达&#xff0c;方能成为企业重要的数字资产。本文从用户资产化视角出发&#xff0c;探讨开源AI智能名片链动21模式S2B2C商城小程序在…

机器学习实验七--SVM垃圾邮件分类器

SVM垃圾邮件分类器 一、什么是SVM二、实例&#xff1a;垃圾邮件分类器1.实验要求2.原理解释2.1 数据预处理流程2.2 特征提取方法2.3 SVM分类器 3.代码实现4.实验结果5.实验总结 一、什么是SVM 支持向量机(Support Vector Machine, SVM)是一种监督学习算法&#xff0c;主要用于…

C++23 std::fstreams基础回顾

文章目录 引言1.1 std::fstreams概述1.2 std::fstreams的主要功能和常用操作 2. 独占模式 (P2467R1) 的详细介绍2.1 独占模式的定义和背景2.2 独占模式的作用和优势 3. C23 std::fstreams支持独占模式 (P2467R1) 的具体实现方式3.1 代码示例3.2 实现步骤解释 4. 使用该特性可能…

Git初识Git安装

目录 1. Git初识 1.1 提出问题 1.2 如何解决--版本控制器 1.3 注意事项 2 Git安装 2.1 Centos 2.2 Ubuntu 2.3 Windows 1. Git初识 1.1 提出问题 不知道你工作或学习时&#xff0c;有没有遇到这样的情况&#xff1a;我们在编写各种文档时&#xff0c;为了防止文档丢失…

使用Redisson实现分布式锁发现的【订阅超时】Subscribe timeout: (7500ms)

背景 使用 redisson 实现分布式锁&#xff0c;出现的异常&#xff1a; org.redisson.client.RedisTimeoutException: Subscribe timeout: (7500ms). Increase ‘subscriptionsPerConnection’ and/or ‘subscriptionConnectionPoolSize’ parameters 从异常信息读的出来一些东…

如何使用 poetry 创建虚拟环境,VSCode 如何激活使用 Poetry 虚拟环境(VSCode如何配置 Poetry 虚拟环境)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 使用 Poetry 创建和激活虚拟环境 📒🧪 创建项目并初始化 Poetry🔧 配置虚拟环境创建位置✅ 指定Python版本📦 安装依赖并创建虚拟环境🚀 激活虚拟环境📒 在 VSCode 中配置 Poetry 虚拟环境 📒🧭 方法一:使用 V…

牛客小白月赛117

前言&#xff1a;solveABCF相对简单&#xff0c;D题思路简单但是实现麻烦&#xff0c;F题郭老师神力b(&#xffe3;▽&#xffe3;)。 A. 好字符串 题目大意&#xff1a;给定字符串s&#xff0c;里面的字母必须大小写同时出现。 【解题】&#xff1a;没什么好说的&#xff0…

美化显示GDB调试的数据结构

笔者在前面的博文记一次pdf转Word的技术经历中有使用到mupdf库&#xff0c;该库是使用C语言写的一个操作PDF文件的库&#xff0c;同时提供了Python接口&#xff0c;Java接口和JavaScript接口。 在使用该库时&#xff0c;如果想要更高的性能&#xff0c;使用C语言接口是不二的选…

一篇学习CSS的笔记

一、简介 Cascading Style Sheets简称CSS&#xff0c;中文翻译为层叠样式表。当HTML被发明出来初期&#xff0c;不同的浏览器提供了各种各样的样式语言给用户控制网页的效果&#xff0c;HTML包含的显示属性并不是很多。但是随着各种使用者对HTML的需求&#xff0c;HTML添加了大…

StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践

导读&#xff1a; 本文将深入探讨基于 StarRocks 和 Iceberg 构建的云原生湖仓分析技术&#xff0c;详细解析两者结合如何实现高效的查询性能优化。内容涵盖 StarRocks Lakehouse 架构、与 Iceberg 的性能协同、最佳实践应用以及未来的发展规划&#xff0c;为您提供全面的技术解…

笔试笔记(运维)

&#xff08;数据库&#xff0c;SQL&#xff09; limit1 随机返回其中一个聚合函数不可以嵌套使用 【^】这个里面的数据任何形式组合都没有 sql常用语句顺序&#xff1a;from-->where-->group by-->having-->select-->order by-->limit 只要其中一个表存在匹…

使用langchain实现五种分块策略:语义分块、父文档分块、递归分块、特殊格式、固定长度分块

文章目录 分块策略详解1. 固定长度拆分&#xff08;简单粗暴&#xff09;2. 递归字符拆分&#xff08;智能切割&#xff09;3. 特殊格式拆分&#xff08;定向打击&#xff09;Markdown分块 4. 语义分割&#xff08;更智能切割&#xff09;基于Embedding的语义分块基于模型的端到…

【项目记录】登录认证(下)

1 过滤器 Filter 刚才通过浏览器的开发者工具&#xff0c;可以看到在后续的请求当中&#xff0c;都会在请求头中携带JWT令牌到服务端&#xff0c;而服务端需要统一拦截所有的请求&#xff0c;从而判断是否携带的有合法的JWT令牌。 那怎么样来统一拦截到所有的请求校验令牌的有…

linux文件管理(补充)

1、查看文件命令 1.1 cat 用于连接文件并打印到标准输出设备上&#xff0c;它的主要作用是用于查看和连接文件。 用法&#xff1a; cat 参数 文件名 参数&#xff1a; -n&#xff1a;显示行号&#xff0c;会在输出的每一行前加上行号。 -b&#xff1a;显示行号&#xff0c;…

Python训练营---Day42

DAY 42 Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业&#xff1a;理解下今天的代码即可 1、回调函数 回调函数&#xff08;Callback Function&#xff09;是一种特殊的函数&#xff0c;它作为参数传递给另一个函数&#…

基于空天地一体化网络的通信系统matlab性能分析

目录 1.引言 2.算法仿真效果演示 3.数据集格式或算法参数简介 4.MATLAB核心程序 5.算法涉及理论知识概要 5.1 QPSK调制原理 5.2 空天地一体化网络信道模型 5.3 空天地一体化网络信道特性 6.参考文献 7.完整算法代码文件获得 1.引言 空天地一体化网络是一种将卫星通信…

c++ opencv 形态学操作腐蚀和膨胀

https://www.jb51.net/article/247894.htm(上图图片来自这个博客) https://codec.wang/docs/opencv/basic/erode-and-dilate&#xff08;上图图片参考博客&#xff09; cv::Mat kernel cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)); cv::erode(src, dst, kern…