├── README.md ├── NSGA-II ├── main.m ├── Crossover.m ├── MOP2.m ├── Dominates.m ├── MOP4.m ├── PlotCosts.m ├── Mutate.m ├── SortPopulation.m ├── CalcCrowdingDistance.m ├── NonDominatedSorting.m └── nsga2.m └── LICENSE /README.md: -------------------------------------------------------------------------------- 1 | # NSGA-II in MATLAB 2 | 3 |

4 | NSGA-II in MATLAB 5 |

6 | 7 | This is an implementation of Non-dominated Sorting Genetic Algorithm II (NSGA-II) in MATLAB. 8 | 9 | For more information, visit following URL: 10 | https://yarpiz.com/56/ypea120-nsga2 11 | 12 | ## Citing This Work 13 | You can cite this code as follows: 14 | 15 | **Mostapha Kalami Heris, NSGA-II in MATLAB (URL: https://yarpiz.com/56/ypea120-nsga2), Yarpiz, 2015.** 16 | -------------------------------------------------------------------------------- /NSGA-II/main.m: -------------------------------------------------------------------------------- 1 | % 2 | % Copyright (c) 2015, Mostapha Kalami Heris & Yarpiz (www.yarpiz.com) 3 | % All rights reserved. Please read the "LICENSE" file for license terms. 4 | % 5 | % Project Code: YPEA120 6 | % Project Title: Non-dominated Sorting Genetic Algorithm II (NSGA-II) 7 | % Publisher: Yarpiz (www.yarpiz.com) 8 | % 9 | % Developer: Mostapha Kalami Heris (Member of Yarpiz Team) 10 | % 11 | % Cite as: 12 | % Mostapha Kalami Heris, NSGA-II in MATLAB (URL: https://yarpiz.com/56/ypea120-nsga2), Yarpiz, 2015. 13 | % 14 | % Contact Info: sm.kalami@gmail.com, info@yarpiz.com 15 | % 16 | 17 | nsga2; 18 | -------------------------------------------------------------------------------- /NSGA-II/Crossover.m: -------------------------------------------------------------------------------- 1 | % 2 | % Copyright (c) 2015, Mostapha Kalami Heris & Yarpiz (www.yarpiz.com) 3 | % All rights reserved. Please read the "LICENSE" file for license terms. 4 | % 5 | % Project Code: YPEA120 6 | % Project Title: Non-dominated Sorting Genetic Algorithm II (NSGA-II) 7 | % Publisher: Yarpiz (www.yarpiz.com) 8 | % 9 | % Developer: Mostapha Kalami Heris (Member of Yarpiz Team) 10 | % 11 | % Cite as: 12 | % Mostapha Kalami Heris, NSGA-II in MATLAB (URL: https://yarpiz.com/56/ypea120-nsga2), Yarpiz, 2015. 13 | % 14 | % Contact Info: sm.kalami@gmail.com, info@yarpiz.com 15 | % 16 | 17 | function [y1, y2] = Crossover(x1, x2) 18 | 19 | alpha = rand(size(x1)); 20 | 21 | y1 = alpha.*x1+(1-alpha).*x2; 22 | y2 = alpha.*x2+(1-alpha).*x1; 23 | 24 | end -------------------------------------------------------------------------------- /NSGA-II/MOP2.m: -------------------------------------------------------------------------------- 1 | % 2 | % Copyright (c) 2015, Mostapha Kalami Heris & Yarpiz (www.yarpiz.com) 3 | % All rights reserved. Please read the "LICENSE" file for license terms. 4 | % 5 | % Project Code: YPEA120 6 | % Project Title: Non-dominated Sorting Genetic Algorithm II (NSGA-II) 7 | % Publisher: Yarpiz (www.yarpiz.com) 8 | % 9 | % Developer: Mostapha Kalami Heris (Member of Yarpiz Team) 10 | % 11 | % Cite as: 12 | % Mostapha Kalami Heris, NSGA-II in MATLAB (URL: https://yarpiz.com/56/ypea120-nsga2), Yarpiz, 2015. 13 | % 14 | % Contact Info: sm.kalami@gmail.com, info@yarpiz.com 15 | % 16 | 17 | function z = MOP2(x) 18 | 19 | n = numel(x); 20 | 21 | z1 = 1-exp(-sum((x-1/sqrt(n)).^2)); 22 | 23 | z2 = 1-exp(-sum((x+1/sqrt(n)).^2)); 24 | 25 | z = [z1 z2]'; 26 | 27 | end -------------------------------------------------------------------------------- /NSGA-II/Dominates.m: -------------------------------------------------------------------------------- 1 | % 2 | % Copyright (c) 2015, Mostapha Kalami Heris & Yarpiz (www.yarpiz.com) 3 | % All rights reserved. Please read the "LICENSE" file for license terms. 4 | % 5 | % Project Code: YPEA120 6 | % Project Title: Non-dominated Sorting Genetic Algorithm II (NSGA-II) 7 | % Publisher: Yarpiz (www.yarpiz.com) 8 | % 9 | % Developer: Mostapha Kalami Heris (Member of Yarpiz Team) 10 | % 11 | % Cite as: 12 | % Mostapha Kalami Heris, NSGA-II in MATLAB (URL: https://yarpiz.com/56/ypea120-nsga2), Yarpiz, 2015. 13 | % 14 | % Contact Info: sm.kalami@gmail.com, info@yarpiz.com 15 | % 16 | 17 | function b = Dominates(x, y) 18 | 19 | if isstruct(x) 20 | x = x.Cost; 21 | end 22 | 23 | if isstruct(y) 24 | y = y.Cost; 25 | end 26 | 27 | b = all(x <= y) && any(x1 25 | sigma = sigma(j); 26 | end 27 | 28 | y = x; 29 | 30 | y(j) = x(j)+sigma.*randn(size(j)); 31 | 32 | end -------------------------------------------------------------------------------- /NSGA-II/SortPopulation.m: -------------------------------------------------------------------------------- 1 | % 2 | % Copyright (c) 2015, Mostapha Kalami Heris & Yarpiz (www.yarpiz.com) 3 | % All rights reserved. Please read the "LICENSE" file for license terms. 4 | % 5 | % Project Code: YPEA120 6 | % Project Title: Non-dominated Sorting Genetic Algorithm II (NSGA-II) 7 | % Publisher: Yarpiz (www.yarpiz.com) 8 | % 9 | % Developer: Mostapha Kalami Heris (Member of Yarpiz Team) 10 | % 11 | % Cite as: 12 | % Mostapha Kalami Heris, NSGA-II in MATLAB (URL: https://yarpiz.com/56/ypea120-nsga2), Yarpiz, 2015. 13 | % 14 | % Contact Info: sm.kalami@gmail.com, info@yarpiz.com 15 | % 16 | 17 | function [pop, F] = SortPopulation(pop) 18 | 19 | % Sort Based on Crowding Distance 20 | [~, CDSO] = sort([pop.CrowdingDistance], 'descend'); 21 | pop = pop(CDSO); 22 | 23 | % Sort Based on Rank 24 | [~, RSO] = sort([pop.Rank]); 25 | pop = pop(RSO); 26 | 27 | % Update Fronts 28 | Ranks = [pop.Rank]; 29 | MaxRank = max(Ranks); 30 | F = cell(MaxRank, 1); 31 | for r = 1:MaxRank 32 | F{r} = find(Ranks == r); 33 | end 34 | 35 | end -------------------------------------------------------------------------------- /NSGA-II/CalcCrowdingDistance.m: -------------------------------------------------------------------------------- 1 | % 2 | % Copyright (c) 2015, Mostapha Kalami Heris & Yarpiz (www.yarpiz.com) 3 | % All rights reserved. Please read the "LICENSE" file for license terms. 4 | % 5 | % Project Code: YPEA120 6 | % Project Title: Non-dominated Sorting Genetic Algorithm II (NSGA-II) 7 | % Publisher: Yarpiz (www.yarpiz.com) 8 | % 9 | % Developer: Mostapha Kalami Heris (Member of Yarpiz Team) 10 | % 11 | % Cite as: 12 | % Mostapha Kalami Heris, NSGA-II in MATLAB (URL: https://yarpiz.com/56/ypea120-nsga2), Yarpiz, 2015. 13 | % 14 | % Contact Info: sm.kalami@gmail.com, info@yarpiz.com 15 | % 16 | 17 | function pop = CalcCrowdingDistance(pop, F) 18 | 19 | nF = numel(F); 20 | 21 | for k = 1:nF 22 | 23 | Costs = [pop(F{k}).Cost]; 24 | 25 | nObj = size(Costs, 1); 26 | 27 | n = numel(F{k}); 28 | 29 | d = zeros(n, nObj); 30 | 31 | for j = 1:nObj 32 | 33 | [cj, so] = sort(Costs(j, :)); 34 | 35 | d(so(1), j) = inf; 36 | 37 | for i = 2:n-1 38 | 39 | d(so(i), j) = abs(cj(i+1)-cj(i-1))/abs(cj(1)-cj(end)); 40 | 41 | end 42 | 43 | d(so(end), j) = inf; 44 | 45 | end 46 | 47 | 48 | for i = 1:n 49 | 50 | pop(F{k}(i)).CrowdingDistance = sum(d(i, :)); 51 | 52 | end 53 | 54 | end 55 | 56 | 57 | end 58 | 59 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015, Mostapha Kalami Heris & Yarpiz (www.yarpiz.com) 2 | All rights reserved. 3 | 4 | Cite as: 5 | Mostapha Kalami Heris, NSGA-II in MATLAB (URL: https://yarpiz.com/56/ypea120-nsga2), Yarpiz, 2015. 6 | 7 | Redistribution and use in source and binary forms, with or without 8 | modification, are permitted provided that the following conditions are 9 | met: 10 | 11 | * Redistributions of source code must retain the above copyright 12 | notice, this list of conditions and the following disclaimer. 13 | 14 | * Redistributions in binary form must reproduce the above copyright 15 | notice, this list of conditions and the following disclaimer in 16 | the documentation and/or other materials provided with the distribution 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 22 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 | POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /NSGA-II/NonDominatedSorting.m: -------------------------------------------------------------------------------- 1 | % 2 | % Copyright (c) 2015, Mostapha Kalami Heris & Yarpiz (www.yarpiz.com) 3 | % All rights reserved. Please read the "LICENSE" file for license terms. 4 | % 5 | % Project Code: YPEA120 6 | % Project Title: Non-dominated Sorting Genetic Algorithm II (NSGA-II) 7 | % Publisher: Yarpiz (www.yarpiz.com) 8 | % 9 | % Developer: Mostapha Kalami Heris (Member of Yarpiz Team) 10 | % 11 | % Cite as: 12 | % Mostapha Kalami Heris, NSGA-II in MATLAB (URL: https://yarpiz.com/56/ypea120-nsga2), Yarpiz, 2015. 13 | % 14 | % Contact Info: sm.kalami@gmail.com, info@yarpiz.com 15 | % 16 | 17 | function [pop, F] = NonDominatedSorting(pop) 18 | 19 | nPop = numel(pop); 20 | 21 | for i = 1:nPop 22 | pop(i).DominationSet = []; 23 | pop(i).DominatedCount = 0; 24 | end 25 | 26 | F{1} = []; 27 | 28 | for i = 1:nPop 29 | for j = i+1:nPop 30 | p = pop(i); 31 | q = pop(j); 32 | 33 | if Dominates(p, q) 34 | p.DominationSet = [p.DominationSet j]; 35 | q.DominatedCount = q.DominatedCount+1; 36 | end 37 | 38 | if Dominates(q.Cost, p.Cost) 39 | q.DominationSet = [q.DominationSet i]; 40 | p.DominatedCount = p.DominatedCount+1; 41 | end 42 | 43 | pop(i) = p; 44 | pop(j) = q; 45 | end 46 | 47 | if pop(i).DominatedCount == 0 48 | F{1} = [F{1} i]; 49 | pop(i).Rank = 1; 50 | end 51 | end 52 | 53 | k = 1; 54 | 55 | while true 56 | 57 | Q = []; 58 | 59 | for i = F{k} 60 | p = pop(i); 61 | 62 | for j = p.DominationSet 63 | q = pop(j); 64 | 65 | q.DominatedCount = q.DominatedCount-1; 66 | 67 | if q.DominatedCount == 0 68 | Q = [Q j]; %#ok 69 | q.Rank = k+1; 70 | end 71 | 72 | pop(j) = q; 73 | end 74 | end 75 | 76 | if isempty(Q) 77 | break; 78 | end 79 | 80 | F{k+1} = Q; %#ok 81 | 82 | k = k+1; 83 | 84 | end 85 | 86 | 87 | end -------------------------------------------------------------------------------- /NSGA-II/nsga2.m: -------------------------------------------------------------------------------- 1 | % 2 | % Copyright (c) 2015, Mostapha Kalami Heris & Yarpiz (www.yarpiz.com) 3 | % All rights reserved. Please read the "LICENSE" file for license terms. 4 | % 5 | % Project Code: YPEA120 6 | % Project Title: Non-dominated Sorting Genetic Algorithm II (NSGA-II) 7 | % Publisher: Yarpiz (www.yarpiz.com) 8 | % 9 | % Developer: Mostapha Kalami Heris (Member of Yarpiz Team) 10 | % 11 | % Cite as: 12 | % Mostapha Kalami Heris, NSGA-II in MATLAB (URL: https://yarpiz.com/56/ypea120-nsga2), Yarpiz, 2015. 13 | % 14 | % Contact Info: sm.kalami@gmail.com, info@yarpiz.com 15 | % 16 | 17 | clc; 18 | clear; 19 | close all; 20 | 21 | %% Problem Definition 22 | 23 | CostFunction = @(x) MOP4(x); % Cost Function 24 | 25 | nVar = 3; % Number of Decision Variables 26 | 27 | VarSize = [1 nVar]; % Size of Decision Variables Matrix 28 | 29 | VarMin = -5; % Lower Bound of Variables 30 | VarMax = 5; % Upper Bound of Variables 31 | 32 | % Number of Objective Functions 33 | nObj = numel(CostFunction(unifrnd(VarMin, VarMax, VarSize))); 34 | 35 | 36 | %% NSGA-II Parameters 37 | 38 | MaxIt = 100; % Maximum Number of Iterations 39 | 40 | nPop = 50; % Population Size 41 | 42 | pCrossover = 0.7; % Crossover Percentage 43 | nCrossover = 2*round(pCrossover*nPop/2); % Number of Parnets (Offsprings) 44 | 45 | pMutation = 0.4; % Mutation Percentage 46 | nMutation = round(pMutation*nPop); % Number of Mutants 47 | 48 | mu = 0.02; % Mutation Rate 49 | 50 | sigma = 0.1*(VarMax-VarMin); % Mutation Step Size 51 | 52 | 53 | %% Initialization 54 | 55 | empty_individual.Position = []; 56 | empty_individual.Cost = []; 57 | empty_individual.Rank = []; 58 | empty_individual.DominationSet = []; 59 | empty_individual.DominatedCount = []; 60 | empty_individual.CrowdingDistance = []; 61 | 62 | pop = repmat(empty_individual, nPop, 1); 63 | 64 | for i = 1:nPop 65 | 66 | pop(i).Position = unifrnd(VarMin, VarMax, VarSize); 67 | 68 | pop(i).Cost = CostFunction(pop(i).Position); 69 | 70 | end 71 | 72 | % Non-Dominated Sorting 73 | [pop, F] = NonDominatedSorting(pop); 74 | 75 | % Calculate Crowding Distance 76 | pop = CalcCrowdingDistance(pop, F); 77 | 78 | % Sort Population 79 | [pop, F] = SortPopulation(pop); 80 | 81 | 82 | %% NSGA-II Main Loop 83 | 84 | for it = 1:MaxIt 85 | 86 | % Crossover 87 | popc = repmat(empty_individual, nCrossover/2, 2); 88 | for k = 1:nCrossover/2 89 | 90 | i1 = randi([1 nPop]); 91 | p1 = pop(i1); 92 | 93 | i2 = randi([1 nPop]); 94 | p2 = pop(i2); 95 | 96 | [popc(k, 1).Position, popc(k, 2).Position] = Crossover(p1.Position, p2.Position); 97 | 98 | popc(k, 1).Cost = CostFunction(popc(k, 1).Position); 99 | popc(k, 2).Cost = CostFunction(popc(k, 2).Position); 100 | 101 | end 102 | popc = popc(:); 103 | 104 | % Mutation 105 | popm = repmat(empty_individual, nMutation, 1); 106 | for k = 1:nMutation 107 | 108 | i = randi([1 nPop]); 109 | p = pop(i); 110 | 111 | popm(k).Position = Mutate(p.Position, mu, sigma); 112 | 113 | popm(k).Cost = CostFunction(popm(k).Position); 114 | 115 | end 116 | 117 | % Merge 118 | pop = [pop 119 | popc 120 | popm]; %#ok 121 | 122 | % Non-Dominated Sorting 123 | [pop, F] = NonDominatedSorting(pop); 124 | 125 | % Calculate Crowding Distance 126 | pop = CalcCrowdingDistance(pop, F); 127 | 128 | % Sort Population 129 | pop = SortPopulation(pop); 130 | 131 | % Truncate 132 | pop = pop(1:nPop); 133 | 134 | % Non-Dominated Sorting 135 | [pop, F] = NonDominatedSorting(pop); 136 | 137 | % Calculate Crowding Distance 138 | pop = CalcCrowdingDistance(pop, F); 139 | 140 | % Sort Population 141 | [pop, F] = SortPopulation(pop); 142 | 143 | % Store F1 144 | F1 = pop(F{1}); 145 | 146 | % Show Iteration Information 147 | disp(['Iteration ' num2str(it) ': Number of F1 Members = ' num2str(numel(F1))]); 148 | 149 | % Plot F1 Costs 150 | figure(1); 151 | PlotCosts(F1); 152 | pause(0.01); 153 | 154 | end 155 | 156 | %% Results 157 | 158 | --------------------------------------------------------------------------------