-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCalcCrowdingDistanceRank.m
120 lines (105 loc) · 2.85 KB
/
CalcCrowdingDistanceRank.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
function pop = CalcCrowdingDistanceRank(pop, TargetRegion)
% Calculate Crowding Distance
pop = CalcCrowdingDistance(pop);
% Assign Crowding Distance Rank
pop = AssignCrowdingDistanceRank(pop, TargetRegion);
end
% function pop = AssignCrowdingDistanceRank(pop, TargetRegion)
% % Assign Crowding Distance Rank to Particles in the Repository
%
% nPop = numel(pop);
% nTR = numel(TargetRegion);
% TargetRegionFlag = [pop.TargetRegionFlag];
% MaxDc = floor(nPop / nTR);
%
% for i = 1 : nTR
%
% tr_flag = TargetRegionFlag(i, :);
%
% CrowdingDistance = [pop(tr_flag == 1).CrowdingDistance];
%
% [~, index] = sort(CrowdingDistance, 'descend');
%
% for j = 1 : min(MaxDc, nPop)
%
% pop(index(j)).CrowdingDistanceRank = MaxDc - j + 1;
%
% end
%
% for j = min(MaxDc, nPop) + 1 : nPop
%
% pop(index(j)).CrowdingDistanceRank = pop(index(j)).CrowdingDistance / maxDc;
%
% end
%
% end
%
% end
function pop = AssignCrowdingDistanceRank(pop, TargetRegion)
% Assign Crowding Distance Rank to Particles in the Repository
nPop = numel(pop);
%
% nTR = numel(TargetRegion);
%
% MaxDc = floor(nPop / nTR);
%
% TargetRegionFlag = [pop.TargetRegionFlag];
%
% CrowdingDistance = [pop.CrowdingDistance];
%
% MaxCDx = max(CrowdingDistance);
%
% if MaxCDx == 0 % Crowding Distance for Every Particle Is 0
%
% for i = 1 : nPop
%
% pop(i).CrowdingDistanceRank = 0;
%
% end
%
% return
%
% end
%
% CrowdingDistanceRank = zeros(nPop, nTR);
%
% [~, index] = sort(CrowdingDistance, 'descend');
%
% for k = 1 : nTR
%
% tr_flag = TargetRegionFlag(k, :);
%
% tr_flag = tr_flag(index);
%
% count = 0;
%
% for i = 1 : nPop
%
% if count >= min(MaxDc, sum(tr_flag)) || tr_flag(i) == 0
%
% CrowdingDistanceRank(index(i), k) = 0;
%
% else
%
% CrowdingDistanceRank(index(i), k) = MaxDc - count;
%
% count = count + 1;
%
% end
%
% end
%
% end
%
% CrowdingDistanceRank = max(CrowdingDistanceRank, [], 2);
%
% for i = 1 : nPop
%
% pop(i).CrowdingDistanceRank = CrowdingDistanceRank(i, :);
%
% end
% The Crowding Distance Rank Is Not Necessary for One Target Region
for i = 1 : nPop
pop(i).CrowdingDistanceRank = pop(i).CrowdingDistance;
end
end