多目标优化拥挤距离计算

本文详细介绍了多目标优化算法中拥挤距离的概念及其计算方法,重点解释了如何通过拥挤距离维持种群个体的多样性,特别是在NSGA-II算法中的应用。文章提供了拥挤距离计算的主要步骤,包括种群排序、极值点设定、距离计算与归一化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多目标优化拥挤距离计算

觉得有用的话,欢迎一起讨论相互学习~

我的微博我的github我的B站

  • 拥挤距离主要是维持种群中个体的多样性。具体而言,一般来说是指种群按照支配关系进行非支配排序后,单个Rank层中个体的密集程度。常用于支配关系的多目标算法中,例如NSGA-II.

  • 主要步骤如下:

    1. 取单个前沿中个体按照一个目标上的值从小到大排序
    2. 将最大目标值作为max,最小目标值保留作为min。并且这两个极值点的拥挤距离都被设置为inf即无穷大。 因此注意,一个层中可能有多个具有inf的点,即如果层中有多个点在至少一个目标上相等,并且最大或最小,那么这些点的拥挤距离都是无穷大!!因为目标上呈现垂直的关系也是属于非支配的关系!!如果出现这种情况,说明你算法的多样性很烂!~或者在某些算法早期可能出现这种情况
    3. 在这个目标上计算每个个体最相邻个体之间的距离,即i-1和i+1的目标值的差。并使用max和min对次值进行归一化。
    4. 遍历目标,将目标上已经归一化的拥挤距离相加。
    5. 进入下一层front前沿
    6. 拥挤距离越大越好,最后按照拥挤距离重新排序各层,进而排序种群

matlab

function CrowdDis = CrowdingDistance(PopObj)
% Calculate the crowding distance of each solution in the same front

    [N,M]    = size(PopObj);

    CrowdDis = zeros(1,N);
    Fmax     = max(PopObj,[],1);
    Fmin     = min(PopObj,[],1);
    for i = 1 : M
        [~,rank] = sortrows(PopObj(:,i));
        CrowdDis(rank(1))   = inf;
        CrowdDis(rank(end)) = inf;
        for j = 2 : N-1
            CrowdDis(rank(j)) = CrowdDis(rank(j))+(PopObj(rank(j+1),i)-PopObj(rank(j-1),i))/(Fmax(i)-Fmin(i));
        end
    end
end

jmetal

public void crowdingDistanceAssignment(SolutionSet solutionSet, int nObjs) {
        int size = solutionSet.size();

        if (size == 0)
            return;

        if (size == 1) {
            solutionSet.get(0).setCrowdingDistance(Double.POSITIVE_INFINITY);
            return;
        } // if

        if (size == 2) {
            solutionSet.get(0).setCrowdingDistance(Double.POSITIVE_INFINITY);
            solutionSet.get(1).setCrowdingDistance(Double.POSITIVE_INFINITY);
            return;
        } // if

        // Use a new SolutionSet to evite alter original solutionSet
        SolutionSet front = new SolutionSet(size);
        for (int i = 0; i < size; i++) {
            front.add(solutionSet.get(i));
        }

        for (int i = 0; i < size; i++)
            front.get(i).setCrowdingDistance(0.0);

        double objetiveMaxn;
        double objetiveMinn;
        double distance;

        for (int i = 0; i < nObjs; i++) {
            // Sort the population by Obj n
            front.sort(new ObjectiveComparator(i));
            objetiveMinn = front.get(0).getObjective(i);
            objetiveMaxn = front.get(front.size() - 1).getObjective(i);

            // Set de crowding distance
            front.get(0).setCrowdingDistance(Double.POSITIVE_INFINITY);
            front.get(size - 1).setCrowdingDistance(Double.POSITIVE_INFINITY);

            for (int j = 1; j < size - 1; j++) {
                distance = front.get(j + 1).getObjective(i) - front.get(j - 1).getObjective(i);
                distance = distance / (objetiveMaxn - objetiveMinn);
                distance += front.get(j).getCrowdingDistance();
                front.get(j).setCrowdingDistance(distance);
            } // for
        } // for
    } // crowdingDistanceAssing
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值