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。通过共享函数法进行适应度共享:
- 计算每对个体之间的距离。
- 根据距离和共享函数 sh(d)sh(d) 计算共享值。
- 调整每个个体的适应度值,得到新的共享适应度。
- 使用共享适应度进行选择操作,维持种群的多样性。
通过这种方式,个体的适应度在种群中进行共享,确保算法在解空间中能更全面地搜索不同的小生境。
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算法,注释为博主添加
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