differentialEvolution

Syntax

differentialEvolution(func, bounds, [X0], [maxIter=1000], [popSize=15], [mutation], [recombination=0.7], [tol=0.01], [atol=0], [polish=true], [seed])

Arguments

func is the objective function to be minimized. Note that the function must return a scalar.

bounds is a numeric matrix of shape (N, 2) indicating the bounds for parameters, where N is the number of parameters to be optimized.

X0 (optional) is a numeric vector indicating the initial guess to the minimization.

Note:

  • Each row in the bound parameter contains two values (min, max), which define the lower and upper limits for the parameter values specified by X0.
  • X0 and bounds must have the same length, i.e., N = size(X0).

maxIter (optional) is a non-negative integer indicating the maximum number of iterations. The default value is 1000.

popSize (optional) is a positive integer specifying the multiplier for setting the total population size. The population contains popSize*(N - N_equal) individuals, where N_equal represents the number of parameters whose bounds are equal. The default value is 15.

mutation (optional) is a numeric pair in the format of (min, max), indicating the range of the mutation constant. It should satisfy 0 <= min <= max < 2. The default value is (0.5, 1).

recombination (optional) is a numeric scalar in [0, 1], indicating the recombination constant, also known as the crossover probability.

tol (optional) is a non-negative floating-point scalar indicating the relative tolerance for convergence. The default value is 0.01.

atol (optional) is a non-negative floating-point scalar indicating the absolute tolerance for convergence. The default value is 0. The algorithm terminates when stdev(population_energies) <= atol + tol * abs(mean(population_energies)), where population_energies is the vector consisting of objective function values for all individuals in the population.

polish (optional) is a Boolean scalar indicating whether to polish the differential evolution result using the L-BFGS-B method. The default value is true.

seed (optional) is an integer indicating the random seed used in the differential evolution algorithm, allowing users to reproduce the results. If unspecified (default), a non-deterministic random number generator is used.

Details

Use the Differential Evolution algorithm to calculate the global minimum of a function with multiple variables.

Return value: A dictionary containing the following keys:

  • xopt: A floating-point vector indicating the parameter values that minimize the objective function.
  • fopt: A floating-point scalar indicating the minimum value of the objective function, where fopt = f(xopt).
  • iterations: An integer indicating the number of iterations during the optimization process.
  • fcalls: An integer indicating the number of times the objective function is called during the optimization process.
  • converged: A Boolean scalar indicating whether the optimization result is converged.
    • true: The optimization result has been converged to below a preset tolerance and the algorithm terminates.
    • false: The algorithm terminates without converging after reaching the maximum number of iterations.

Examples

The following example creates a user-defined function rosen and uses differentialEvolution (with bounds specified) to calculate the global minimum of rosen.

def rosen(x) { 
	N = size(x);
	return sum(100.0*power(x[1:]-power(x[:N-1], 2.0), 2.0)+power(1-x[:N-1], 2.0));
}
bounds = matrix([0 0 0 0 0, 2 2 2 2 2])
differentialEvolution(rosen, bounds)

/* Ouput:
fcalls->43656
xopt->[1.000000000000,1.000000000000,1.000000000000,1.000000000000,1.000000000000]
fopt->0.0
iterations->581
converged->true
*/