function nsga_2(pop,gen)
is a multi-objective optimization function where the input arguments are pop - Population size gen - Total number of generations
This functions is based on evolutionary algorithm for finding the optimal solution for multiple objective i.e. pareto front
for the objectives. Initially enter only the population size and the stoping criteria or the total number of generations after
which the algorithm will automatically stopped.
You will be asked to enter the number of objective functions, the number of decision variables and the range space for the
decision variables. Also you will have to define your own objective funciton by editing the evaluate_objective() function.
A sample objective function is described in evaluate_objective.m. Kindly make sure that the objective function which you define
match the number of objectives that you have entered as well as the number of decision variables that you have entered. The
decision variable space is continuous for this function, but the objective space may or may not be continuous.
Original algorithm NSGA-II was developed by researchers in Kanpur Genetic Algorithm Labarotary and kindly visit their website
for more information http://www.iitk.ac.in/kangal/
Contents
Simple error checking
Number of Arguments Check for the number of arguments. The two input arguments are necessary to run this function.
if nargin < 2
error('NSGA-II: Please enter the population size and number of generations as input arguments.');
end
if isnumeric(pop) == 0 || isnumeric(gen) == 0
error('Both input arguments pop and gen should be integer datatype');
end
if pop < 20
error('Minimum population for running this function is 20');
end
if gen < 5
error('Minimum number of generations is 5');
end
pop = round(pop);
gen = round(gen);
Objective Function
The objective function description contains information about the objective function. M is the dimension of the objective
space, V is the dimension of decision variable space, min_range and max_range are the range for the variables in the decision
variable space. User has to define the objective functions using the decision variables. Make sure to edit the function 'evaluate_objective'
to suit your needs.
[M, V, min_range, max_range] = objective_description_function();
Initialize the population
Population is initialized with random values which are within the specified range. Each chromosome consists of the decision
variables. Also the value of the objective functions, rank and crowding distance information is also added to the chromosome
vector but only the elements of the vector which has the decision variables are operated upon to perform the genetic operations
like corssover and mutation.
chromosome = initialize_variables(pop, M, V, min_range, max_range);
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. At this stage the rank and the crowding distance for each
chromosome is added to the chromosome vector for easy of computation.
chromosome = non_domination_sort_mod(chromosome, M, V);
Start the evolution process
The following are performed in each generation * Select the parents which are fit for reproduction * Perfrom crossover and
Mutation operator on the selected parents * Perform Selection from the parents and the offsprings * Replace the unfit individuals
with the fit individuals to maintain a constant population size.
for i = 1 : gen
pool = round(pop/2);
tour = 2;
parent_chromosome = tournament_selection(chromosome, pool, tour);
mu = 20;
mum = 20;
offspring_chromosome = ...
genetic_operator(parent_chromosome, ...
M, V, mu, mum, min_range, max_range);
[main_pop,temp] = size(chromosome);
[offspring_pop,temp] = size(offspring_chromosome);
clear temp
intermediate_chromosome(1:main_pop,:) = chromosome;
intermediate_chromosome(main_pop + 1 : main_pop + offspring_pop,1 : M+V) = ...
offspring_chromosome;
intermediate_chromosome = ...
non_domination_sort_mod(intermediate_chromosome, M, V);
chromosome = replace_chromosome(intermediate_chromosome, M, V, pop);
if ~mod(i,100)
clc
fprintf('%d generations completed\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 if objective space dimension is visualizable.
if M == 2
plot(chromosome(:,V + 1),chromosome(:,V + 2),'*');
elseif M ==3
plot3(chromosome(:,V + 1),chromosome(:,V + 2),chromosome(:,V + 3),'*');
end