Source code for paref.pareto_reflection_sequences.multi_dimensional.find_all_pareto_points

# 1/3 min component difference of pareto front
# sum without utopia point
# guarantee
# randomize weights in order to dont get stuck

import numpy as np

from paref.interfaces.moo_algorithms.blackbox_function import BlackboxFunction
from paref.interfaces.pareto_reflections.pareto_reflection import ParetoReflection
from paref.interfaces.sequences_pareto_reflections.sequence_pareto_reflections import SequenceParetoReflections
from paref.pareto_reflections.avoid_points import AvoidPoints
from paref.pareto_reflections.minimize_weighted_norm_to_utopia import MinimizeWeightedNormToUtopia
from paref.pareto_reflections.operations.compose_reflections import ComposeReflections


[docs]class FindAllParetoPoints(SequenceParetoReflections): """# TBA: add and if it is reasonable? """
[docs] def next(self, blackbox_function: BlackboxFunction) -> ParetoReflection: """ Parameters ---------- blackbox_function : BlackboxFunction The blackbox function to which the algorithm is applied Returns ------- Optional[ParetoReflection] Either the next Pareto reflection or None if the end of the sequence is reached """ nadir = np.max(blackbox_function.y, axis=0) epsilon = 1 / 3 * np.min( np.min(np.abs(blackbox_function.pareto_front[1:] - blackbox_function.pareto_front[:-1]), axis=0)) # scalar = 1e-2 * np.ones(blackbox_function.dimension_target_space) # scalar[np.random.randint(low=0, high=blackbox_function.dimension_target_space - 1)] = 1 scalar = np.random.uniform(size=blackbox_function.dimension_target_space - 1) scalar = np.append(scalar, np.sqrt(1 - np.sum(scalar ** 2))) return ComposeReflections(pareto_reflecting_function_1=AvoidPoints( nadir=nadir, epsilon_avoiding_points=blackbox_function.pareto_front, epsilon=epsilon), pareto_reflecting_function_2=MinimizeWeightedNormToUtopia( utopia_point=np.zeros(blackbox_function.dimension_target_space), potency=np.ones(blackbox_function.dimension_target_space), scalar=scalar))