www.gusucode.com > globaloptim 案例源码程序 matlab代码 > globaloptim/hybriddemo.m
%% Hybrid Scheme in the Genetic Algorithm % Copyright 2003-2015 The MathWorks, Inc. %% Introduction % This example shows how to use a hybrid scheme to optimize a function using the Genetic % Algorithm and another optimization method. |ga| can reach the region near % an optimum point relatively quickly, but it can take many function % evaluations to achieve convergence. A commonly used technique is to run % |ga| for a small number of generations to get near an optimum point. Then % the solution from |ga| is used as an initial point for another optimization % solver that is faster and more efficient for local search. %% Rosenbrock's Function % In this example we will optimize Rosenbrock's function (also known as % Dejong's second function): % % f(x)= 100*(x(2)-x(1)^2)^2+(1-x(1))^2 % % This function is notorious in optimization because of the slow % convergence most methods exhibit when trying to minimize this function. % This function has a unique minimum at the point x* = (1,1) where it has a % function value f(x*) = 0. % % We can view the code for this fitness function. type dejong2fcn.m %% % We use the function |plotobjective| in the toolbox to plot the % function |dejong2fcn| over the range = [-2 2;-2 2]. plotobjective(@dejong2fcn,[-2 2;-2 2]); %% Genetic Algorithm Solution % To start, we will use the Genetic Algorithm, |ga|, alone to find the % minimum of Rosenbrock's function. We need to supply |ga| with a function % handle to the fitness function |dejong2fcn.m|. Also, |ga| needs to know the % how many variables are in the problem, which is two for this function. FitnessFcn = @dejong2fcn; numberOfVariables = 2; %% % Some plot functions can be selected to monitor the performance of the % solver. options = optimoptions(@ga,'PlotFcn',{@gaplotbestf,@gaplotstopping}); %% % We set the random number stream for reproducibility, and run |ga| with the % above inputs. rng('default') [x,fval] = ga(FitnessFcn,numberOfVariables,[],[],[],[],[],[],[],options) %% % The global optimum is at x* = (1,1). |ga| found a point near the optimum, % but could not get a more accurate answer with the default stopping % criteria. By changing the stopping criteria, we might find a more % accurate solution, but it may take many more function evaluations to % reach x* = (1,1). Instead, we can use a more efficient local search that % starts where |ga| left off. The hybrid function field in |ga| provides this % feature automatically. %% Adding a Hybrid Function % We will use a hybrid function to solve the optimization problem, i.e., % when |ga| stops (or you ask it to stop) this hybrid function will start % from the final point returned by |ga|. Our choices are |fminsearch|, % |patternsearch|, or |fminunc|. Since this optimization example is smooth, % i.e., continuously differentiable, we can use the |fminunc| function from % Optimization Toolbox as our hybrid function. Since |fminunc| has its % own options structure, we provide it as an additional argument when % specifying the hybrid function. fminuncOptions = optimoptions(@fminunc,'Display','iter','Algorithm','quasi-newton'); options = optimoptions(options,'HybridFcn',{@fminunc, fminuncOptions}); %% % Run |ga| solver again with |fminunc| as the hybrid function. [x,fval] = ga(@dejong2fcn,numberOfVariables,[],[],[],[],[],[],[],options) %% % The first plot shows the best and mean values of the population in every % generation. The best value found by |ga| when it terminated is also shown % in the plot title. When |ga| terminated, |fminunc| (the hybrid function) was % automatically called with the best point found by |ga| so far. The solution % |x| and |fval| is the result of using |ga| and |fminunc| together. As shown % here, using the hybrid function can improve the accuracy of the % solution efficiently.