⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 non_domination_sort_mod.m

📁 对多目标优化算法NSGA-II算法的改进
💻 M
字号:
function f = non_domination_sort_mod(x,popsize)
    M = 2;
    V = 6;
    [N temp]= size(x);
    % 寻找等级为1的前沿
    rank = 1;
    F(rank).f = [];
    individual = [];
    for i = 1 : N
        individual(i).n = 0;
        individual(i).p = [];
        for j = 1 : N
            dom_less = 0;
            dom_equal = 0;
            dom_more = 0;
            for k = 1 : M
                if (x(i,V + k) < x(j,V + k))
                    dom_less = dom_less + 1;
                elseif(x(i,V + k) ==x(j,V + k))
                    dom_equal = dom_equal + 1;
                else
                    dom_more = dom_more + 1;
                end
            end
            if (dom_less == 0) & (dom_equal ~= M)
                individual(i).n = individual(i).n + 1;
            elseif (dom_more == 0) & (dom_equal ~= M)
                individual(i).p = [individual(i).p j];
            end
        end
        if (individual(i).n == 0)
            x(i,M + V + 1) = 1;
            F(rank).f = [F(rank).f i];
        end
    end
    individual_num = length(F(rank).f);
    % 寻找等级大于1的子前沿
    while (individual_num <= popsize) & (~isempty(F(rank).f))
        Q = [];
        for i = 1 : length(F(rank).f)
            if (~isempty(individual(F(rank).f(i)).p))
                for j = 1 : length(individual(F(rank).f(i)).p)
                    individual(individual(F(rank).f(i)).p(j)).n =individual(individual(F(rank).f(i)).p(j)).n - 1;
                    if (individual(individual(F(rank).f(i)).p(j)).n ==0)
                        x(individual(F(rank).f(i)).p(j),M + V + 1) = rank + 1;
                        Q = [Q individual(F(rank).f(i)).p(j)];
                    end
                end
            end
        end
        rank = rank + 1;
        F(rank).f = Q;
        individual_num = individual_num + length(F(rank).f)
    end
    % 得到只有等于活稍超出群体规模的个体,超出的个体数目参照拥挤距离来删除
    % 确定拥挤距离(只用目标函数中的第一个子目标函数)
    if (N == popsize)
        rank = rank - 1;
    end
    current_index = 0;
    for i = 1 : rank
        y = [];
        previous_index = current_index + 1;
        for j = 1 : length(F(i).f)
             y(j,:) = x(F(i).f(j),:);
        end
        current_index = current_index + j;
        sort_of_objectives = [];
        index_of_objectives = [];
        [sort_of_objectives index_of_objectives] = sort(y(:,V + 1));
        sort_of_objectives = [];
        for j = 1 : length(index_of_objectives)
            sort_of_objectives(j,:) = y(index_of_objectives(j),:);
        end
        f_max = sort_of_objectives(length(index_of_objectives),V + 1);
        f_min = sort_of_objectives(1,V + 1);
        y(index_of_objectives(length(index_of_objectives)),M + V + 2) = Inf;
        y(index_of_objectives(1),M + V + 2) = Inf;
        for k = 2 : length(index_of_objectives) - 1
            next_objective = sort_of_objectives(k + 1,V + 1);
            previous_objective = sort_of_objectives(k - 1,V + 1);
            if (f_max == f_min)
                y(index_of_objectives(k),M + V + 2) = Inf
            else
                y(index_of_objectives(k),M + V + 2) = (next_objective - previous_objective)/(f_max - f_min);
            end
        end
        z(previous_index : current_index,:) = y;
    end
    f = z;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -