Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 53e7c4e

Browse files
Non-Dominant Sorting for NSGA-II
1 parent 01cb71c commit 53e7c4e

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

‎NSGA-II/non_dominant_sorting.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import numpy
2+
3+
population = numpy.array([[20, 2.2],
4+
[60, 4.4],
5+
[65, 3.5],
6+
[15, 4.4],
7+
[55, 4.5],
8+
[50, 1.8],
9+
[80, 4.0],
10+
[25, 4.6]])
11+
12+
def non_dominant_sorting(curr_set):
13+
# List of the members of the current dominant front/set.
14+
dominant_set = []
15+
# List of the non-members of the current dominant front/set.
16+
non_dominant_set = []
17+
for idx1, sol1 in enumerate(curr_set):
18+
# Flag indicates whether the solution is a member of the current dominant set.
19+
is_dominant = True
20+
for idx2, sol2 in enumerate(curr_set):
21+
if idx1 == idx2:
22+
continue
23+
# Zipping the 2 solutions so the corresponding genes are in the same list.
24+
# The returned array is of size (N, 2) where N is the number of genes.
25+
b = numpy.array(list(zip(sol1, sol2)))
26+
27+
#TODO Consider repacing < by > for maximization problems.
28+
# Checking for if any solution dominates the current solution by applying the 2 conditions.
29+
# le_eq: All elements must be True.
30+
# le: Only 1 element must be True.
31+
le_eq = b[:, 1] <= b[:, 0]
32+
le = b[:, 1] < b[:, 0]
33+
34+
# If the 2 conditions hold, then a solution dominates the current solution.
35+
# The current solution is not considered a member of the dominant set.
36+
if le_eq.all() and le.any():
37+
# print(f"{sol2} dominates {sol1}")
38+
# Set the is_dominant flag to False to not insert the current solution in the current dominant set.
39+
# Instead, insert it into the non-dominant set.
40+
is_dominant = False
41+
non_dominant_set.append(sol1)
42+
break
43+
else:
44+
# Reaching here means the solution does not dominant the current solution.
45+
# print(f"{sol2} does not dominate {sol1}")
46+
pass
47+
48+
# If the flag is True, then no solution dominates the current solution.
49+
if is_dominant:
50+
dominant_set.append(sol1)
51+
52+
# Return the dominant and non-dominant sets.
53+
return dominant_set, non_dominant_set
54+
55+
dominant_set = []
56+
non_dominant_set = population.copy()
57+
while len(non_dominant_set) > 0:
58+
d1, non_dominant_set = non_dominant_sorting(non_dominant_set)
59+
dominant_set.append(d1)
60+
61+
for i, s in enumerate(dominant_set):
62+
print(f'Dominant Front Set {i+1}:\n{s}')

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /