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

    %% Performing a Multiobjective Optimization Using the Genetic Algorithm
% This example shows how to perform a multiobjective optimization 
% using multiobjective genetic algorithm function |gamultiobj| in 
% Global Optimization Toolbox.

%   Copyright 2007-2015 The MathWorks, Inc.

%% Simple Multiobjective Optimization Problem
% |gamultiobj| can be used to solve multiobjective optimization problem in
% several variables. Here we want to minimize two objectives, each having
% one decision variable. 
%
%     min F(x) = [objective1(x); objective2(x)] 
%      x
%
%     where, objective1(x) = (x+2)^2 - 10, and
%            objective2(x) = (x-2)^2 + 20

% Plot two objective functions on the same axis
x = -10:0.5:10;
f1 = (x+2).^2 - 10;
f2 = (x-2).^2 + 20;
plot(x,f1);
hold on;
plot(x,f2,'r');
grid on;
title('Plot of objectives ''(x+2)^2 - 10'' and ''(x-2)^2 + 20''');
%%
% The two objectives have their minima at |x = -2| and |x = +2|
% respectively. However, in a multiobjective problem, |x = -2|, |x = 2|,
% and any solution in the range |-2 <= x <= 2| is equally optimal. There is
% no single solution to this multiobjective problem. The goal of the
% multiobjective genetic algorithm is to find a set of solutions in that
% range (ideally with a good spread). The set of solutions is also known as
% a Pareto front. All solutions on the Pareto front are optimal.

%%  Coding the Fitness Function
% We create a MATLAB-file named |simple_multiobjective.m|:
%
%     function y = simple_multiobjective(x)
%     y(1) = (x+2)^2 - 10;
%     y(2) = (x-2)^2 + 20;
%
% The Genetic Algorithm solver assumes the fitness function will take one
% input |x|, where |x| is a row vector with as many elements as the number
% of variables in the problem. The fitness function computes the value of
% each objective function and returns these values in a single vector
% output |y|.

%% Minimizing Using |gamultiobj|
% To use the |gamultiobj| function, we need to provide at least two input
% arguments, a fitness function, and the number of variables in the
% problem. The first two output arguments returned by |gamultiobj| are |X|,
% the points on Pareto front, and |FVAL|, the objective function values at
% the values |X|. A third output argument, |exitFlag|, tells you the reason
% why |gamultiobj| stopped. A fourth argument, |OUTPUT|, contains
% information about the performance of the solver. |gamultiobj| can also
% return a fifth argument, |POPULATION|, that contains the population when
% |gamultiobj| terminated and a sixth argument, |SCORE|, that contains the
% function values of all objectives for |POPULATION| when |gamultiobj|
% terminated.
FitnessFunction = @simple_multiobjective;
numberOfVariables = 1;
[x,fval] = gamultiobj(FitnessFunction,numberOfVariables);

%%
% The |X| returned by the solver is a matrix in which each row is the
% point on the Pareto front for the objective functions. The |FVAL| is a
% matrix in which each row contains the value of the objective functions
% evaluated at the corresponding point in |X|.
size(x)
size(fval)

%% Constrained Multiobjective Optimization Problem
% |gamultiobj| can handle optimization problems with linear inequality,
% equality, and simple bound constraints. Here we want to add bound
% constraints on simple multiobjective problem solved previously. 
%
%     min F(x) = [objective1(x); objective2(x)] 
%      x
%      
%     subject to  -1.5 <= x <= 0 (bound constraints)
%
%     where, objective1(x) = (x+2)^2 - 10, and
%            objective2(x) = (x-2)^2 + 20

%%
% |gamultiobj| accepts linear inequality constraints in the form |A*x <= b|
% and linear equality constraints in the form |Aeq*x = beq| and bound
% constraints in the form |lb <= x <= ub|. We pass |A| and |Aeq| as
% matrices and |b|, |beq|, |lb|, and |ub| as vectors. Since we have no
% linear constraints in this example, we pass |[]| for those inputs.
A = []; b = [];
Aeq = []; beq = [];
lb = -1.5;
ub = 0;
x = gamultiobj(FitnessFunction,numberOfVariables,A,b,Aeq,beq,lb,ub);

%%
% All solutions in |X| (each row) will satisfy all linear and bound
% constraints within the tolerance specified in
% |options.ConstraintTolerance|. However, if you use your own crossover or
% mutation function, ensure that the new individuals are feasible with
% respect to linear and simple bound constraints.

%% Adding Visualization
% |gamultiobj| can accept one or more plot functions through the options
% argument. This feature is useful for visualizing the performance of the
% solver at run time. Plot functions can be selected using |optimoptions|.  
%
% Here we use |optimoptions| to select two plot functions. The first plot
% function is |gaplotpareto|, which plots the Pareto front (limited to any
% three objectives) at every generation. The second plot function is
% |gaplotscorediversity|, which plots the score diversity for each
% objective. The options are passed as the last argument to the solver.
options = optimoptions(@gamultiobj,'PlotFcn',{@gaplotpareto,@gaplotscorediversity});
gamultiobj(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub,options);

%% Vectorizing Your Fitness Function
% Consider the previous fitness functions again:
%
%     objective1(x) = (x+2)^2 - 10, and
%     objective2(x) = (x-2)^2 + 20
%
% By default, the |gamultiobj| solver only passes in one point at a time to
% the fitness function. However, if the fitness function is vectorized to
% accept a set of points and returns a set of function values you can speed
% up your solution.
%
% For example, if the solver needs to evaluate five points in one call to
% this fitness function, then it will call the function with a matrix of
% size 5-by-1, i.e., 5 rows and 1 column (recall that 1 is the number of
% variables).
%
% Create a MATLAB-file called |vectorized_multiobjective.m|:
%
%     function scores = vectorized_multiobjective(pop)
%       popSize = size(pop,1); % Population size 
%       numObj = 2;  % Number of objectives
%       % initialize scores
%       scores = zeros(popSize, numObj);
%       % Compute first objective
%       scores(:,1) = (pop + 2).^2 - 10;
%       % Compute second obective
%       scores(:,2) = (pop - 2).^2 + 20;
%
% This vectorized version of the fitness function takes a matrix |pop| with
% an arbitrary number of points, the rows of |pop|, and returns a matrix of
% size |populationSize|-by-|numberOfObjectives|.
%
% We need to specify that the fitness function is vectorized using the
% options created using |optimoptions|. The options are passed in as the
% ninth argument.

FitnessFunction = @(x) vectorized_multiobjective(x);
options = optimoptions(@gamultiobj,'UseVectorized',true);
gamultiobj(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub,options);