Skip to content

Powell's Method

Classical

Powell's Conjugate Direction Method optimization algorithm.

Algorithm Overview

This module implements Powell's optimization algorithm. Powell's method is a derivative-free optimization algorithm that performs sequential one-dimensional minimizations along coordinate directions and then updates the search directions based on the progress made.

Powell's method works by:

  1. Starting with a set of linearly independent directions (usually coordinate axes)
  2. Performing line searches along each direction
  3. Replacing one of the directions with the overall direction of progress
  4. Repeating until convergence

The method is particularly effective for functions that are not too irregular and can handle functions where gradients are not available.

This implementation uses scipy's Powell optimizer with multiple random restarts to improve global optimization performance.

Usage

python
from opt.classical.powell import Powell
from opt.benchmark.functions import sphere

optimizer = Powell(
    func=sphere,
    lower_bound=-5.12,
    upper_bound=5.12,
    dim=10,
    max_iter=500,
)

best_solution, best_fitness = optimizer.search()
print(f"Best solution: {best_solution}")
print(f"Best fitness: {best_fitness:.6e}")

Parameters

ParameterTypeDefaultDescription
funcCallableRequiredObjective function to minimize.
lower_boundfloatRequiredLower bound of search space.
upper_boundfloatRequiredUpper bound of search space.
dimintRequiredProblem dimensionality.
max_iterint1000Maximum iterations per restart.
num_restartsint10Number of random restarts.
seedint | NoneNoneRandom seed for BBOB reproducibility.

Algorithm Metadata

PropertyValue
Algorithm NamePowell's Conjugate Direction Method
AcronymPOWELL
Year Introduced1964
AuthorsPowell, Michael J. D.
Algorithm ClassClassical
ComplexityO(n²) per iteration
PropertiesGradient-based, Deterministic
ImplementationPython 3.10+
COCO CompatibleYes

Mathematical Formulation

Sequential line searches along conjugate directions:

xk+1=xk+αkdk

where:

  • xk is the current position
  • αk is the optimal step size along direction dk
  • dk is the search direction (updated to maintain conjugacy)

Direction update strategy:

  • Start with coordinate directions: d0,...,dn1=e0,...,en1
  • After n line searches, replace one direction with overall progress direction
  • New direction: dnew=xnx0 (overall displacement)

Constraint handling:

  • Boundary conditions: Penalty-based (large value for out-of-bounds)
  • Feasibility enforcement: Post-optimization clamping to bounds

Hyperparameters

ParameterDefaultBBOB RecommendedDescription
max_iter100010000Maximum iterations
num_restarts2510-50Number of random restarts

Sensitivity Analysis:

  • num_restarts: High impact on finding global optimum
  • Recommended tuning ranges: num_restarts[10,50]

COCO/BBOB Benchmark Settings

Search Space:

  • Dimensions tested: 2, 3, 5, 10, 20, 40
  • Bounds: Function-specific (typically [-5, 5] or [-100, 100])
  • Instances: 15 per function (BBOB standard)

Evaluation Budget:

  • Budget: dim×10000 function evaluations
  • Independent runs: 15 (for statistical significance)
  • Seeds: 0-14 (reproducibility requirement)

Performance Metrics:

  • Target precision: 1e-8 (BBOB default)
  • Success rate at precision thresholds: [1e-8, 1e-6, 1e-4, 1e-2]
  • Expected Running Time (ERT) tracking

Raises

ValueError: If search space is invalid or function evaluation fails.

Notes

  • Modifies self.history if track_history=True
  • Uses self.seed for all random number generation
  • BBOB: Returns final best solution after max_iter or convergence

Computational Complexity:

  • Time per iteration: O(n2)
  • Space complexity: O(n2)
  • BBOB budget usage: 20-50% of dim×10000

BBOB Performance Characteristics:

  • Best function classes: Smooth, Well-conditioned
  • Weak function classes: Ill-conditioned, Discontinuous
  • Success rate at 1e-8: 50-75% (dim=5)

Convergence Properties:

  • Convergence rate: Superlinear on quadratics
  • Local vs Global: Local optimizer, multistart for global
  • Premature convergence risk: Medium

Reproducibility:

  • Deterministic: Yes (given same seed)
  • BBOB compliance: seed required for 15 runs
  • RNG: numpy.random.default_rng(self.seed)

Version History:

  • v0.1.0: Initial implementation
  • v0.1.2: COCO/BBOB compliance

References

[1] Powell, M. J. D. (1964). "An efficient method for finding the minimum of a function of several variables without calculating derivatives." The Computer Journal, 7(2), 155-162. https://doi.org/10.1093/comjnl/7.2.155

[2] Hansen, N., Auger, A., et al. (2021). "COCO: A platform for comparing continuous optimizers." Optimization Methods and Software, 36(1), 114-144. https://doi.org/10.1080/10556788.2020.1808977

COCO Data Archive:

See Also

NelderMead: Similar derivative-free simplex method BBOB Comparison: Powell often faster on smooth functions ConjugateGradient: Gradient-based variant of conjugate directions BBOB Comparison: CG faster when gradients available

Benchmark Performance

Interactive fitness landscape of a representative multimodal benchmark function (drag to rotate, scroll to zoom):

Run-based charts

Convergence, distribution and ECDF charts appear here once this optimizer is included in the benchmark suite.


Source Code

View the implementation: powell.py

Released under the MIT License.