GithubHelp home page GithubHelp logo

srom / cma-es Goto Github PK

View Code? Open in Web Editor NEW
44.0 4.0 13.0 2.54 MB

Covariance Matrix Adaptation Evolution Strategy (CMA-ES)

License: MIT License

Python 3.56% Jupyter Notebook 96.44%
tensorflow optimization optimization-algorithms numerical-optimization python

cma-es's Introduction

Covariance Matrix Adaptation Evolution Strategy (CMA-ES)

A TensorFlow 2 implementation.

What is CMA-ES?

The CMA-ES (Covariance Matrix Adaptation Evolution Strategy) is an evolutionary algorithm for difficult non-linear non-convex black-box optimisation problems in continuous domain. It is considered as state-of-the-art in evolutionary computation and has been adopted as one of the standard tools for continuous optimisation in many (probably hundreds of) research labs and industrial environments around the world.

The CMA Evolution Strategy

Installation

The package is available on PyPI and can be installed with pip:

pip install cma-es

Alternatively, cma-es can also be installed from conda-forge:

conda install -c conda-forge cma-es

Example Usage

1. Define the fitness function

CMA attempts to minimize a user-defined fitness function.

Function signature:

Args:
  x: tf.Tensor of shape (M, N)

Returns:
  Fitness evaluations: tf.Tensor of shape (M,)

Where M is the number of solutions to evaluate and N is the dimension of a single solution.

def fitness_fn(x):
    """
    Six-Hump Camel Function
    https://www.sfu.ca/~ssurjano/camel6.html
    """
    return (
        (4 - 2.1 * x[:,0]**2 + x[:,0]**4 / 3) * x[:,0]**2 +
        x[:,0] * x[:,1] +
        (-4 + 4 * x[:,1]**2) * x[:,1]**2
    )

Figure1: Six-Hump Camel Function

2. Configure CMA-ES

from cma import CMA

cma = CMA(
    initial_solution=[1.5, -0.4],
    initial_step_size=1.0,
    fitness_function=fitness_fn,
)

The initial solution and initial step size (i.e. initial standard deviation of the search distribution) are problem specific.

The population size is automatically set by default, but it can be overidden by specifying the parameter population_size.

For bounded constraint optimization problems, the parameter enforce_bounds can be set, e.g. enforce_bounds=[[-2, 2], [-1, 1]] for a 2D function.

3. Run the optimizer

The search method runs until the maximum number of generation is reached or until one of the early termination criteria is met. By default, the maximum number of generations is 500.

best_solution, best_fitness = cma.search()

The notebook Example 1 - Six Hump Camel Function goes into more details, including ways to plot the optimization path such as in the figure below.

Figure 2: Optimization path

Logging

A user-defined callback function can be specified to inspect variables during the search.

It is mainly intended for logging purpose, e.g:

max_epochs = 500

def logging_function(cma, logger):
    if cma.generation % 10 == 0:
        fitness = cma.best_fitness()
        logger.info(f'Generation {cma.generation} - fitness {fitness}')

    if cma.termination_criterion_met or cma.generation == max_epochs:
        sol = cma.best_solution()
        fitness = cma.best_fitness()
        logger.info(f'Final solution at gen {cma.generation}: {sol} (fitness: {fitness})')

cma = CMA(
    initial_solution=[1.5, -0.4],
    initial_step_size=1.0,
    fitness_function=fitness_fn,
    callback_function=logging_function,
)
cma.search(max_epochs)

Check out an example logging progress to TensorBoard: tensorboard_example.py

Running on GPU

By virtue of using TensorFlow, CMA should make use of available GPUs without any code change.

If you run into issues, check the official TF documentation.

More examples

Resources

cma-es's People

Contributors

n1kn4x avatar srom avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

cma-es's Issues

Eigendecomposition

Hey,

Sometimes in my experiments the eigendecomposition fails when the initial state is chosen poorly.
Wouldn't it make sense to use the SVD instead of the eigendecomposition?

Cheers

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.