Multilevel Cooperative Coevolution for Large Scale Optimization

article/2025/10/29 15:43:23

0、论文背景

本文在CCEA_G的基础上,提出了MLCC框架。在MLCC中,基于不同组大小的随机分组策略构造了一组问题分解器。演化过程分为若干个循环,在每个周期开始时,MLCC使用自适应机制根据其历史性能选择分解器。由于不同的组大小捕获了原始目标变量之间的不同交互水平,MLCC能够在不同水平之间自我适应。

Yang Z, Tang K, Yao X. Multilevel cooperative coevolution for large scale optimization[C]//2008 IEEE congress on evolutionary computation (IEEE World Congress on Computational Intelligence). IEEE, 2008: 1663-1670.

1、MLCC

本文是在CCEA_G的基础上,提出了MLCC,CCEA_G请参照博客:CCEA_G。

在有关子空间大小的讨论中,在早期阶段,维度小的子空间有助于快速找到好的区域;但在后期阶段,大的子空间有助于子问题包含更多的全局信息,这对于微调很重要。如果算法能够根据目标函数、演化阶段和特征特征适应适当的群大小,将是理想的。

在MLCC中,我们首先设计了基于不同组大小的几个问题分解器来形成一个分解器池。池中的每个分解器都意味着目标变量之间的不同交互水平。演化过程分为几个循环。在每个周期开始时,MLCC根据它们的性能记录从分解器池中选择一个分解器。然后,MLCC使用所选的分解器将目标向量问题划分为几个子分量,并对每个子分量用一定的EA进行演化。在每个周期结束时,所选分解器的性能记录将随其在当前周期中的性能而更新。

MLCC的算法流程如下:

  • 设置分解器池,\mathbf{S}=\left\{s_{1}, \cdots, s_{t}\right\}s_{i}表示子种群维度。
  • 初始化分解器的性能记录表,\mathbf{R}=\left\{r_{1}, \cdots, r_{t}\right\}r_{i}对应s_{i}
  • 种群的初始化,\mathbf{U}=\{U(i, j) \mid i=(1, \cdots, N P), j=(1, \cdots, n)\},NP表示种群数,n表示变量维度。
  • 求取种群对应的适应度函数值,设置最优值为v。
  • \text { If }(r<\epsilon, \forall r \in \mathbf{R}),达到本次程序执行终止条件,返回步骤2。
  • 计算分解器池中每个分解器的选择概率:

\begin{array}{c} \mathbf{p}=\left\{p_{1}, p_{2}, \cdots, p_{t}\right\} \\ p_{i}=\frac{e^{7 * r_{i}}}{\sum_{j=1}^{t} e^{7 * r_{j}}}, i=\{1,2, \cdots, t\} \end{array}

  • 根据p从S中选择s_{k},选取p中最大值对应的s。
  • 将n维向量划分为s_{k}组,\mathbf{G}=\left\{\mathbf{G}_{1}, \mathbf{G}_{2}, \cdots, \mathbf{G}_{m}\right\} \text { ( } n=s_{k} * m \text { )}
  • 设置 c = 1。
  • 获得种群的子种群,\mathbf{U}^{\prime}=\left\{U(i, j) \mid i \in\{1, \cdots, N P\}, j \in \mathbf{G}_{c}\right\}
  • 使用EA优化子种群。
  • 如果 c < m,c++,并返回步骤10。
  • 评估优化后的种群的适应度值,获得当前最佳值v`。
  • 更新r_{k},并使 v = v`。

r_{k}=\frac{\left(v-v^{\prime}\right)}{|v|}

  • 如果满足停止条件,则停止;否则,下一个循环将进入步骤6。

2、算法的实现和简单验证

CCEA_G在上面提到的博客中有实现,MLCC的实现如下:

