There are some details that vary between different SCE implementations. These are small tweaks (automatic calculation of metaparameters, elitism, behaviour at the param bounds, etc) which can be important.
The implementation in Kalix follows that of Fors, which is as follows:
Main algorithm
n_complexes (mandatory)termination_evaluations (mandatory)n_params (defined by problem)n_threads (optional)random_seed (optional)m = 2 * n_params + 1 = number of points per complexs = n_complexes * m = total size of population across all complexesb = m = number of breeding iterations in the CCE algorithmp = n_params + 1 = number of parents in the simplexelitism = 1 = weighting scheme (1 → trapezoidal weighting per Duan etal 1994)s members of the initial population.s members. Keep track of the total number of evaluations we have done n_evaluations = s.n_complexes complexes. This means member number i goes into complex number i % n_complexes. After this each new complex will have m members.n_evaluations < termination_evaluations iterate:
n_evaluations = n_evaluations + new_evaluations .s members.n_complexes complexes. This means member number i goes into complex number i % n_complexes. After this each new complex will have m members.CCE algorithm
b breeding iterations to the given complex. (Recall that b = m in this implementation, meaning that we do as many breeding iterations as we have members). Each breeding iteration involves the following steps:
p members (called a simplex) from the current complex. In our implementation the simplex contains just over half of the complex members. Trapezoidal selection goes as follows:
weight[i] = pow(n - i, elitism).p members, without replacement, forming the simplex.obj_worst.obj_proposed is better than obj_worst replace it in the complex…obj_proposed is better than obj_worst replace it in the complex…obj_proposed is better than obj_worst replace it in the complex.b breeding iterations, return the updated complex to the main algorithm.<aside> 💡
Fors definitely isn’t the endgame here, for example I know it becomes very inefficient late in the optimisation.
</aside>
Chu Gao and Sorooshian did a paper in 2010. This is attached below.
Sorooshian did SC-SAHEL in 2020. It involves combining multiple evolutionary algorithms within a SCE framework… which is a lot of work to code up 😄