一、先看代码
刚刚下载了PlatEMO的代码,学习学习
准备自己新建一个算法和问题试试
先拷贝一个简单的问题,如 CEC2008_F1
有这样一段代码
%% Calculate objective values
function PopObj = CalObj(obj,PopDec)
Z = PopDec - repmat(obj.O(1:size(PopDec,2)),size(PopDec,1),1);
PopObj = sum(Z.^2,2);
end
主要是这行代码的目的不是很理解:
PopDec - repmat(obj.O(1:size(PopDec,2)),size(PopDec,1),1)
二、代码翻译
首先分析上面代码,
obj.O 里是一个随机数列表
size(PopDec,2)和size(PopDec,1)分别是列号和行号
repmat(obj.O(1:size(PopDec,2)),size(PopDec,1) 即生成一个矩阵,行列和PopDec相同,里面的元素都是同一个随机数
obj.O(1:1)=97.2499
假设 PopDec 为A,repmat(obj.O(1:size(PopDec,2)),size(PopDec,1) 为B
变量A = [-17.4472 -39.1203 -47.6452 54.6127 -16.4206 -20.8945 -47.2695 84.8634 96.6973 -45.5097]
变量B = [97.2499 97.2499 97.2499 97.2499 97.2499 97.2499 97.2499 97.2499 97.2499 97.2499]
变量A-B=[-114.6971 -136.3702 -144.8951 -42.6372 -113.6706 -118.1445 -144.5195 -12.3865 -0.5526 -142.7597]
即将PopDec这个决策变量数组(矩阵)里每个元素都减去一个相同的数(随机数),即平移我们的解
注意,上面的obj.O生成后是会保存的,同一轮迭代中100个种群调用获取目标函数值都是同是减去都一个随机数,不同迭代,随机数不同。
总之,就是要平移种群。
三、为什么要平移种群?
简单来说:就是为了防止算法很快就找到了局部最优解,然后在局部一直徘徊,没有跳出,其实在更广阔的搜索空间中还有更优解。
每轮迭代减去一个随机数,就是为了让解不同,比如一直是一个数。
比如 y=x^2的最小值,如果不加平移功能,那就很快找到最优解在0附近,还好我们的函数比较简单,如果对于复杂多峰函数可能就会有问题。
所以我们就是想让这种解多样性更大,比如:这次在x=0附近找找,下次在x=8.5附近找找,下次在-5.4附近找找
(上面例子是单目标,单维的例子)
1. 避免局部最优解
在优化过程中,算法可能会陷入局部最优解,即找到的解不是全局最优解但在附近区域内是最优的。通过引入随机平移,可以打破
这种局部最优解,使得算法能够跳出局部最优区域,探索更大的搜索空间,从而增加找到全局最优解的可能性。
2. 增加搜索空间的探索性
随机平移可以增加搜索的多样性,使得算法能够探索到搜索空间的不同区域,而不仅仅局限于当前搜索区域。这对于具有复杂搜索
空间的问题尤为重要,可以帮助算法更全面地了解整个搜索空间的结构。
3. 模拟自然进化过程
在自然进化过程中,变异和基因重组是导致个体多样性的重要因素。随机平移类似于这种变异过程,通过引入随机变化来增加种群
的多样性,模拟自然进化的随机性,从而提高算法的适应性和鲁棒性。
4. 避免算法过早收敛
在某些情况下,优化算法可能会过早地收敛到某个解,而未能充分探索整个搜索空间。随机平移可以防止这种过早收敛,通过持续
引入随机变化,保持种群的多样性,从而延缓收敛速度,使得算法有更多的机会找到更好的解。
四、随机平移(随机扰动)后的解本身并不能直接作为最终的最优解
随机平移(随机扰动)后的解本身并不能直接作为最终的最优解,因为它们已经被人为修改,脱离了原问题的定义和约束。
然而,随机平移在优化算法中主要是用于增强搜索过程,而不是最终结果。
因此,在最终选择最优解时,平移的效果需要被正确处理。以下是一些关键点和策略:
1. 平移用于探索,不用于最终解
随机平移主要用于探索更广泛的搜索空间,帮助算法跳出局部最优。然而,最终的最优解应该是基于原始问题的约束和定义得到
的。在迭代过程中,平移后的解用于指导算法寻找更优的区域,但在最终解中需要回到原始空间。
2. 平移的解的目标函数值作为指导
在评估平移后的解时,可以计算其目标函数值,但这些解并不直接作为最终解。目标函数值用于评估该解在新的搜索空间中的质量
指导后续搜索方向。
3. 回到原始空间
在实际实现中,平移操作只是暂时的。在算法结束时,最优解需要回到原始空间,即取消平移的效果。最终的最优解是基于原始问
题得到的,而不是基于平移后的搜索空间。
五、平移和回到原始空间例子
function [bestSol, bestVal] = optimize_with_random_shift(func, initialPop, shift_range, maxIter)
% func: 目标函数
% initialPop: 初始种群
% shift_range: 平移范围
% maxIter: 最大迭代次数
popSize = size(initialPop, 1);
dim = size(initialPop, 2);
bestSol = initialPop(1, :);
bestVal = func(bestSol);
for iter = 1:maxIter
% 生成一个与初始种群形状相同的随机平移矩阵
shift = (rand(popSize, dim) - 0.5) * 2 * shift_range;
% 将种群决策变量进行随机平移
shiftedPop = initialPop + shift;
% 计算平移后种群的目标函数值
popVals = arrayfun(func, num2cell(shiftedPop, 2));
% 更新最优解
[minVal, minIdx] = min(popVals);
if minVal < bestVal
bestVal = minVal;
bestSol = shiftedPop(minIdx, :); % 记录平移后的解
end
% 更新种群,但在原始空间中继续迭代
initialPop = initialPop + (shiftedPop - initialPop); % 更新种群时回到原始空间
end
% 最终的最优解在原始空间中,需要减去最后的平移量
bestSol = bestSol - (shiftedPop(minIdx, :) - initialPop(minIdx, :));
end
% 示例目标函数
sphere_func = @(x) sum(x.^2);
% 初始化种群
initialPop = [1 2; 3 4; 5 6];
shift_range = 0.1;
maxIter = 100;
[bestSol, bestVal] = optimize_with_random_shift(sphere_func, initialPop, shift_range, maxIter);
disp('最优解:');
disp(bestSol);
disp('最优值:');
disp(bestVal);
解释
- 初始化:定义目标函数、初始种群、平移范围和最大迭代次数。
- 随机平移:在每次迭代中,生成随机平移量并平移种群。
- 目标函数评估:评估平移后种群的目标函数值。
- 更新最优解:根据目标函数值更新最优解,并记录平移后的解。
- 更新种群:种群更新时,确保其回到原始空间。
- 回到原始空间:在最终输出最优解时,减去最后的平移量,以确保最优解是在原始空间中的表示。
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