Main Content

Optimization of Stochastic Objective Function

This example shows how to find a minimum of a stochastic objective function using patternsearch. It also shows how Optimization Toolbox™ solvers are not suitable for this type of problem. The example uses a simple 2-dimensional objective function that is then perturbed by noise.

Initialization

X0 = [2.5 -2.5];   % Starting point.
LB = [-5 -5];      % Lower bound
UB = [5 5];        % Upper bound
range = [LB(1) UB(1); LB(2) UB(2)];
Objfcn = @smoothFcn; % Handle to the objective function.
% Plot the smooth objective function
fig = figure('Color','w');
showSmoothFcn(Objfcn,range);
hold on;
title('Smooth objective function');
ph = [];
ph(1) = plot3(X0(1),X0(2),Objfcn(X0)+30,'or','MarkerSize',10,'MarkerFaceColor','r');
hold off;
ax = gca;
ax.CameraPosition = [-31.0391  -85.2792 -281.4265];
ax.CameraTarget = [0 0 -50];
ax.CameraViewAngle = 6.7937;
% Add legend information
legendLabels = {'Start point'};
lh = legend(ph,legendLabels,'Location','SouthEast');
lp = lh.Position;
lh.Position = [1-lp(3)-0.005 0.005 lp(3) lp(4)];

Run fmincon on a Smooth Objective Function

The objective function is smooth (twice continuously differentiable). Solve the optimization problem using the Optimization Toolbox fmincon solver. fmincon finds a constrained minimum of a function of several variables. This function has a unique minimum at the point x* = [-5,-5] where it has a value f(x*) = -250.

Set options to return iterative display.

options = optimoptions(@fmincon,'Algorithm','interior-point','Display','iter');
[Xop,Fop] = fmincon(Objfcn,X0,[],[],[],[],LB,UB,[],options)
figure(fig);
hold on;
                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
    0       3   -1.062500e+01    0.000e+00    2.004e+01
    1       6   -1.578420e+02    0.000e+00    5.478e+01    6.734e+00
    2       9   -2.491310e+02    0.000e+00    6.672e+01    1.236e+00
    3      12   -2.497554e+02    0.000e+00    2.397e-01    6.310e-03
    4      15   -2.499986e+02    0.000e+00    5.065e-02    8.016e-03
    5      18   -2.499996e+02    0.000e+00    9.708e-05    3.367e-05
    6      21   -2.500000e+02    0.000e+00    1.513e-04    6.867e-06
    7      24   -2.500000e+02    0.000e+00    1.161e-06    6.920e-08

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.


Xop =

   -5.0000   -5.0000


Fop =

 -250.0000

Plot the final point

ph(2) = plot3(Xop(1),Xop(2),Fop,'dm','MarkerSize',10,'MarkerFaceColor','m');
% Add a legend to plot
legendLabels = [legendLabels, '|fmincon| solution'];
lh = legend(ph,legendLabels,'Location','SouthEast');
lp = lh.Position;
lh.Position = [1-lp(3)-0.005 0.005 lp(3) lp(4)];
hold off;

Stochastic Objective Function

Now perturb the objective function by adding random noise.

rng(0,'twister') % Reset the global random number generator
peaknoise = 4.5;
Objfcn = @(x) smoothFcn(x,peaknoise); % Handle to the objective function.
% Plot the objective function (non-smooth)
fig = figure('Color','w');
showSmoothFcn(Objfcn,range);
title('Stochastic objective function')
ax = gca;
ax.CameraPosition = [-31.0391  -85.2792 -281.4265];
ax.CameraTarget = [0 0 -50];
ax.CameraViewAngle = 6.7937;

Run fmincon on a Stochastic Objective Function

The perturbed objective function is stochastic and not smooth. fmincon is a general constrained optimization solver which finds a local minimum using derivatives of the objective function. If you do not provide the first derivatives of the objective function, fmincon uses finite differences to approximate the derivatives. In this example, the objective function is random, so finite difference estimates derivatives hence can be unreliable. fmincon can potentially stop at a point that is not a minimum. This may happen because the optimal conditions seems to be satisfied at the final point because of noise, or fmincon could not make further progress.

