代码分析 PopDec - repmat(obj.O(1:size(PopDec,2)),size(PopDec,1),1); 随机平移种群

avatar 2024年05月18日11:38:10 0 77 views
博主分享免费Java教学视频,B站账号:Java刘哥 ,长期提供技术问题解决、项目定制:本站商品点此

一、先看代码

刚刚下载了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);

解释

  1. 初始化:定义目标函数、初始种群、平移范围和最大迭代次数。
  2. 随机平移:在每次迭代中,生成随机平移量并平移种群。
  3. 目标函数评估:评估平移后种群的目标函数值。
  4. 更新最优解:根据目标函数值更新最优解,并记录平移后的解。
  5. 更新种群:种群更新时,确保其回到原始空间。
  6. 回到原始空间:在最终输出最优解时,减去最后的平移量,以确保最优解是在原始空间中的表示。
  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 编程爱好者交流群
  • 资源分享,问题解决,技术交流。QQ群:424285828(新群)
  • weinxin
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0