www.pudn.com > NSGAII.rar > nsga_2.m, change:2009-07-16,size:6073b


function nsga_2() 
%% Main Function 
% Main program to run the NSGA-II MOEA. 
% Read the corresponding documentation to learn more about multiobjective 
% optimization using evolutionary algorithms. 
% initialize_variables has two arguments; First being the population size 
% and the second the problem number. '1' corresponds to MOP1 and '2' 
% corresponds to MOP2. 
 
%% Initialize the variables 
% Declare the variables and initialize their values 
% pop - population 
% gen - generations 
% pro - problem number 

%
%  Copyright (c) 2009, Aravind Seshadri
%  All rights reserved.
%
%  Redistribution and use in source and binary forms, with or without 
%  modification, are permitted provided that the following conditions are 
%  met:
%
%     * Redistributions of source code must retain the above copyright 
%       notice, this list of conditions and the following disclaimer.
%     * Redistributions in binary form must reproduce the above copyright 
%       notice, this list of conditions and the following disclaimer in 
%       the documentation and/or other materials provided with the distribution
%      
%  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
%  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
%  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
%  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
%  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
%  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
%  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
%  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
%  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
%  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
%  POSSIBILITY OF SUCH DAMAGE. 
 
pop = 200; 
gen = 1000; 
pro = 1; 
 
switch pro 
    case 1 
        % M is the number of objectives. 
        M = 2; 
        % V is the number of decision variables. In this case it is 
        % difficult to visualize the decision variables space while the 
        % objective space is just two dimensional. 
        V = 6; 
    case 2 
        M = 3; 
        V = 12; 
end 
 
% Initialize the population 
chromosome = initialize_variables(pop,pro); 
 
 
%% Sort the initialized population 
% Sort the population using non-domination-sort. This returns two columns 
% for each individual which are the rank and the crowding distance 
% corresponding to their position in the front they belong.  
chromosome = non_domination_sort_mod(chromosome,pro); 
 
%% Start the evolution process 
 
% The following are performed in each generation 
% Select the parents 
% Perfrom crossover and Mutation operator 
% Perform Selection 
 
for i = 1 : gen 
    % Select the parents 
    % Parents are selected for reproduction to generate offspring. The 
    % original NSGA-II uses a binary tournament selection based on the 
    % crowded-comparision operator. The arguments are  
    % pool - size of the mating pool. It is common to have this to be half the 
    %        population size. 
    % tour - Tournament size. Original NSGA-II uses a binary tournament 
    %        selection, but to see the effect of tournament size this is kept 
    %        arbitary, to be choosen by the user. 
    pool = round(pop/2); 
    tour = 2; 
    parent_chromosome = tournament_selection(chromosome,pool,tour); 
 
    % Perfrom crossover and Mutation operator 
    % The original NSGA-II algorithm uses Simulated Binary Crossover (SBX) and 
    % Polynomial crossover. Crossover probability pc = 0.9 and mutation 
    % probability is pm = 1/n, where n is the number of decision variables. 
    % Both real-coded GA and binary-coded GA are implemented in the original 
    % algorithm, while in this program only the real-coded GA is considered. 
    % The distribution indeices for crossover and mutation operators as mu = 20 
    % and mum = 20 respectively. 
    mu = 20; 
    mum = 20; 
    offspring_chromosome = genetic_operator(parent_chromosome,pro,mu,mum); 
 
    % Intermediate population 
    % Intermediate population is the combined population of parents and 
    % offsprings of the current generation. The population size is almost 1 and 
    % half times the initial population. 
    [main_pop,temp] = size(chromosome); 
    [offspring_pop,temp] = size(offspring_chromosome); 
    intermediate_chromosome(1:main_pop,:) = chromosome; 
    intermediate_chromosome(main_pop + 1 : main_pop + offspring_pop,1 : M+V) = ... 
        offspring_chromosome; 
 
    % Non-domination-sort of intermediate population 
    % The intermediate population is sorted again based on non-domination sort 
    % before the replacement operator is performed on the intermediate 
    % population. 
    intermediate_chromosome = ... 
        non_domination_sort_mod(intermediate_chromosome,pro); 
    % Perform Selection 
    % Once the intermediate population is sorted only the best solution is 
    % selected based on it rank and crowding distance. Each front is filled in 
    % ascending order until the addition of population size is reached. The 
    % last front is included in the population based on the individuals with 
    % least crowding distance 
    chromosome = replace_chromosome(intermediate_chromosome,pro,pop); 
    if ~mod(i,10) 
        fprintf('%d\n',i); 
    end 
end 
 
%% Result 
% Save the result in ASCII text format. 
save solution.txt chromosome -ASCII 
 
%% Visualize 
% The following is used to visualize the result for the given problem. 
switch pro 
    case 1 
        plot(chromosome(:,V + 1),chromosome(:,V + 2),'*'); 
        title('MOP1 using NSGA-II'); 
        xlabel('f(x_1)'); 
        ylabel('f(x_2)'); 
    case 2 
        plot3(chromosome(:,V + 1),chromosome(:,V + 2),chromosome(:,V + 3),'*'); 
        title('MOP2 using NSGA-II'); 
        xlabel('f(x_1)'); 
        ylabel('f(x_2)'); 
        zlabel('f(x_3)'); 
end