├── 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 |
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 |
--------------------------------------------------------------------------------