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

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

一 核心概念

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

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

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

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.5candidate = 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.5candidate = 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.pswp.cn/diannao/85340.shtml

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

相关文章

Transformer相关

问题汇总 Transformer的结构自注意力机制(Self-Attention)多头自注意力前馈神经网络(Feed-Forward Network, FFN)位置编码编码器(Encoder)和解码器(Decoder)Multi-Query Attention(多查询注意力机制)Grouped-query Attention(分组查询注意力机制)FlashAttention与注…

【位运算】两整数之和(medium)

两整数之和&#xff08;medium&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;代码复杂度分析 题⽬链接&#xff1a; 371. 两整数之和 题⽬描述&#xff1a; 给你两个整数 a 和 b &#xff0c;不使⽤ 运算符 和 - &#xff0c;计算并返回两…

现代密码学入门 | 现代密码学核心特点介绍

在当今互联互通的世界中&#xff0c;数字数据在全球范围内不断流动&#xff0c;安全通信和数据保护的需求从未如此迫切。现代密码学作为数字防御的先锋&#xff0c;提供了一系列复杂的技术和算法&#xff0c;以保护信息免受窥探和恶意行为的侵害。 现代密码学是从其古典前身—…

Redis分布式锁深度解析与最佳实践

1 2 Redis分布式锁实现方式确实是经典问题&#xff0c;下面我将系统性地分析这个方案及其演进过程&#xff0c;并给出生产级的解决方案。 一、基础方案及其缺陷 1. 初始实现方式 SETNX lock_key unique_value # 尝试获取锁 EXPIRE lock_key 30 # 设置过期时间 …

Hive自定义函数案例(UDF、UDAF、UDTF)

目录 前提条件 背景 概念及适用场景 UDF&#xff08;User-Defined Function&#xff09; 概念 适用场景 UDAF&#xff08;User-Defined Aggregate Function&#xff09; 概念 适用场景 UDTF&#xff08;User-Defined Table-Generating Function&#xff09; 概念 适…

Go语言的原子操作

当我们想要对某个变量并发安全的修改&#xff0c;除了使用官方提供的mutex&#xff0c;还可以使用sync/atomic包的原子操作&#xff0c;它能够保证对变量的读取或修改期间不被其他的协程所影响。 Golang提供的原子操作都是非侵入式的&#xff0c;由标准库sync/atmoic包提供&am…

QNAP MEMOS 域名访问 SSL(Lucky)

注意&#xff1a;下述是通过ssh、docker-compose方式安装docker的&#xff0c;不是直接在container station中安装的哈&#xff01;&#xff01;&#xff01; 一、编辑docker-compose.yml文件 用“#”号标识的&#xff0c;在保存文件的时候建议去掉&#xff0c;不然有时候会出…

C#实现远程锁屏

前言 这是一次提前下班没有锁屏进而引发的一次思考后的产物&#xff0c;思考的主要场景是当人离开电脑后&#xff0c;怎么能控制电脑锁屏&#xff0c;避免屏幕上的聊天记录被曝光。 首先想到通过系统的电源计划设置闲置超时时间熄屏&#xff0c;这可能是最接近场景的解决方案&a…

[Protobuf]常见数据类型以及使用注意事项

[Protobuf]常见数据类型以及使用注意事项 水墨不写bug 文章目录 一、基本数据类型1、字段2、字段的修饰规则 二、自定义数据类型1、message类型2、enum类型3、Any类型4、oneof类型5、map类型 三、小工具1.hexdump2.decode 四、注意事项 一、基本数据类型 protobuf 支持多种基础…

JS分支和循环

程序的执行顺序 在程序开发中&#xff0c;程序有三种不同的执行顺序 1.顺序执行 2.分支执行 3.循环执行 程序的代码块 <script>//一个代码块{var num11var num22var num3num1num2}//一个休想var info{name:"chen",age:18} 1.if分支语句&#xff08;单分支语句&…

Android 开发 Kotlin 全局大喇叭与广播机制

在 Android 开发中&#xff0c;广播机制就像一个神通广大的 “消息快递员”&#xff0c;承担着在不同组件间传递信息的重任。Kotlin 语言的简洁优雅更使其在广播机制的应用中大放异彩。今天&#xff0c;就让我们一同深入探索 Android 开发中 Kotlin 全局大喇叭与广播机制的奥秘…

rabbitmq AI复习

RabbitMq rabbitmq &#x1f9d1;‍&#x1f4bb; User 帮我复习rabbitmq相关知识&#xff0c;我是一个经验丰富的程序员 &#x1f916; Assistant 好的&#xff01;很高兴能通过这种方式帮你复习或学习 RabbitMQ 的知识。按照你说的流程&#xff0c;我们从完全零基础开始&…

计算机视觉---YOLOv5

YOLOv5理论讲解 一、YOLOv5 整体架构解析 YOLOv5 延续了 YOLO 系列的 单阶段目标检测框架&#xff0c;包含 主干网络&#xff08;Backbone&#xff09;、颈部网络&#xff08;Neck&#xff09; 和 检测头&#xff08;Head&#xff09;&#xff0c;但在结构设计上更注重 轻量化…

C++多重继承详解与实战解析

#include <iostream> using namespace std; //基类&#xff0c;父类 class ClassA { public:void displayA() {std::cout << "Displaying ClassA" << std::endl;}void testFunc(){std::cout << "testFunc ClassA" << std::e…

单细胞注释前沿:CASSIA——无参考、可解释、自动化细胞注释的大语言模型

细胞类型注释是单细胞RNA-seq分析的重要步骤&#xff0c;目前有许多注释方法。大多数注释方法都需要计算和特定领域专业知识的结合&#xff0c;而且经常产生不一致的结果&#xff0c;难以解释。大语言模型有可能在减少人工输入和提高准确性的同时扩大可访问性&#xff0c;但现有…

STM32Cubemx-H7-17-麦克纳姆轮驱动

前言 --末尾右总体的.c和.h 本篇文章把麦克纳姆轮的代码封装到.c和.h&#xff0c;使用者只需要根据轮子正转的方向&#xff0c;在.h处修改定义方向引脚&#xff0c;把轮子都统一正向后&#xff0c;后面的轮子驱动就可以正常了&#xff0c;然后直接调用函数驱动即可。 设置满…

文档核心结构优化(程序C++...)

文档核心结构优化 一、文档核心结构优化二、C关键特性详解框架2.1 从C到C的范式迁移 三、深度代码解析模板3.1 现代C特性分层解析 四、C vs C 关键差异矩阵五、交互式文档设计策略5.1 三维学习路径5.2 代码缺陷互动区 六、现代C特性演进图七、性能优化可视化呈现&#xff08;深…

PyTorch ——torchvision数据集使用

如果下载的很慢&#xff0c;可以试试下面这个

纯前端实现图片伪3D视差效果

作者&#xff1a;vivo 互联网前端团队- Su Ning 本文通过depth-anything获取图片的深度图&#xff0c;同时基于pixi.js&#xff0c;通过着色器编程&#xff0c;实现了通过深度图驱动的伪3D效果。该方案支持鼠标/手势与手机陀螺仪双模式交互&#xff0c;在保证性能的同时&#x…

英语写作中“专注于”focus on、concentrate的用法

Focus on在论文写作中常用&#xff0c;指出研究点&#xff0c;例如&#xff1a; There are three approaches to achieving ID authentication. Our study will focus on ……&#xff08;有三种途径实现身份认证&#xff0c;我们的研究专注于……&#xff09; concentrate &…