Source code for paref.moo_algorithms.minimizer.differential_evolution_minimizer
from typing import List
from paref.blackbox_functions.design_space.bounds import Bounds
from paref.interfaces.moo_algorithms.blackbox_function import BlackboxFunction
from paref.interfaces.moo_algorithms.paref_moo import ParefMOO, CompositionWithParetoReflection
from paref.moo_algorithms.minimizer.gpr_minimizer import DifferentialEvolution
from paref.moo_algorithms.multi_dimensional.min_g import calculate_optimal_scaling_x, calculate_optimal_scaling_g
from paref.pareto_reflections.minimize_g import MinGParetoReflection
from paref.pareto_reflections.operations.compose_reflections import ComposeReflections
[docs]
class DifferentialEvolutionMinimizer(ParefMOO):
def __init__(self):
self._minimizer = DifferentialEvolution()
self._scaling_x = None
[docs]
def apply_moo_operation(self, blackbox_function: BlackboxFunction) -> None:
if not isinstance(blackbox_function.design_space, Bounds):
raise ValueError('Design space property of blackbox function must be an instance of Bounds!')
base_blackbox_function = blackbox_function
length_evaluations = len(base_blackbox_function.evaluations)
#####
# extract Pareto reflections
pareto_reflections = []
while isinstance(base_blackbox_function, CompositionWithParetoReflection):
pareto_reflections.append(base_blackbox_function._pareto_reflection)
base_blackbox_function = base_blackbox_function._blackbox_function
# compute optimal scaling whenever MinGParetoReflection is used
if isinstance(pareto_reflections[0], MinGParetoReflection):
print('Calculating optimal scaling...')
if len(pareto_reflections) > 1:
pareto_reflection = pareto_reflections[1]
for reflection in pareto_reflections[2:]:
pareto_reflection = ComposeReflections(reflection, pareto_reflection)
base_fun = lambda x: pareto_reflection(base_blackbox_function(x))
else:
base_fun = lambda x: base_blackbox_function(x)
if self._scaling_x is None:
self._scaling_x = calculate_optimal_scaling_x(base_fun, blackbox_function)
pareto_reflections[0].g.scaling_x = self._scaling_x
pareto_reflections[0].g.scaling_g = calculate_optimal_scaling_g(base_fun, pareto_reflections[0].g,
blackbox_function)
fun = lambda x: pareto_reflections[0](base_fun(x))
else:
fun = blackbox_function
if isinstance(blackbox_function.design_space, Bounds):
print('Starting optimization...')
res = self._minimizer(
function=lambda x: fun(x),
upper_bounds=blackbox_function.design_space.upper_bounds,
lower_bounds=blackbox_function.design_space.lower_bounds,
)
else:
raise ValueError('Design space property of blackbox function must be an instance of Bounds!')
print('finished!')
base_blackbox_function.evaluations = base_blackbox_function.evaluations[:length_evaluations]
base_blackbox_function(res)
# print('Value of blackbox: ', base_blackbox_function.y[-1])
@property
def supported_codomain_dimensions(self) -> List[int]:
return [1]