这两周复现了一个动态多目标优化算法PBDMO,感觉一些细节内容上还没有写好,结果已经是好的了.
主要是在检测到环境变化时按3个策略得到三个种群
策略1 中心点移动
创新点就是乘了一个rs值 得到3Npos个个体 能够加快收敛速度 同时也增加了rs只为1时候的鲁棒性
根据前一时刻t-1和当前时刻t的质心位置预测出t+1时刻的非支配解位置,但是rs是0.5,1,1.5
function [SubPop1] = Prediction(P,Pt_1,Problem)
%预测 需要有t时刻和t-1时刻的种群中心,然后对下一时刻进行更新,N为种群数量
%最后返回三个步长预测出的3个子种群的集合
Dirt = sum(P.decs,1)/Problem.N - sum(Pt_1.decs,1)/Problem.N;
Pos = P.best;
desc_new = [Pos.decs + Dirt * 0.5;Pos.decs + Dirt;Pos.decs + Dirt * 1.5];
SubPop1 = Problem.Evaluation(desc_new);
end
策略2 把决策变量分为主要变量和非主要变量并对决策空间进行采样点抽样.
N2取值为决策变量纬度d,N1取值为N1*d<N/2
共得到N1*N2个采样点
主要变量:非支配集合中具有最大标准差的变量 分为N1个
非主要变量:
function SubPop2 = Sampling(P,Problem)
%决策变量分为两类,每类进行不一样的采样点N1,N2 N2=决策变量纬度,N1xD<N/2 54321大概
%主要变量分类
N1 = 3; %暂时取值5
N2 = length(Problem.upper);
pos = P.best;
decs = pos.decs;
decs_std = std(decs,0,1);
principal_v = find(decs_std == max(decs_std));
Xd = linspace(Problem.lower(principal_v),Problem.upper(principal_v),N1);
%非主要变量
hx =[];
for i = 1:N2
if i == principal_v
continue
else
%剩下的非主要变量每个标记d个采样点
for j = 1:N2
hx(j,i) = Problem.lower(i) + j *(Problem.upper(i)-Problem.lower(i))/length(Problem.lower);
end
end
end
pop_decs = repmat(hx,[N1,1]);
pop_decs(:,principal_v) = repmat(Xd',[N2,1]);
pop = Problem.Evaluation(pop_decs);
%拿到非支配解
SubPop2 = pop.best;
end
策略3 对主要变量的决策空间进行上下界搜索再进行均匀采样
- 首先,利用核密度估计,在相应的非主集上计算 t 时刻 xi 的最大可能值(记为 Dvt)。
- 利用最后两个连续的 Dvt-1 和 Dvt,可以预测 t+1 时刻新环境 Dvt+1 下 xi 的最大可能值
- 并把t+1时刻的上界预计为
- 下界为Dvt的下界
Combining the estimated range for all nonprincipal variables and the original range of the principal variable, we have a shrank decision space from which another subpopulation (SubPop3) of solutions will be uniformly sampled.
如果t和t-1时刻的主要变量是不同的应该怎么做?
function SubPop3 = Shrinking(P,Pt_1,Problem)
%对非主要变量的上下界进行收缩
%t时刻和t-1时刻的主要变量情况不一样怎么处理?
%得到t时刻和t-1时刻的主要变量
pos = P.best;
decs = pos.decs;
decs_std = std(decs,0,1);
principal_t = find(decs_std == max(decs_std));
pos_1 = Pt_1.best;
decs_1 = pos_1.decs;
decs_std_1 = std(decs_1,0,1);
principal_t1 = find(decs_std_1 == max(decs_std_1));
a = P.decs;
b = Pt_1.decs;
new_pop = [];
for i=1:length(P(1).dec)
if~(i == principal_t ||i ==principal_t1)
% 进行核密度估计
[f,xi] = ksdensity(a(:,i));
[g,hi] = ksdensity(b(:,i));
% 找到f最大值的索引
[~, max_index] = max(f);
[~, maxg_index] = max(g);
% 获取对应的xi值
max_xi = xi(max_index);
max_hi = hi(maxg_index);
Dvt = 2*max_xi-max_hi;
Dvtu = 2*Dvt - max_xi;
points = linspace(Dvt,Dvtu,0.3*Problem.N);
new_pop(i,:) = points;
end
end
new_pop(principal_t,:) = linspace(Problem.upper(principal_t),Problem.lower(principal_t),0.3*Problem.N);
new_pop(principal_t1,:) = linspace(Problem.upper(principal_t1),Problem.lower(principal_t1),0.3*Problem.N);
SubPop3 = Problem.Evaluation(new_pop');
end
结果展示
10次对比结果?