clc;clear;clearvars;
addpath('CEC2008\');
global initial_flagNS = 100;   % 种群数
dim = 500;   % 种群维度
upper_bound = [100,100,100,5,600,32,1];    % 搜索区间:f1[-100,100],f2[-100, 100],f3[-100,100],f4[-5,5],f5[-600,600],f6[-32,32],f7[-1,1]
lower_bound = [-100,-100,-100,-5,-600,-32,-1];
bestYhistory = [];    %保存每次迭代的最佳值
sList = [5,10,25,50,100];   %组大小池
sHistory = [];
r = ones(1,5);for func_num = 3initial_flag = 0;    % 换一个函数initial_flag重置为0sample_x = lhsdesign(NS, dim).*(upper_bound(func_num) - lower_bound(func_num)) + lower_bound(func_num).*ones(NS, dim);    % 生成NS个种群,并获得其评估值sample_y = benchmark_func(sample_x,func_num);[best_y, bestIndex] = min(sample_y);    %获取全局最小值以及对应的种群best_x = sample_x(bestIndex,:);v1 = best_y;for i0 = 1 : 50     %迭代50次p = exp(r .* 7);p = p ./ sum(p);[~, index2] = max(p);    % 获取最大p值对应的索引s = sList(1,index2);     % 子空间的数目sHistory = [sHistory;s];index = randperm(dim);      %随机划分子空间for i1 = 1 : sindex1 = index(((i1 - 1) * (dim / s) + 1) : (i1 * (dim / s)));sub_x = sample_x(:,index1);sub_x = SaNSDE(sub_x, sample_y, best_x, index1, 70, dim / s, lower_bound(func_num), upper_bound(func_num), @(x)benchmark_func(x,func_num));%100*70sample_x(:,index1) = sub_x;sample_y = benchmark_func(sample_x,func_num);   %100[~, bestIndex] = min(sample_y);    %获取全局最小值以及对应的种群best_x = sample_x(bestIndex,:);end[worse_y, worseIndex] = max(sample_y);    %获取全局最大值以及对应的种群randIndex = randi(NS);while randIndex == bestIndex || randIndex == worseIndexrandIndex = randi(NS);     % 随机获取一个值end[sample_x(worseIndex,:),sample_y(worseIndex,:)] = NSDE(sample_x(worseIndex,:), NS, 50, s, -2, 2, 0.9, @(x)benchmark_func(x,func_num));% 50*100[sample_x(bestIndex,:),sample_y(bestIndex,:)] = NSDE(sample_x(bestIndex,:), NS, 50, s, -2, 2, 0.9, @(x)benchmark_func(x,func_num));% 权重向量在[-2,2]之间搜寻[sample_x(randIndex,:),sample_y(randIndex,:)] = NSDE(sample_x(randIndex,:), NS, 50, s, -2, 2, 0.9, @(x)benchmark_func(x,func_num));[best_y, bestIndex] = min(sample_y);    %获取全局最小值以及对应的种群best_x = sample_x(bestIndex,:);bestYhistory = [bestYhistory;best_y];v2 = best_y;r(1,index2) = (v1 - v2) / abs(v1);   %更新r向量v1 = v2;end
end
figure(1); 
plot(bestYhistory);
figure(2); 
plot(sHistory);

f3函数CCEA_G的优化效果:

 

f3函数MLCC的优化效果:

 f3函数MLCC的子种群个数选择图:

由此可见,动态确定分组大小,确实要好一些。 

如有错误,还望批评改正! 


http://chatgpt.dhexx.cn/article/GZ9ZhIgV.shtml

相关文章

mean value coordinates(均值重心坐标)定义及证明

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 在图形学中对于物体的描述往往是离散&#xff0c;但是在具体展示过程中我们又希望是连续。线性插值是解决离散与连续的常用手段。 三角形中的插值点击前往凸四边形中的…

numpy中的convolve的理解

写在前面 浏览更多内容&#xff0c;可访问&#xff1a;http://www.growai.cn 欢迎您关注作者知乎&#xff1a;ML与DL成长之路 推荐关注公众号&#xff1a;AI成长社&#xff0c;ML与DL的成长圣地。 函数 numpy.convolve(a, v, mode‘full’)&#xff0c;这是numpy函数中的卷…

Clustering Coefficient

Define Clustering Coefficient&#xff1a;聚类系数 Clustering Coefficient measures the degree to which nodes in a network tend to cluster or form triangles. ——聚类系数衡量网络中节点倾向于聚类或形成三角形的程度 Triadic Closure 三元闭包 The tendency of…

covariate(covariate是控制变量吗)

如何用STATA对连续性变量进行meta回归分析 在stata中有个metareg命令&#xff0c;好像可以对连续变量进行回归分析。 附件中是一篇pdf文档&#xff0c;主要介绍stata中关于meta分析的命令。跟大家分享一下。 里面在提到metareg命令时&#xff0c;列举了以下三个列子&#xff1a…

协方差矩阵简介(Covariance Matrix)

协方差矩阵定义 首先我们要明白&#xff0c;协方差实际是在概率论和统计学中用于衡量两个变量的总体误差,当然方差是协方差的一种特殊情况&#xff0c;即当两个变量是相同情况。它表示的是两个变量的总体的误差&#xff0c;这与只表示一个变量误差的方差不同。如果两个变量的变…

covariance matrix

协方差的定义 对于一般的分布&#xff0c;直接代入E(X)之类的就可以计算出来了&#xff0c;但真给你一个具体数值的分布&#xff0c;要计算协方差矩阵&#xff0c;根据这个公式来计算&#xff0c;还真不容易反应过来。这里用一个例子说明协方差矩阵是怎么计算出来的吧。 记住&…

经典排序算法——堆排序

对于一个int数组&#xff0c;请编写一个堆排序算法&#xff0c;对数组元素排序。 给定一个int数组A及数组的大小n&#xff0c;请返回排序后的数组。 测试样例&#xff1a; [1,2,3,5,2,3],6 [1,2,2,3,3,5] class HeapSort { public:int* heapSort(int* A, int n) {BuildMaxHeap(…

堆排序算法原理及c++实现

文章目录 准备知识MAX-HEAPIFY过程建堆堆排序算法总结 准备知识 堆的结构可以分为最大堆和最小堆&#xff0c;是一个完全二叉树&#xff0c;而堆排序是根据堆的这种数据结构设计的一种排序。 所谓完全二叉树即叶节点只能出现在最下层和次下层&#xff0c;并且最下面一层的结点…

堆排序算法设计与分析

堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法&#xff0c;它是选择排序的一种。堆分为大根堆和小根堆&#xff0c;是完全二叉树。大根堆要求父结点的值大于或等于子结点的值&#xff0c;小根堆相反。根据大根堆的性质&#xff0c;我们可以知道最大值一…

堆排序算法实现

堆排序:结构逻辑上是完全二叉树,但是可以使用顺序存储来实现 一些二叉树的区别: 二叉树:度数最大为2并且每个子树也是二叉树 满二叉树:每层节点都是满的,没有空缺,也就是,叶子节点只能出现在最后一层 完全二叉树:限制条件比满二叉树弱化,只需要前k-1层是满二叉树结构,最后…

数据结构之堆排序算法详解+C语言实现

堆   堆是具有以下性质的完全二叉树&#xff1a;每个结点的值都大于或等于其左右孩子结点的值&#xff0c;称为大顶堆&#xff1b;或者每个结点的值都小于或等于其左右孩子结点的值&#xff0c;称为小顶堆。 堆排序   堆排序是利用堆这种数据结构而设计的一种排序算法&…

堆排序算法原理及实现

堆排序是排序中一种比较重要的算法&#xff0c;和快速排序一样&#xff0c;其复杂度也是O(nlogn)&#xff1b;同时也是一种原地排序算法&#xff1a;在任何时候&#xff0c;数组中只有常数个元素存储在输入数组以外。堆这种数据结构是处理海量数据比较常见的结构&#xff0c;海…

堆排序算法Java

基本原理 1):将带排序的序列构造成一个大顶堆&#xff0c;根据大顶堆的性质&#xff0c;当前堆的根节点&#xff08;堆顶&#xff09;就是序列中最大的元素 2):将堆顶元素和最后一个元素交换&#xff0c;然后将剩下的节点重新构造成一个大顶堆&#xff1b; 3):重复步骤2 小知识…

