www.gusucode.com > globaloptim 案例源码程序 matlab代码 > globaloptim/gamultiobjoptionsdemo.m
%% Multiobjective Genetic Algorithm Options % This example shows how to create and manage options for the % multiobjective genetic algorithm function |gamultiobj| using % |optimoptins| in Global Optimization Toolbox. % Copyright 2007-2015 The MathWorks, Inc. %% Setting Up a Problem for |gamultiobj| % |gamultiobj| finds a local Pareto front for multiple objective functions % using the genetic algorithm. For this example, we will use |gamultiobj| to % obtain a Pareto front for two objective functions described in the MATLAB % file |kur_multiobjective.m|. It is a real-valued function that consists of % two objectives, each of three decision variables. We also impose bound % constraints on the decision variables -5 <= x(i) <= 5, i = 1,2,3. type kur_multiobjective.m %% % We need to provide a fitness function, the number of variables, and bound % constraints in the problem to |gamultiobj| function. Refer to the help for % the |gamultiobj| function for the syntax. Here we also want to plot the % Pareto front in every generation using the plot function |@gaplotpareto|. % We use |optimoptions| function to specify this plot function. FitnessFunction = @kur_multiobjective; % Function handle to the fitness function numberOfVariables = 3; % Number of decision variables lb = [-5 -5 -5]; % Lower bound ub = [5 5 5]; % Upper bound A = []; % No linear inequality constraints b = []; % No linear inequality constraints Aeq = []; % No linear equality constraints beq = []; % No linear equality constraints options = optimoptions(@gamultiobj,'PlotFcn',@gaplotpareto); %% % Run the |gamultiobj| solver and display the number of solutions found on % the Pareto front and the number of generations. [x,Fval,exitFlag,Output] = gamultiobj(FitnessFunction,numberOfVariables,A, ... b,Aeq,beq,lb,ub,options); fprintf('The number of points on the Pareto front was: %d\n', size(x,1)); fprintf('The number of generations was : %d\n', Output.generations); %% % The Pareto plot displays two competing objectives. For this problem, % the Pareto front is known to be disconnected. The solution from % |gamultiobj| can capture the Pareto front even if it is disconnected. Note % that when you run this example, your result may be different from the results % shown because |gamultiobj| uses random number generators. %% Elitist Multiobjective Genetic Algorithm % The multiobjective genetic algorithm (|gamultiobj|) works on a population % using a set of operators that are applied to the population. A population % is a set of points in the design space. The initial population is % generated randomly by default. The next generation of the population is % computed using the non-dominated rank and a distance measure of the % individuals in the current generation. %% % A non-dominated rank is assigned to each individual using the relative % fitness. Individual 'p' dominates 'q' ('p' has a lower rank than 'q') if % 'p' is strictly better than 'q' in at least one objective and 'p' is no % worse than 'q' in all objectives. This is same as saying 'q' is dominated % by 'p' or 'p' is non-inferior to 'q'. Two individuals 'p' and 'q' are % considered to have equal ranks if neither dominates the other. The % distance measure of an individual is used to compare individuals with % equal rank. It is a measure of how far an individual is from the % other individuals with the same rank. %% % The multiobjective GA function |gamultiobj| uses a controlled elitist % genetic algorithm (a variant of NSGA-II [1]). An elitist GA always favors % individuals with better fitness value (rank) whereas, a controlled % elitist GA also favors individuals that can help increase the diversity % of the population even if they have a lower fitness value. It is very % important to maintain the diversity of population for convergence to an % optimal Pareto front. This is done by controlling the elite members of % the population as the algorithm progresses. Two options 'ParetoFraction' % and 'DistanceFcn' are used to control the elitism. The Pareto fraction % option limits the number of individuals on the Pareto front (elite % members) and the distance function helps to maintain diversity on a % front by favoring individuals that are relatively far away on the front. %% Specifying Multiobjective GA Options % We can chose the default distance measure function, |distancecrowding|, % that is provided in the toolbox or write our own function to calculate % the distance measure of an individual. The crowding distance measure % function in the toolbox takes an optional argument to calculate distance % either in function space (phenotype) or design space (genotype). If % |'genotype'| is chosen, then the diversity on a Pareto front is based on % the design space. The default choice is |'phenotype'| and, in that case, the % diversity is based on the function space. Here we choose |'genotype'| for % our distance function. We will directly modify the value of the parameter % |DistanceMeasureFcn|. options.DistanceMeasureFcn = {@distancecrowding,'genotype'}; %% % The Pareto fraction has a default value of 0.35 i.e., the solver will try % to limit the number of individuals in the current population that are on % the Pareto front to 35 percent of the population size. Here we set the % Pareto fraction to 0.5. options = optimoptions(options,'ParetoFraction',0.5); %% % Run the |gamultiobj| solver and display the number of solutions found on % the Pareto front and the average distance measure of solutions. [x,Fval,exitFlag,Output] = gamultiobj(FitnessFunction,numberOfVariables,A, ... b,Aeq,beq,lb,ub,options); fprintf('The number of points on the Pareto front was: %d\n', size(x,1)); fprintf('The average distance measure of the solutions on the Pareto front was: %g\n', Output.averagedistance); fprintf('The spread measure of the Pareto front was: %g\n', Output.spread); %% % A smaller average distance measure indicates that the solutions on the % Pareto front are evenly distributed. However, if the Pareto front is % disconnected, then the distance measure will not indicate the true spread % of solutions. %% Modifying the Stopping Criteria % |gamultiobj| uses three different criteria to determine when to stop the % solver. The solver stops when any one of the stopping criteria is met. It % stops when the maximum number of generations is reached; by default this % number is |'200*numberOfVariables'|. |gamultiobj| also stops if the % average change in the spread of the Pareto front over the % |MaxStallGenerations| generations (default is 100) is less than tolerance % specified in |options.FunctionTolerance|. The third criterion is the % maximum time limit in seconds (default is |Inf|). Here we modify the % stopping criteria to change the |FunctionTolerance| from 1e-4 to 1e-3 and % increase |MaxStallGenerations| to 150. options = optimoptions(options,'FunctionTolerance',1e-3,'MaxStallGenerations',150); %% % Run the |gamultiobj| solver and display the number of solutions found on % the Pareto front and the number of generations. [x,Fval,exitFlag,Output] = gamultiobj(FitnessFunction,numberOfVariables,A, ... b,Aeq,beq,lb,ub,options); fprintf('The number of points on the Pareto front was: %d\n', size(x,1)); fprintf('The number of generations was : %d\n', Output.generations); %% Multiobjective GA Hybrid Function % We will use a hybrid scheme to find an optimal Pareto front for our % multiobjective problem. |gamultiobj| can reach the region near an optimal % Pareto front relatively quickly, but it can take many function % evaluations to achieve convergence. A commonly used technique is to run % |gamultiobj| for a small number of generations to get near an optimum % front. Then the solution from |gamultiobj| is used as an initial point for % another optimization solver that is faster and more efficient for a local % search. We use |fgoalattain| as the hybrid solver with |gamultiobj|. % |fgoalattain| solves the goal attainment problem, which is one formulation % for minimizing a multiobjective optimization problem. %% % The hybrid functionality in multiobjective function |gamultiobj| is % slightly different from that of the single objective function GA. In % single objective GA the hybrid function starts at the best point returned % by GA. However, in |gamultiobj| the hybrid solver will start at all the % points on the Pareto front returned by |gamultiobj|. The new individuals % returned by the hybrid solver are combined with the existing population % and a new Pareto front is obtained. It may be useful to see the syntax of % |fgoalattain| function to better understand how the output from |gamultiobj| % is internally converted to the input of |fgoalattain| function. |gamultiobj| % estimates the pseudo weights (required input for |fgoalattain|) for each % point on the Pareto front and runs the hybrid solver starting from each % point on the Pareto front. Another required input, goal, is a vector % specifying the goal for each objective. |gamultiobj| provides this input % as the extreme points from the Pareto front found so far. %% % Here we run |gamultiobj| without the hybrid function. [x,Fval,exitFlag,Output] = gamultiobj(FitnessFunction,numberOfVariables,A, ... b,Aeq,beq,lb,ub,options); fprintf('The number of points on the Pareto front was: %d\n', size(x,1)); fprintf('The average distance measure of the solutions on the Pareto front was: %g\n', Output.averagedistance); fprintf('The spread measure of the Pareto front was: %g\n', Output.spread); %% % Here we use |fgoalattain| as the hybrid function. We also reset the random % number generators so that we can compare the results with the previous % run (without the hybrid function). options = optimoptions(options,'HybridFcn',@fgoalattain); % Reset the random state (only to compare with previous run) RandStream.getGlobalStream.State = Output.rngstate.state; % Run the GAMULTIOBJ solver with hybrid function. [x,Fval,exitFlag,Output,Population,Score] = gamultiobj(FitnessFunction,numberOfVariables,A, ... b,Aeq,beq,lb,ub,options); fprintf('The number of points on the Pareto front was: %d\n', size(x,1)); fprintf('The average distance measure of the solutions on the Pareto front was: %g\n', Output.averagedistance); fprintf('The spread measure of the Pareto front was: %g\n', Output.spread); %% % If the Pareto fronts obtained by |gamultiobj| alone and by using the % hybrid function are close, we can compare them using the spread and % the average distance measures. The average distance of the solutions on % the Pareto front can be improved by using a hybrid function. The spread % is a measure of the change in two fronts and that can be higher when % hybrid function is used. This indicates that the front has changed % considerably from that obtained by |gamultiobj| with no hybrid function. %% % It is certain that using the hybrid function will result in a optimal % Pareto front but we may lose the diversity of the solution (because % |fgoalattain| does not try to preserve the diversity). This can be % indicated by a higher value of the average distance measure and the % spread of the front. We can further improve the average distance measure % of the solutions and the spread of the Pareto front by running |gamultiobj| % again with the final population returned in the last run. Here, we should % remove the hybrid function. options = optimoptions(options,'HybridFcn',[]); % No hybrid function % Provide initial population and scores options = optimoptions(options,'InitialPopulationMatrix',Population,'InitialScoresMatrix',Score); % Run the GAMULTIOBJ solver with hybrid function. [x,Fval,exitFlag,Output,Population,Score] = gamultiobj(FitnessFunction,numberOfVariables,A, ... b,Aeq,beq,lb,ub,options); fprintf('The number of points on the Pareto front was: %d\n', size(x,1)); fprintf('The average distance measure of the solutions on the Pareto front was: %g\n', Output.averagedistance); fprintf('The spread measure of the Pareto front was: %g\n', Output.spread); %% References % [1] Kalyanmoy Deb, "Multi-Objective Optimization using Evolutionary % Algorithms", John Wiley & Sons ISBN 047187339.