www.gusucode.com > globaloptim 案例源码程序 matlab代码 > globaloptim/psoptionsdemo.m

    %% Pattern Search Options
% This example shows how to create and manage options for the pattern search 
% function |patternsearch| using the |optimoptions| function in the Global Optimization Toolbox.

%   Copyright 2004-2015 The MathWorks, Inc.

%% Setting Up a Problem for Pattern Search
% |patternsearch| finds a linearly constrained minimum of a function.
%   |patternsearch| attempts to solve problems of the form: 
%       min F(X)  subject to: A*X  <= B, Aeq*X  = Beq (linear constraints)
%        X                    C(X) <= 0, Ceq(X) = 0 (nonlinear constraints)
%                             LB <= X <= UB
%
% In this example, the |patternsearch| solver is used to optimize an objective
% function subject to some linear equality and inequality constraints.

%%
% The pattern search solver takes at least two input arguments, namely the
% objective function and a start point. We will use the objective function
% |lincontest7| which is in the MATLAB file |lincontest7.m|. We pass a
% function handle to |lincontest7| as the first argument. The second
% argument is a starting point. Since |lincontest7| is a function of six
% variables, our start point must be of length six.
X0 = [2 1 0 9 1 0];
objectiveFcn = @lincontest7;

%%
% We also create the constraint matrices for the problem.
Aineq = [-8 7 3 -4 9 0 ];
Bineq = [7];
Aeq = [7 1 8 3 3 3; 5 0 5 1 5 8; 2 6 7 1 1 8; 1 0 0 0 0 0];
Beq = [84 62 65 1];

%%
% Next we run the |patternsearch| solver.
[X1,Fval,Exitflag,Output] = patternsearch(objectiveFcn,X0,Aineq,Bineq,Aeq,Beq);

fprintf('The number of iterations was : %d\n', Output.iterations);
fprintf('The number of function evaluations was : %d\n', Output.funccount);
fprintf('The best function value found was : %g\n', Fval);

%% Adding Visualization
% If you are interested in visualizing the performance of the solver at run
% time you can use the provided plot functions or create your own.
% |patternsearch| can accept one or more plot functions. Plot functions can
% be selected using the function |optimoptions|. The default is that no
% plot functions are called while |patternsearch| is running. Here we
% create options using |optimoptions| that select two plot functions. The
% first plot function |psplotbestf| plots the best objective function value
% at every iteration, and the second plot function |psplotfuncount| plots
% the number of times the objective function is evaluated at each
% iteration.
opts = optimoptions(@patternsearch,'PlotFcn',{@psplotbestf,@psplotfuncount});
%%
% We run the |patternsearch| solver.  Since we do not have upper or lower
% bound constraints and nonlinear constraints, we pass empty arrays (|[]|)
% for the seventh, eighth, and ninth arguments.
[X1,Fval,ExitFlag,Output] = patternsearch(objectiveFcn,X0,Aineq,Bineq, ...
    Aeq,Beq,[],[],[],opts);

%% Mesh Parameters
%
%%
% *Initial mesh size*
%
% The pattern search algorithm uses a set of rational basis vectors to
% generate search directions. It performs a search along the search
% directions using the current mesh size. The solver starts with an initial
% mesh size of one by default. To start the initial mesh size at 10, we can
% use |optimoptions|:
options = optimoptions(@patternsearch,'InitialMeshSize',10);

%%
% *Mesh scaling*
%%
% A mesh can be scaled to improve the minimization of a badly scaled
% optimization problem. Scale is used to rotate the pattern by some degree
% and scale along the search directions. The scale option is on (|true|) by
% default but can be turned off if the problem is well scaled. In general,
% if the problem is badly scaled, setting this option to |true| may help in
% reducing the number of function evaluations. For our objective function,
% we can set |ScaleMesh| to |false| because it is known to be a well scaled
% problem.
opts = optimoptions(@patternsearch,'ScaleMesh',false);

