2026-02-09 16:15:41 +01:00
# Differential Evolution
**Differential Evolution (DE)** is a powerful evolutionary algorithm for global optimization of continuous, non-linear, non-convex functions. It's particularly effective for multimodal optimization landscapes.
## Algorithm Overview
DE works by maintaining a **population** of candidate solutions and iteratively improving them through:
1. **Mutation** : Create mutant vectors by combining existing solutions
2. **Crossover** : Mix mutant with target vector
3. **Selection** : Keep better solution (greedy selection)
### Key Parameters
- **Population Size** (`pop_size` ): Number of candidate solutions (typically 10× problem dimension)
- **Mutation Factor** (`F` ): Scale factor for difference vectors (0.5-1.0)
- **Crossover Rate** (`CR` ): Probability of using mutant component (0.0-1.0)
- **Strategy**: Mutation/crossover strategy (see below)
## Strategies
OptimizR implements 5 DE strategies:
### 1. `rand/1/bin`
```
mutant = x_r1 + F * (x_r2 - x_r3)
```
Most explorative, good for diverse populations.
### 2. `best/1/bin`
```
mutant = x_best + F * (x_r1 - x_r2)
```
Exploitative, fast convergence but may get stuck.
### 3. `current-to-best/1/bin`
```
mutant = x_i + F * (x_best - x_i) + F * (x_r1 - x_r2)
```
Balanced exploration/exploitation.
### 4. `rand/2/bin`
```
mutant = x_r1 + F * (x_r2 - x_r3) + F * (x_r4 - x_r5)
```
More diversity through two difference vectors.
### 5. `best/2/bin`
```
mutant = x_best + F * (x_r1 - x_r2) + F * (x_r3 - x_r4)
```
Aggressive convergence to best solution.
## Usage Example
```python
import numpy as np
from optimizr import differential_evolution
def rastrigin ( x ):
A = 10
return A * len ( x ) + sum ( x ** 2 - A * np . cos ( 2 * np . pi * x ))
best_x , best_fx = differential_evolution (
objective_fn = rastrigin ,
bounds = [( - 5.12 , 5.12 )] * 10 ,
strategy = "best1" ,
popsize = 20 ,
maxiter = 500 ,
adaptive = True ,
)
print ( f "Best fitness: { best_fx : .6f } " )
print ( f "Best solution: { best_x } " )
```
## Advanced Features
### Adaptive jDE
Enable self-adaptive F and CR parameters:
```python
de = DifferentialEvolution (
bounds = [( - 5 , 5 )] * 20 ,
adaptive = True , # Enable jDE
tau_F = 0.1 , # F adaptation rate
tau_CR = 0.1 # CR adaptation rate
)
```
### Constraint Handling
For constrained optimization:
```python
def constraints ( x ):
"""Return array of constraint violations (> 0 means violated)"""
return np . array ([
x [ 0 ] ** 2 + x [ 1 ] ** 2 - 1 , # x0^2 + x1^2 <= 1
x [ 0 ] + x [ 1 ] - 2 # x0 + x1 <= 2
])
de = DifferentialEvolution (
bounds = [( - 5 , 5 )] * 2 ,
constraints = constraints ,
penalty_factor = 1000
)
```
## Performance Tips
1. **Population Size** : Start with `10 × dim` , increase if stuck
2. **F parameter** :
- Low (0.4-0.6): Fine-tuning, local search
- High (0.8-1.0): Exploration, escape local minima
3. **CR parameter** :
- Low (0.1-0.3): Separable problems
- High (0.9-1.0): Non-separable, coupled variables
4. **Strategy Selection** :
- Unknown landscape → `rand/1/bin` or `rand/2/bin`
- Smooth, unimodal → `best/1/bin`
- Multimodal, deceptive → `current-to-best/1/bin`
## Benchmarks
Performance on standard test functions (10D, 500 iterations):
| Function | Success Rate | Avg Time | Best Fitness |
|----------|--------------|----------|--------------|
| Sphere | 100% | 12ms | 1e-12 |
| Rosenbrock | 98% | 18ms | 3e-6 |
| Rastrigin | 87% | 22ms | 0.02 |
| Ackley | 95% | 15ms | 2e-8 |
*Compared to SciPy `differential_evolution`: 50-80× faster*
## Mathematical Details
### Mutation Operator
For strategy `rand/1/bin` :
$$
\mathbf{v}_{i,g} = \mathbf{x}_{r_1,g} + F \cdot (\mathbf{x}_{r_2,g} - \mathbf{x}_{r_3,g})
$$
Where:
- $\mathbf{v}_{i,g}$: Mutant vector for individual $i$ at generation $g$
- $\mathbf{x}_{r_j,g}$: Randomly selected individuals ($r_1 \neq r_2 \neq r_3 \neq i$)
- $F \in [0, 2]$: Mutation scaling factor
### Crossover Operator
Binomial crossover:
$$
u_{i,j,g} = \begin{cases}
v_{i,j,g} & \text{if } \text{rand}(0,1) < CR \text{ or } j = j_{rand} \\\\
x_{i,j,g} & \text{otherwise}
\end{cases}
$$
Ensures at least one component from mutant.
### Selection Operator
Greedy selection:
$$
\mathbf{x}_{i,g+1} = \begin{cases}
\mathbf{u}_{i,g} & \text{if } f(\mathbf{u}_{i,g}) \leq f(\mathbf{x}_{i,g}) \\\\
\mathbf{x}_{i,g} & \text{otherwise}
\end{cases}
$$
## References
1. Storn, R., & Price, K. (1997). *Differential evolution– a simple and efficient heuristic for global optimization over continuous spaces* . Journal of global optimization, 11(4), 341-359.
2. Das, S., & Suganthan, P. N. (2011). *Differential evolution: A survey of the state-of-the-art* . IEEE transactions on evolutionary computation, 15(1), 4-31.
3. Brest, J., et al. (2006). *Self-adapting control parameters in differential evolution: A comparative study on numerical benchmark problems* . IEEE transactions on evolutionary computation, 10(6), 646-657.
## See Also
- [API Reference ](../api/differential_evolution.md )
- [Jupyter Tutorial ](https://github.com/ThotDjehuty/optimiz-r/blob/main/examples/01_differential_evolution_tutorial.ipynb )
- [Benchmarks ](../benchmarks.md )