thursday/thursday/candidates/evolopy.py

67 lines
2.0 KiB
Python

from ..utilities import wrap_untrustworthy, final, ExhaustedTrialsError
import numpy as np
def make_evolopy(optimizer_name, popsize=None):
from ..external.evolopy.BAT import BAT
from ..external.evolopy.CS import CS
from ..external.evolopy.DE import DE
from ..external.evolopy.FFA import FFA
from ..external.evolopy.GA import GA
from ..external.evolopy.GWO import GWO
from ..external.evolopy.HHO import HHO
from ..external.evolopy.JAYA import JAYA
from ..external.evolopy.MFO import MFO
from ..external.evolopy.MVO import MVO
from ..external.evolopy.PSO import PSO
from ..external.evolopy.SCA import SCA
from ..external.evolopy.SSA import SSA
from ..external.evolopy.WOA import WOA
from unittest.mock import patch
def no_print(*args, **kwargs):
pass
optimizers = dict(
BAT=BAT,
CS=CS,
DE=DE,
FFA=FFA,
GA=GA,
GWO=GWO,
HHO=HHO,
JAYA=JAYA,
MFO=MFO,
MVO=MVO,
PSO=PSO,
SCA=SCA,
SSA=SSA,
WOA=WOA,
)
optimizers = {
k: patch("builtins.print", no_print)(v) for k, v in optimizers.items()
}
optimizer = optimizers[optimizer_name.upper()]
def f(objective, size, budget):
# ps = size if popsize is None else popsize
# ps = max(4, ps) if optimizer_name.upper() == "DE" else ps
ps = int(4 + 3 * np.log(size)) if popsize is None else popsize
if optimizer_name.upper() == "GA" and ps & 1:
ps += 1 # force popsize to be even
_objective = wrap_untrustworthy(
objective, budget, bounding="sine", raising=True
)
try:
optimizer(_objective, 0.0, 1.0, size, ps, budget)
except ExhaustedTrialsError:
pass
return _objective(final)
name = f"evolopy_{optimizer.__name__.lower()}"
name += f"_auto" if popsize is None else f"_ps{popsize:02}"
f.__name__ = name + "_cube"
return f