%%
% *Mesh accelerator*
%%
% Direct search methods require many function evaluations as compared to
% derivative-based optimization methods. The pattern search algorithm can
% quickly find the neighborhood of an optimum point, but may be slow in
% detecting the minimum itself. This is the cost of not using derivatives.
% The |patternsearch| solver can reduce the number of function evaluations
% using an accelerator. When the accelerator is on (|opts.AccelerateMesh =
% true|) the mesh size is contracted rapidly after some minimum mesh size
% is reached. This option is recommended only for smooth problems,
% otherwise you may lose some accuracy. The accelerator is off (|false|) by
% default. Here we set the |AccelerateMesh| to |true| because we know that
% our objective function is smooth.

%%
% Set |AccelerateMesh| to |true| and set |ScaleMesh| to |false|.
opts = optimoptions(@patternsearch,'AccelerateMesh',true,'ScaleMesh',false);

%%
% Run the |patternsearch| solver.
[X2,Fval,ExitFlag,Output] = patternsearch(objectiveFcn,X0,Aineq,Bineq, ...
    Aeq,Beq,[],[],[],opts);

fprintf('The number of iterations was : %d\n', Output.iterations);
fprintf('The number of function evaluations was : %d\n', Output.funccount);
fprintf('The best function value found was : %g\n', Fval);
%%
% Turning the accelerator on reduced the number of function evaluations.

%% Stopping Criteria and Tolerances
% *What are MeshTolerance, StepTolerance and FunctionTolerance?*
%%
% |MeshTolerance| is a tolerance on the mesh size. If the mesh size is less than
% |MeshTolerance|, the solver will stop. |StepTolerance| is used as the minimum tolerance
% on the change in the current point to the next point. |FunctionTolerance| is used as
% the minimum tolerance on the change in the function value from the
% current point to the next point.
%
% We can create options that set |StepTolerance| to 1e-7 using
% |optimoptions|. We can update |StepTolerance| directly in our previously
% created options |opts| by using the "." operator.
opts.StepTolerance = 1e-7;

%% Search Methods in Pattern Search
% The pattern search algorithm can use an additional search at every
% iteration. This option is called the |SearchFcn|. When a |SearchFcn|
% is provided, that search is done first before the mesh search. If the
% |SearchFcn| is successful, the mesh search, commonly called the
% |PollFcn| is skipped. If the search method is unsuccessful in improving
% the current point, the poll method is performed.
%
% The toolbox provides five different search methods. These search
% methods include |searchga| and |searchneldermead|, which are two
% different optimization algorithms. It is recommended to use these
% methods only for the first iteration, which is the default. Using these
% methods repeatedly at every iteration might not improve the results
% and could be computationally expensive. One the other hand, the
% |searchlhs|, which generates latin hypercube points, can be used in
% every iteration or possibly every 10 iterations. Other choices for
% search methods include Poll methods such as positive basis N+1 or
% positive basis 2N.
%
% A recommended strategy is to use the positive basis N+1 (which requires at
% most N+1 points to create a pattern) as a search method and positive basis
% 2N (which requires 2N points to create a pattern) as a poll method. We
% update our options structure to use |positivebasisnp1| as the search
% method. Since the positive basis 2N is the default |PollFcn|, we do not
% need to set that option. Additionally we can select the plot functions we
% used in first part of this example to compare the performance of the solver.
opts = optimoptions(opts,'SearchFcn',@positivebasisnp1, ...
                         'PlotFcn',{@psplotbestf, @psplotfuncount});
%%
% Run the |patternsearch| solver.
[X5,Fval,ExitFlag,Output] = patternsearch(objectiveFcn,X0,Aineq,Bineq,Aeq,Beq, ...
    [],[],[],opts);

fprintf('The number of iterations was : %d\n', Output.iterations);
fprintf('The number of function evaluations was : %d\n', Output.funccount);
fprintf('The best function value found was : %g\n', Fval);

%%
% With the above settings of options, the total number of function
% evaluations decreased.