-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSRA.py
More file actions
75 lines (68 loc) · 2.66 KB
/
Copy pathSRA.py
File metadata and controls
75 lines (68 loc) · 2.66 KB
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
import numpy as np
import pandas as pd
from scipy.spatial.distance import pdist
import geatpy as ea
def SRA_env_selection(popobjs, n, levels):
# This is newly proposed based on "Stochastic Ranking Algorithm for Many-Objective Optimization Based on Multiple Indicators"
# popobjs (N * M): objectives of population, #poluation = n, #objectives = m
# n: number of better parents
popobjs1 = popobjs
nosame_dim = ~ ((np.max(popobjs, axis=0) - np.min(popobjs, axis=0)) == 0)
popobjs[:, nosame_dim] = (popobjs[:, nosame_dim] - np.min(popobjs[:, nosame_dim], axis=0))/(np.max(popobjs[:, nosame_dim], axis=0) - np.min(popobjs[:, nosame_dim], axis=0))
popobjs[:, ~ nosame_dim] = 0
N = popobjs.shape[0]
SDE_Mat = np.zeros([N, N])
IBEA_Mat = np.zeros([N, N])
for i in range(N):
for j in range(N):
temp = np.max(np.vstack((popobjs[i, :], popobjs[j, :])), axis=0)
if i == j:
SDE_Mat[i, j] = np.inf
else:
SDE_Mat[i, j] = np.linalg.norm(popobjs[i, :]-temp, ord=2, axis=0)
IBEA_Mat[i, j] = np.max((popobjs[i, :] - popobjs[j, :]))
sdefitness = np.min(SDE_Mat, axis=1)
C = np.abs(np.max(IBEA_Mat, axis=0))
# IBEA_Mat = IBEA_Mat/C
ibeafitness = np.sum(-np.exp(-IBEA_Mat/0.05), axis=0) + 1
# Stochastic ranking based selection
Rank = np.arange(0, N)
pc = 0.45
for count_idx in range(int(np.ceil(N/2))):
is_swap = False
for i in range(0, N-1):
if np.random.random() < pc:
if ibeafitness[Rank[i]] < ibeafitness[Rank[i + 1]]:
temp = Rank[i]
Rank[i] = Rank[i+1]
Rank[i+1] = temp
is_swap = True
else:
if sdefitness[Rank[i]] < sdefitness[Rank[i + 1]]:
temp = Rank[i]
Rank[i] = Rank[i + 1]
Rank[i + 1] = temp
is_swap = True
if not is_swap:
break
# extreme points are preserved
Remains_idxs = np.array(np.where(levels == 1))
left_popobjs = popobjs[Remains_idxs[0], :]
max_idx = np.argmax(left_popobjs, axis=0)
min_idx = np.argmin(left_popobjs, axis=0)
min_idx = Remains_idxs[0, min_idx]
max_idx = Remains_idxs[0, max_idx]
Chosen = []
for idx in min_idx:
if idx not in Chosen:
Chosen.append(idx)
for idx in max_idx:
if idx not in Chosen:
Chosen.append(idx)
# Chosen = []
for idx in Rank:
if idx not in Chosen:
Chosen.append(idx)
if len(Chosen) == n:
break
return Chosen