[Xop,Fop] = fmincon(Objfcn,X0,[],[],[],[],LB,UB,[],options)
figure(fig);
hold on;
ph = [];
ph(1) = plot3(X0(1),X0(2),Objfcn(X0)+30,'or','MarkerSize',10,'MarkerFaceColor','r');
ph(2) = plot3(Xop(1),Xop(2),Fop,'dm','MarkerSize',10,'MarkerFaceColor','m');
% Add legend to plot
legendLabels = {'Start point','|fmincon| solution'};
lh = legend(ph,legendLabels,'Location','SouthEast');
lp = lh.Position;
lh.Position = [1-lp(3)-0.005 0.005 lp(3) lp(4)];
hold off;
                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
    0       3   -1.925772e+01    0.000e+00    2.126e+08
    1       6   -7.107849e+01    0.000e+00    2.623e+08    8.873e+00
    2      11   -8.055890e+01    0.000e+00    2.401e+08    6.715e-01
    3      20   -8.325315e+01    0.000e+00    7.348e+07    3.047e-01
    4      48   -8.366302e+01    0.000e+00    1.762e+08    1.593e-07
    5      64   -8.591081e+01    0.000e+00    1.569e+08    3.111e-10

Local minimum possible. Constraints satisfied.

fmincon stopped because the size of the current step is less than
the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.


Xop =

   -4.9628    2.6673


Fop =

  -85.9108

Run patternsearch

Now minimize the stochastic objective function using the Global Optimization Toolbox patternsearch solver. Pattern search optimization techniques are a class of direct search methods for optimization. A pattern search algorithm does not use derivatives of the objective function to find an optimal point.

PSoptions = optimoptions(@patternsearch,'Display','iter');
[Xps,Fps] = patternsearch(Objfcn,X0,[],[],[],[],LB,UB,PSoptions)
figure(fig);
hold on;
ph(3) = plot3(Xps(1),Xps(2),Fps,'dc','MarkerSize',10,'MarkerFaceColor','c');
% Add legend to plot
legendLabels = [legendLabels, 'Pattern Search solution'];
lh = legend(ph,legendLabels,'Location','SouthEast');
lp = lh.Position;
lh.Position = [1-lp(3)-0.005 0.005 lp(3) lp(4)];
hold off

Iter     Func-count       f(x)      MeshSize     Method
    0           1       -7.20766             1      
    1           3       -34.7227             2     Successful Poll
    2           3       -34.7227             1     Refine Mesh
    3           5       -34.7227           0.5     Refine Mesh
    4           8       -96.0847             1     Successful Poll
    5          10       -96.0847           0.5     Refine Mesh
    6          13       -132.888             1     Successful Poll
    7          15       -132.888           0.5     Refine Mesh
    8          17       -132.888          0.25     Refine Mesh
    9          20       -197.689           0.5     Successful Poll
   10          22       -197.689          0.25     Refine Mesh
   11          24       -197.689         0.125     Refine Mesh
   12          27       -241.344          0.25     Successful Poll
   13          29       -241.344         0.125     Refine Mesh
   14          31       -254.624          0.25     Successful Poll
   15          33       -254.624         0.125     Refine Mesh
   16          35       -254.624        0.0625     Refine Mesh
   17          37       -254.624       0.03125     Refine Mesh
   18          39       -254.624       0.01562     Refine Mesh
   19          41       -254.624      0.007812     Refine Mesh
   20          42       -256.009       0.01562     Successful Poll
   21          44       -256.009      0.007812     Refine Mesh
   22          47       -256.009      0.003906     Refine Mesh
   23          50       -256.009      0.001953     Refine Mesh
   24          53       -256.009     0.0009766     Refine Mesh
   25          56       -256.009     0.0004883     Refine Mesh
   26          59       -256.009     0.0002441     Refine Mesh
   27          62       -256.009     0.0001221     Refine Mesh
   28          65       -256.009     6.104e-05     Refine Mesh
   29          68       -256.009     3.052e-05     Refine Mesh
   30          71       -256.009     1.526e-05     Refine Mesh

Iter     Func-count        f(x)       MeshSize      Method
   31          74       -256.009     7.629e-06     Refine Mesh
   32          77       -256.009     3.815e-06     Refine Mesh
   33          80       -256.009     1.907e-06     Refine Mesh
   34          83       -256.009     9.537e-07     Refine Mesh
patternsearch stopped because the mesh size was less than options.MeshTolerance.

Xps =

   -4.9688   -5.0000


Fps =

 -256.0095

Pattern search is not as strongly affected by random noise in the objective function. Pattern search requires only function values and not the derivatives, hence noise (of some uniform kind) may not affect it. However, pattern search requires more function evaluation to find the true minimum than derivative based algorithms, a cost for not using the derivatives.

Related Topics