# Minimize Rastrigins' Function Using `ga`, Problem-Based

This example shows how to minimize a function with multiple minima using the genetic algorithm in the problem-based approach. For two variables `x` and `y`, Rastrigin's function is defined as follows.

`ras = @(x, y) 20 + x.^2 + y.^2 - 10*(cos(2*pi*x) + cos(2*pi*y));`

Plot the function scaled by 10 in each direction.

```rf3 = @(x, y) ras(x/10, y/10); fsurf(rf3,[-30 30],"ShowContours","on") title("rastriginsfcn([x/10,y/10])") xlabel("x") ylabel("y")```

The function has many local minima and a global minimum value of 0 that is attained at `x` = 0, `y` = 0. See What Is Global Optimization?

Create optimization variables `x` and `y`. Specify that the variables are bounded by $±100$.

```x = optimvar("x","LowerBound",-100,"UpperBound",100); y = optimvar("y","LowerBound",-100,"UpperBound",100);```

Create an optimization problem with the objective function `rastriginsfcn(x)`.

`prob = optimproblem("Objective",ras(x,y));`

Note: If you have a nonlinear function that is not composed of polynomials, rational expressions, and elementary functions such as `exp`, then convert the function to an optimization expression by using `fcn2optimexpr`. See Convert Nonlinear Function to Optimization Expression and Supported Operations for Optimization Variables and Expressions.

Create `ga` options to use the `gaplotbestf` plot function.

`options = optimoptions("ga","PlotFcn","gaplotbestf");`

Solve the problem using `ga` as the solver.

```rng default % For reproducibility [sol,fval] = solve(prob,"Solver","ga","Options",options)```
```Solving problem using ga. ga stopped because the average change in the fitness value is less than options.FunctionTolerance. ```

```sol = struct with fields: x: 0.9950 y: 0.9950 ```
```fval = 1.9899 ```

Is the resulting function value the lowest minimum? Perform the search again. Because `ga` is a stochastic algorithm, the results can differ.

`[sol2,fval2] = solve(prob,"Solver","ga","Options",options)`
```Solving problem using ga. ga stopped because the average change in the fitness value is less than options.FunctionTolerance. ```

```sol2 = struct with fields: x: 0.9950 y: -4.9289e-06 ```
```fval2 = 0.9950 ```

The second solution is better because it has a lower function value. A solution returned by `ga` is not guaranteed to be a global solution.