堆排序算法详细分析

一、堆相关概念 1.堆 堆是完全二叉树&#xff0c;即除最后一层外&#xff0c;其它层都是满的&#xff0c;且最后一层从左到右依次都有元素。如下图所示。 堆是用数组来实现的&#xff0c;图中下标就为数组的下标&#xff0c;其对应数组[5, 1, 7, 2, 8, 6, 3, 9, 4]&#xf…

数据结构——堆排序(算法)

基本介绍 1&#xff09;、堆排序是利用堆这种数据结构而设计的一种排序算法&#xff0c;堆排序是一种选择排序&#xff0c;它的最好、最坏、平均时间复杂度均为O(nlogn)&#xff0c;它也是不稳定排序。2&#xff09;、堆是具有以下性质的完全二叉树&#xff1a;每个节点的值都…

C++:堆排序算法详解

图解排序算法(三)之堆排序 预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法&#xff0c;堆排序是一种选择排序&#xff0c;它的最坏&#xff0c;最好&#xff0c;平均时间复杂度均为O(nlogn)&#xff0c;它也是不稳定排序。首先简单了解下堆结构。 堆 堆是具有…

排序算法:堆排序算法实现及分析

堆排序介绍 堆排序&#xff08;Heap Sort&#xff09;就来利用堆&#xff08;假设利用大顶堆&#xff09;进行排序的方法。它的基本思想是&#xff0c;将待排序的序列构成一个大顶堆。此时&#xff0c;整个序列的最大值就是堆顶的根结点。将它移走&#xff08;其实就是将其与堆…

堆排序算法 总结

最近面试&#xff0c;老是被问到堆排序算法。 回答时老是感觉思路不清楚&#xff0c;现在总结一下&#xff0c;把思路弄清楚的。 1.堆排序是利用堆的特性对记录序列进行排序的一种排序方法。 好的那么堆得特性是什么呢&#xff1f; 堆得定义&#xff1a; 堆是满足下列性质的数…

Java实现堆排序算法

堆排序是计算机编程中一种流行且高效的排序算法。学习如何编写堆排序算法需要了解两种类型的数据结构-数组和树。 我们要排序的初始数字集存储在数组中&#xff0c;例如[10, 3, 76, 34, 23, 32]&#xff0c;排序后&#xff0c;我们得到一个排序后的数组[3,10,23,32,34,76] 堆排…

精通八大排序算法系列:二、堆排序算法

精通八大排序算法系列&#xff1a;二、堆排序算法 作者:July 、二零一一年二月二十日本文参考&#xff1a;Introduction To Algorithms&#xff0c;second edition。------------------- 此精通排序算法系列&#xff0c;前一节&#xff0c;已讲过了一、快速排序算法&#xff0c…