本文是在CBCC1和CBCC2的基础上提出了CBCC3。在本文中,证明了过度探索和过度开发是现有CBCC变体中性能损失的两个主要来源。在此基础上,提出了一种新的基于贡献的算法,可以在探索和开发之间保持更好的平衡。
Omidvar M N, Kazimipour B, Li X, et al. CBCC3—A contribution-based cooperative co-evolutionary algorithm with improved exploration/exploitation balance[C]//2016 IEEE congress on evolutionary computation (CEC). IEEE, 2016: 3541-3548.
有关CBCC 请参照博客:CBCC。
一般来说,CBCC1和CBCC2的两个主要缺点可以总结如下:
CBCC3的另一个主要区别是它依赖于最近的贡献信息来选择一个组件进行进一步优化(消除了CBCC1和CBCC2中对历史信息的使用)。
C1是与组件相关的最大贡献,而C2是与组件相关的第二大贡献。
CBCC因为未能切换到另一个刚刚成为最具贡献的组件的组件,所以导致组件的过度开发:
而导致其他组件没有获得相对应的进一步优化的资源。而CBCC3有效地解决了这一点:
然后将DECC、CBCC与CBCC3进行对比实验:
clc; clearvars; close all;
addpath('LSGO2013\')
addpath('LSGO2013\datafiles\');
load 'f07.mat';
global initial_flagNS = 50; % 种群数
dim = 1000; % 种群维度
upperBound = ub;
lowerBound = lb;
bestYhistory = []; % 保存每次迭代的最佳值
trueGroup = [50, 25, 25, 100, 50, 25, 25, 700];for funcNum = 7initial_flag = 0; % 换一个函数initial_flag重置为0sampleX = lhsdesign(NS, dim) .* (upperBound - lowerBound) + lowerBound .* ones(NS, dim); % 生成NS个种群,并获得其评估值sampleY = benchmark_func(sampleX', funcNum);sampleY = sampleY'; % 每一列是一个种群[bestY, bestIndex] = min(sampleY); % 获取全局最小值以及对应的种群lastBestY = bestY;bestX = sampleX(bestIndex, :);bestYhistory = [bestYhistory; bestY];evalue = 50;allGroups = {}; % 理想分组s1 = size(trueGroup, 2);for i0 = 1 : s1if i0 == 1start = 1;elsestart = start + trueGroup(i0 - 1);endendstart = start + trueGroup(i0) - 1;allGroups{end + 1} = p(1, start : endstart);enddeltaF = zeros(1, s1);version = 2;pt = 0.05;while evalue < 3 * 10 ^ 6 if evalue == 50 || rand() < ptfor i1 = 1 : s1index1 = allGroups{i1};dim1 = size(index1, 2);subX = sampleX(:, index1);subX = SaNSDE(subX, sampleY, bestX, index1, 100, dim1, lowerBound, upperBound, @(x)benchmark_func(x, funcNum));sampleX(:, index1) = subX;sampleY = benchmark_func(sampleX', funcNum);sampleY = sampleY';[bestY, bestIndex] = min(sampleY); % 获取全局最小值以及对应的种群bestX = sampleX(bestIndex, :);if (lastBestY - bestY) ~= 0deltaF(1, i1) = lastBestY - bestY;endlastBestY = bestY;evalue = evalue + 50 * 100;endenddeltaF1 = deltaF;[~, index2] = sort(deltaF1,'descend');c1 = index2(1);c2 = index2(2);while deltaF(c1) > deltaF(c2) && evalue < 3 * 10 ^ 6index1 = allGroups{c1};dim1 = size(index1, 2);subX = sampleX(:, index1);subX = SaNSDE(subX, sampleY, bestX, index1, 100, dim1, lowerBound, upperBound, @(x)benchmark_func(x, funcNum));sampleX(:, index1) = subX;sampleY = benchmark_func(sampleX', funcNum); sampleY = sampleY';[bestY, bestIndex] = min(sampleY); % 获取全局最小值以及对应的种群bestX = sampleX(bestIndex, :);if (lastBestY - bestY) ~= 0deltaF(c1) = lastBestY - bestY;endlastBestY = bestY;evalue = evalue + 50 * 100;disp(evalue);disp(bestY);endbestYhistory = [bestYhistory; bestY];disp(evalue);end
end
plot(bestYhistory);
save('CCBC3DG.mat','bestYhistory');
legend('Y','Location', 'northeast');
fminCBCC: 7021576.99155833
fminCBCC3:1.347210239771024e+05
上一篇:Servlet知识