Minimization Using Simulated Annealing Algorithm

This example shows how to create and minimize an objective function using the simulated annealing algorithm (simulannealbnd function) in Global Optimization Toolbox. For algorithmic details, see How Simulated Annealing Works.

Simple Objective Function

The objective function to minimize is a simple function of two variables:

   min f(x) = (4 - 2.1*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-4 + 4*x2^2)*x2^2;
    x

This function is known as "cam," as described in L.C.W. Dixon and G.P. Szego [1].

To implement the objective function calculation, the MATLAB file simple_objective.m has the following code:

type simple_objective
function y = simple_objective(x)
%SIMPLE_OBJECTIVE Objective function for PATTERNSEARCH solver

%   Copyright 2004 The MathWorks, Inc.  

x1 = x(1);
x2 = x(2);
y = (4-2.1.*x1.^2+x1.^4./3).*x1.^2+x1.*x2+(-4+4.*x2.^2).*x2.^2;

All Global Optimization Toolbox solvers assume that the objective has one input x, where x has as many elements as the number of variables in the problem. The objective function computes the scalar value of the objective function and returns it in its single output argument y.

Minimize Using simulannealbnd

To minimize the objective function using simulannealbnd, pass in a function handle to the objective function and a starting point x0 as the second argument. For reproducibility, set the random number stream.

ObjectiveFunction = @simple_objective;
x0 = [0.5 0.5];   % Starting point
rng default % For reproducibility
[x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,x0)
Optimization terminated: change in best function value less than options.FunctionTolerance.
x = 1×2

   -0.0896    0.7130

fval = -1.0316
exitFlag = 1
output = struct with fields:
     iterations: 2948
      funccount: 2971
        message: 'Optimization terminated: change in best function value less than options.FunctionTolerance.'
       rngstate: [1x1 struct]
    problemtype: 'unconstrained'
    temperature: [2x1 double]
      totaltime: 2.1186

simulannealbnd returns four output arguments:

  • x — Best point found

  • fval — Function value at the best point

  • exitFlag — Integer corresponding to the reason the function stopped

  • output — Information about the optimization steps

Bound Constrained Minimization

You can use simulannealbnd to solve problems with bound constraints. Pass lower and upper bounds as vectors. For each coordinate i, the solver ensures that lb(i) <= x(i) <= ub(i). Impose the bounds –64 <= x(i) <= 64.

lb = [-64 -64];
ub = [64 64];

Run the solver with the lower and upper bound arguments.

[x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,x0,lb,ub);
Optimization terminated: change in best function value less than options.FunctionTolerance.
fprintf('The number of iterations was : %d\n', output.iterations);
The number of iterations was : 2428
fprintf('The number of function evaluations was : %d\n', output.funccount);
The number of function evaluations was : 2447
fprintf('The best function value found was : %g\n', fval);
The best function value found was : -1.03163

The solver finds essentially the same solution as before.

Minimize Using Additional Arguments

Sometimes you want an objective function to be parameterized by extra arguments that act as constants during the optimization. For example, in the previous objective function, you might want to replace the constants 4, 2.1, and 4 with parameters that you can change to create a family of objective functions. For more information, see Passing Extra Parameters (Optimization Toolbox).

Rewrite the objective function to take three additional parameters in a new minimization problem.

   min f(x) = (a - b*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-c + c*x2^2)*x2^2;
    x

a, b, and c are parameters to the objective function that act as constants during the optimization (they are not varied as part of the minimization). To implement the objective function calculation, the MATLAB file parameterized_objective.m contains the following code:

type parameterized_objective
function y = parameterized_objective(x,p1,p2,p3)
%PARAMETERIZED_OBJECTIVE Objective function for PATTERNSEARCH solver

%   Copyright 2004 The MathWorks, Inc.
  
x1 = x(1);
x2 = x(2);
y = (p1-p2.*x1.^2+x1.^4./3).*x1.^2+x1.*x2+(-p3+p3.*x2.^2).*x2.^2;

Again, you need to pass in a function handle to the objective function as well as a starting point as the second argument.

simulannealbnd calls the objective function with just one argument x, but the objective function has four arguments: x, a, b, and c. To indicate which variable is the argument, use an anonymous function to capture the values of the additional arguments (the constants a, b, and c). Create a function handle ObjectiveFunction to an anonymous function that takes one input x, but calls parameterized_objective with x, a, b and c. When you create the function handle ObjectiveFunction, the variables a, b, and c have values that are stored in the anonymous function.

a = 4; b = 2.1; c = 4;    % Define constant values
ObjectiveFunction = @(x) parameterized_objective(x,a,b,c);
x0 = [0.5 0.5];
[x,fval] = simulannealbnd(ObjectiveFunction,x0)
Optimization terminated: change in best function value less than options.FunctionTolerance.
x = 1×2

    0.0898   -0.7127

fval = -1.0316

The solver finds essentially the same solution as before.

References

[1] Dixon, L. C. W., and G .P. Szego (eds.). Towards Global Optimisation 2. North-Holland: Elsevier Science Ltd., Amsterdam, 1978.

See Also

Related Topics