Main Content

Minimize Rastrigin's Function

Rastrigin's Function

This example shows how to find the minimum of Rastrigin's function, a function that is often used to test the genetic algorithm. The example presents two approaches for minimizing: using the Optimize Live Editor task and working at the command line.

For two independent variables, Rastrigin's function is defined as

Ras(x)=20+x12+x22-10(cos2πx1+cos2πx2).

The rastriginsfcn.m file, which computes the values of Rastrigin's function, is available when you run this example. Create a surface plot of Rastrigin's function.

fsurf(@(x,y)reshape(rastriginsfcn([x(:),y(:)]),size(x)),...
    "MeshDensity",100,...
    "ShowContours","on",...
    "LineStyle",":")

Figure contains an axes object. The axes object contains an object of type functionsurface.

As the plot shows, Rastrigin's function has many local minima—the “valleys” in the plot. However, the function has just one global minimum, which occurs at the point [0 0] in the x-y plane, where the value of the function is 0. At any local minimum other than [0 0], the value of Rastrigin's function is greater than 0. The farther the local minimum is from the origin, the larger the value of the function is at that point.

Rastrigin's function is often used to test the genetic algorithm, because its many local minima make it difficult for standard, gradient-based methods to find the global minimum.

Minimize Using the Optimize Live Editor Task

This section explains how to find the minimum of Rastrigin's function using the genetic algorithm.

Note: Because the genetic algorithm uses random number generators, the algorithm returns different results each time you run it.

  • Create a new live script by clicking the New Live Script button in the File section on the Home tab.

new_live_script.png

  • Insert an Optimize Live Editor task. Click the Insert tab and then, in the Code section, select Task > Optimize.

optimizelet_insert.png

optimizelet_choose.png

  • Click the Solver-based button.

optimizelet_initial.png

  • For use in entering problem data, insert a new section by clicking the Section Break button on the Insert tab. New sections appear above and below the task.

  • In the new section above the task, enter the following code to define the number of variables and objective function.

rng default % For reproducibility
nvar = 2;
fun = @rastriginsfcn;
  • To place these variables into the workspace, run the section by pressing Ctrl+Enter.

  • In the Specify problem type section of the task, click the Objective > Nonlinear button.

  • Select Solver > ga - Genetic algorithm.

  • In the Select problem data section of the task, select Objective function > Function handle and then choose fun.

  • Select Number of variables > nvar.

optimizelet_ga_rastriginsfcn.png

  • In the Display progress section of the task, select the Best fitness plot.

  • To run the solver, click the options button at the top right of the task window, and select Run Section. The plot appears in a separate figure window and in the task output area. Note that your plot might be different from the one shown, because ga is a stochastic algorithm.

rastriginsplot.png

  • The points at the bottom of the plot denote the best fitness values, while the points above them denote the averages of the fitness values in each generation. The top of the plot displays the best and mean values, numerically, in the current generation.

  • To see the solution and fitness function value, look at the top of the task.

optimizelet_ga_output.png

  • To view the values of these variables, enter the following code in the section below the task.

disp(solution)
disp(objectiveValue)

The value shown is not very close to the actual minimum value of Rastrigin's function, which is 0. The topics Set Initial Range, Vary Mutation and Crossover, and Set Maximum Number of Generations and Stall Generations describe ways to achieve a result that is closer to the actual minimum. Or, you can simply rerun the solver to try to obtain a better result.

The final state of the Live Editor task appears here.

Live Task
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.

Figure Genetic Algorithm contains an axes object. The axes object with title Best: 2.54629 Mean: 113.977, xlabel Generation, ylabel Fitness value contains 2 objects of type scatter. These objects represent Best fitness, Mean fitness.

disp(solution)
    0.9785    0.9443
disp(objectiveValue)
    2.5463

Minimize at the Command Line

To find the minimum of Rastrigin's function at the command line, enter the following code.

rng default % For reproducibility
options = optimoptions('ga','PlotFcn','gaplotbestf');
[solution,objectiveValue] = ga(@rastriginsfcn,2,...
    [],[],[],[],[],[],[],options)
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.

Figure Genetic Algorithm contains an axes object. The axes object with title Best: 2.54629 Mean: 113.977, xlabel Generation, ylabel Fitness value contains 2 objects of type scatter. These objects represent Best fitness, Mean fitness.

solution = 1×2

    0.9785    0.9443

objectiveValue = 
2.5463

The points at the bottom of the plot denote the best fitness values, while the points above them denote the averages of the fitness values in each generation. The top of the plot displays the best and mean values, numerically, in the current generation.

Both the Optimize Live Editor task and the command line allow you to formulate and solve problems, and they give identical results. The command line is more streamlined, but provides less help for choosing a solver, setting up the problem, and choosing options such as plot functions. You can also start a problem using Optimize, and then generate code for command line use, as in Constrained Nonlinear Problem Using Optimize Live Editor Task or Solver.

Related Topics