TSTI算法分析

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

TSTI,  即基于3个指标的两阶段算法,今天抽空整理一下笔记

一、三个指标

1、收敛性指标

收敛性指标用于衡量个体在目标空间中相对于理想点的接近程度。

1)公式解释

2)源码

N = size(PopObj,1);

% 接近度估计
fmax   = repmat(max(PopObj,[],1),N,1);  % 计算每个目标的最大值,并重复 N 次
fmin   = repmat(min(PopObj,[],1),N,1);  % 计算每个目标的最小值,并重复 N 次
PopObj = (PopObj-fmin)./(fmax-fmin);    % 将所有个体的所有目标函数对应目标值归一化到 [0, 1] 范围
fpr    = sum(PopObj,2);                 % 计算每个个体的多个目标值之和,作为归一化后目标值的总和

 

 

2、多样性指标

多样性指标用于衡量种群在目标空间中的分布情况。

0)小生境技术(Niche Technology)中的共享函数法

假设有一个种群包含五个个体 A,B,C,D,EA, B, C, D, E,它们的原始适应度分别为 10,20,30,40,5010, 20, 30, 40, 50。通过共享函数法进行适应度共享:

  1. 计算每对个体之间的距离。
  2. 根据距离和共享函数 sh(d)sh(d) 计算共享值。
  3. 调整每个个体的适应度值,得到新的共享适应度。
  4. 使用共享适应度进行选择操作,维持种群的多样性。

通过这种方式,个体的适应度在种群中进行共享,确保算法在解空间中能更全面地搜索不同的小生境。

1)公式解释

 

2)源码

d         = pdist2(PopObj,PopObj);      % 计算种群中每两个解之间的距离
d(logical(eye(length(d)))) = inf;       % 将自身距离设为无穷大
fprm      = repmat(fpr,1,N);            % 重复接近度向量,形成矩阵
case1     = d<r & fprm<=fprm';          % 条件1:距离小于 r 且接近度不大于对方
case2     = d<r & fprm>fprm';           % 条件2:距离小于 r 且接近度大于对方
sh        = zeros(N);                   % 初始化共享函数矩阵
sh(case1) = (0.5*(1-d(case1)/r)).^2;    % 满足条件1的共享函数值
sh(case2) = (1.5*(1-d(case2)/r)).^2;    % 满足条件2的共享函数值
fcd       = sqrt(sum(sh,2));            % 计算每个解的拥挤度,作为共享函数值的平方和的平方根

 

注意,上面代码来自PlatEMO和论文公式相比略有简化

 

 

3、可行性指标

可行性指标用于衡量个体满足约束条件的程度。

1)公式解释

2)源码

CV_Original = Population.cons; % 提取原始约束违反度矩阵
CV_Original(CV_Original<=0) = 0; % 将小于等于0的约束违反度设为0
CV = CV_Original./max(CV_Original); % 对约束违反度进行归一化处理
CV(:,isnan(CV(1,:))) = 0; % 将所有 NaN 值替换为0
fcv = sum(max(0,CV),2)./size(CV_Original,2); % 计算归一化的约束违反度,并求平均值

二、阶段I环境选择

1、计算I计算适应度公式

2、阶段I环境选择算法

代码如下

function [Population,fitness] = EnvironmentalSelectionStageI(Population,PopObj,OffObj,N)
% The environmental selection of TiGE_1
% 第一阶段的主要目标是根据【非支配排序和约束违反度】来选择个体。
% 这一阶段的环境选择更多地侧重于个体的可行性和非支配性。

    % 非支配排序
	[FrontNo,~] = NDSort([PopObj;OffObj],N);
    % 计算种群中每个个体的归一化约束违反度
    fcv         = Calculate_fcv(Population);
    % 计算适应度值,适应度由非支配排序和约束违反度共同决定
    fitness     = FrontNo' + fcv./(fcv+1);
    % 根据适应度值对个体进行排序
    [~,index]   = sort(fitness);
    % 选择适应度值最好的前N个个体
    Population  = Population(index(1:N));
    fitness     = fitness(index(1:N));
end

 

 

三、环境选择阶段II

1、阶段II计算适应度公式

阶段II中的适应度公式和阶段I是不同的,阶段II的适应度计算公式:

 

2、阶段II环境选择算法

代码如下

function [Population,Fitness] = EnvironmentalSelectionStageII(Population,N)
    %% Calculate the fitness of each solution
    % 计算每个解的适应度值
    Fitness = Fit(Population.objs,Population.cons);

    %% Environmental selection
    % 环境选择
    Next = Fitness < 1;
    if sum(Next) < N
        % 如果选出的个体数小于N,则选择适应度值最小的前N个个体
        [~,Rank] = sort(Fitness);
        Next(Rank(1:N)) = true;
    elseif sum(Next) > N
        % 如果选出的个体数大于N,则进行截断操作
        Del  = Truncation(Population(Next).objs,sum(Next)-N);
        Temp = find(Next);
        Next(Temp(Del)) = false;
    end
    % 下一代的种群
    Population = Population(Next);
    Fitness    = Fitness(Next);
    % 对种群进行排序
    [Fitness,rank] = sort(Fitness);
    Population = Population(rank);
end


function Del = Truncation(PopObj,K)
    %% Truncation
    % 截断操作,删除k个元素
    Distance = pdist2(PopObj,PopObj); % 计算种群中每两个解之间的距离
    Distance(logical(eye(length(Distance)))) = inf; % 将自身距离设为无穷大
    Del = false(1,size(PopObj,1)); % 初始化删除标记
    while sum(Del) < K
        Remain   = find(~Del);
        Temp     = sort(Distance(Remain,Remain),2); % 对剩余个体的距离进行排序
        [~,Rank] = sortrows(Temp); % 对个体按距离进行排序
        Del(Remain(Rank(1))) = true; % 删除距离最近的个体
    end
end

 

 

以上代码来自 PlatEMO中TSTI算法,注释为博主添加

历史上的今天
七月
17日
  • 微信
  • 交流学习,资料分享
  • weinxin
  • 个人淘宝
  • 店铺名:言曌博客咨询部

  • (部分商品未及时上架淘宝)
avatar

发表评论

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

  

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