Source code for pymoo.algorithms.soo.nonconvex.isres
from math import sqrt, log, exp
import numpy as np
from pymoo.algorithms.soo.nonconvex.es import es_sigma, es_mut_repair
from pymoo.algorithms.soo.nonconvex.sres import SRES
from pymoo.core.population import Population
from pymoo.docs import parse_doc_string
[docs]
class ISRES(SRES):
def __init__(self, gamma=0.85, alpha=0.2, **kwargs):
"""
Improved Stochastic Ranking Evolutionary Strategy (SRES)
Parameters
----------
alpha : float
Length scale of the differentials during mutation.
PF: float
The stochastic ranking weight for choosing a random decision while doing the modified bubble sort.
"""
super().__init__(**kwargs)
self.gamma = gamma
self.alpha = alpha
def _setup(self, problem, **kwargs):
super()._setup(problem, **kwargs)
n = problem.n_var
chi = (1 / (2 * n) + 1 / (2 * (n ** 0.5)))
varphi = sqrt((2 / chi) * log((1 / self.alpha) * (exp(self.phi ** 2 * chi / 2) - (1 - self.alpha))))
self.taup = varphi / ((2 * n) ** 0.5)
self.tau = varphi / ((2 * (n ** 0.5)) ** 0.5)
def _infill(self):
pop, mu, _lambda = self.pop, self.pop_size, self.n_offsprings
xl, xu = self.problem.bounds()
X, sigma = pop.get("X", "sigma")
# cycle through the elites individuals for create the solutions
I = np.arange(_lambda) % min(mu, len(X))
# transform X and sigma to the shape of number of offsprings
X, sigma = X[I], sigma[I]
# copy the original sigma to sigma prime to be modified
Xp, sigmap = np.copy(X), np.copy(sigma)
# for the best individuals do differential variation to provide a direction to search in
Xp[:mu - 1] = X[:mu - 1] + self.gamma * (X[0] - X[1:mu])
# update the sigma values for elite and non-elite individuals
sigmap[mu - 1:] = np.minimum(self.sigma_max, es_sigma(sigma[mu - 1:], self.tau, self.taup, random_state=self.random_state))
# execute the evolutionary strategy to calculate the offspring solutions
Xp[mu - 1:] = X[mu - 1:] + sigmap[mu - 1:] * self.random_state.normal(size=sigmap[mu - 1:].shape)
# repair the individuals which are not feasible by sampling from sigma again
Xp = es_mut_repair(Xp, X, sigmap, xl, xu, 10, random_state=self.random_state)
# now update the sigma values of the non-elites only
sigmap[mu:] = sigma[mu:] + self.alpha * (sigmap[mu:] - sigma[mu:])
# create the population to proceed further
off = Population.new(X=Xp, sigma=sigmap)
return off
parse_doc_string(ISRES.__init__)