% function nsga_2(pro)%% 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.%inp_para_definition=input_parameters_definition;%% Initialize the variables% Declare the variables and initialize their values% pop - population% gen - generations% pro - problem number%clear;clc;tic;pop = 100; % 每一代的种群数gen = 100; % 总共的代数pro = 2; % 问题选择1或者2,见switchswitch procase 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 2M = 3;V = 12;case 3 % case 1和case 2 用来对整个算法进行常规验证,作为调试之用;case 3 为本工程所需;M = 2; %(output parameters 个数)V = 8; %(input parameters 个数)K = 10;end% Initialize the populationchromosome = 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. 真是牛X了。
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 Selectionfor 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;% 针对对象是上一步产生的新的个体parent_chromosome%对parent_chromosome 每次操作以较大的概率进行交叉(产生两个新的候选人),或者较小的概率变异(一个新的候选人)操作,这样%就会产生较多的新个体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_chromosom e;%intermediate_chromosome=inter_chromo(chromosome,offspring_chromosome,pro);% 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 distancechromosome = replace_chromosome(intermediate_chromosome,pro,pop);if ~mod(i,10)fprintf('%d\n',i);endend%% 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 procase 1plot(chromosome(:,V + 1),chromosome(:,V + 2),'y+');title('MOP1 using NSGA-II');xlabel('f(x_1)');ylabel('f(x_2)');case 2plot3(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%disp('run time is:')%toc; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%function f = initialize_variables(N,problem)% function f = initialize_variables(N,problem)% N - Population size% problem - takes integer values 1 and 2 where,% '1' for MOP1% '2' for MOP2%% This function initializes the population with N individuals and each% individual having M decision variables based on the selected problem.% M = 6 for problem MOP1 and M = 12 for problem MOP2. The objective space% for MOP1 is 2 dimensional while for MOP2 is 3 dimensional.% Both the MOP's has 0 to 1 as its range for all the decision variables.min = 0;max = 1;switch problemcase 1M = 6;K = 8; % k=决策变量(M=6)+目标变量(K-M=2)=8case 2M = 12;K = 15;case 3 % case 1和case 2 用来对整个算法进行常规验证,作为调试之用;case 3 为本工程所需;M = 8; %(input parameters 个数)K = 10;endfor i = 1 : N% Initialize the decision variablesfor j = 1 : Mf(i,j) = rand(1); % i.e f(i,j) = min + (max - min)*rand(1);end% Evaluate the objective functionf(i,M + 1: K) = evaluate_objective(f(i,:),problem);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%function f = evaluate_objective(x,problem)% Function to evaluate the objective functions for the given input vector% x. x has the decision variablesswitch problemcase 1f = [];%% Objective function onef(1) = 1 - exp(-4*x(1))*(sin(6*pi*x(1)))^6;sum = 0;for i = 2 : 6sum = sum + x(i)/4;end%% Intermediate functiong_x = 1 + 9*(sum)^(0.25);%% Objective function onef(2) = g_x*(1 - ((f(1))/(g_x))^2);case 2f = [];%% Intermediate functiong_x = 0;for i = 3 : 12g_x = g_x + (x(i) - 0.5)^2;end%% Objective function onef(1) = (1 + g_x)*cos(0.5*pi*x(1))*cos(0.5*pi*x(2));%% Objective function twof(2) = (1 + g_x)*cos(0.5*pi*x(1))*sin(0.5*pi*x(2));%% Objective function threef(3) = (1 + g_x)*sin(0.5*pi*x(1));case 3f = [];%% Objective function onef(1) = 0;%% Objective function onef(2) = 0;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%% Non-Donimation Sort %按照目标函数最小了好% This function sort the current popultion based on non-domination. All the% individuals in the first front are given a rank of 1, the second front% individuals are assigned rank 2 and so on. After assigning the rank the% crowding in each front is calculated.function f = non_domination_sort_mod(x,problem)[N,M] = size(x);switch problemcase 1M = 2;V = 6;case 2M = 3;V = 12;case 3 % case 1和case 2 用来对整个算法进行常规验证,作为调试之用;case 3 为本工程所需;M = 2; %(output parameters 个数)V = 8; %(input parameters 个数)K = 10;endfront = 1;% There is nothing to this assignment, used only to manipulate easily in% MATLAB.F(front).f = [];individual = [];for i = 1 : N% Number of individuals that dominate this individual 支配i的解的个数individual(i).n = 0;% Individuals which this individual dominate 被i支配的解individual(i).p = [];for j = 1 : Ndom_less = 0;dom_equal = 0;dom_more = 0;for k = 1 : Mif (x(i,V + k) < x(j,V + k))dom_less = dom_less + 1;elseif (x(i,V + k) == x(j,V + k))dom_equal = dom_equal + 1;elsedom_more = dom_more + 1;endend% 这里只要考虑到求取得是函数的最小值就可以了,此时支配的概念就会变为谁的函数值小,谁去支配别的解%——————————————————————if dom_less == 0 & dom_equal ~= M % 举个例子,其中i=a,b; j= c,d; 如果i 中的a,b全部大于individual(i).n = individual(i).n + 1; % 或者部分大于j中的c,d(但没有小于的情况),则称为i优于j,elseif dom_more == 0 & dom_equal ~= M % 当i优于j的时候,则此时把individual(i)_n加1individual(i).p = [individual(i).p j]; %如果i中的a,b全部小于或者部分小于j中的c,d(但没有大于的情况),则end %则称为j优于i, 则把此时的j放入individual(i)_P中;end %总之,就是说两个目标变量必须全部大于或者全部小于才能对individual有效。