Differential evolution: DE/current/1#

de_current_1_crossover() adds a scaled difference of two random members of the population to the target, as in MOEA/D-DE. pymoo provides it as DEX with at_least_once=False, when the target is given as the first parent. jMetalPy provides it through the order of the parents of DifferentialEvolutionCrossover, as its MOEA/D does. jMetalPy always takes one random variable from the mutant, so it equals this operator only with \(CR = 1\), which is the default.

KS test results#

moocore

pymoo

jMetalPy

moocore

<0.001

0.905

pymoo

<0.001

<0.001

jMetalPy

0.905

<0.001

moocore and jMetalPy produce the same distribution of offspring. pymoo multiplies the scaling factor by a random factor within \(1 \pm 5 \cdot 10^{-5}\), so its offspring are within \(2 \cdot 10^{-5}\) of the values that the other packages produce, but never equal to them, which is enough difference to be detected by the KS test.

Performance over number of parents#

../../_images/crossover_bench-de_current_1-nparents-time.png

moocore is the fastest for every number of parents. With 10 000 parents, it takes 1.2 ms, while pymoo and jMetalPy take 33 and 230 times as long.

Performance over number of variables#

../../_images/crossover_bench-de_current_1-nvars-time.png

moocore is the fastest for every number of variables. With 1000 variables, pymoo and jMetalPy take 2.7 and 950 times as long.