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#
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#
moocore is the fastest for every number of variables. With 1000 variables, pymoo and jMetalPy take 2.7 and 950 times as long.