精英-探索雙群協同優化(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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85340.shtml
英文地址,請注明出處:http://en.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 &…