Source code for pymoo.algorithms.moo.unsga3
import numpy as np
from pymoo.algorithms.moo.nsga3 import NSGA3
from pymoo.util import default_random_state
from pymoo.operators.selection.tournament import compare, TournamentSelection
# =========================================================================================================
# Implementation
# =========================================================================================================
@default_random_state
def comp_by_rank_and_ref_line_dist(pop, P, random_state=None, **kwargs):
S = np.full(P.shape[0], np.nan)
for i in range(P.shape[0]):
a, b = P[i, 0], P[i, 1]
# if at least one solution is infeasible
if pop[a].CV > 0.0 or pop[b].CV > 0.0:
S[i] = compare(a, pop[a].CV, b, pop[b].CV, method='smaller_is_better', return_random_if_equal=True)
# both solutions are feasible
else:
# if in the same niche select by rank
if pop[a].get("niche") == pop[b].get("niche"):
if pop[a].get("rank") != pop[b].get("rank"):
S[i] = compare(a, pop[a].get("rank"), b, pop[b].get("rank"), method='smaller_is_better')
else:
S[i] = compare(a, pop[a].get("dist_to_niche"), b, pop[b].get("dist_to_niche"),
method='smaller_is_better')
if np.isnan(S[i]):
S[i] = random_state.choice([a, b])
return S[:, None].astype(int)
[docs]
class UNSGA3(NSGA3):
def __init__(self,
ref_dirs,
selection=TournamentSelection(func_comp=comp_by_rank_and_ref_line_dist),
**kwargs):
super().__init__(ref_dirs, selection=selection, **kwargs)