📄 non_domination_sort_mod.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 + -