论文复现——Novel Prediction Strategies for Dynamic Multiobjective Optimization

这两周复现了一个动态多目标优化算法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次对比结果? 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值