How to solve the problem ?

function [F,front,Q, individual,index_of_objectives, f,temp,index_of_fronts,sorted_based_on_front,sorted_based_on_objective,y,next_obj, f_max, f_min,previous_obj, distance,z] = non_domination_sort_mod(comb10a, M, V)
[N, m2] = size(comb10a);
clear m2
% Initialize the front number to 1.
front = 1;
F(front).f = [];
individual = [];
for i = 1 : N
% Number of individuals that dominate this individual
individual(i).n = 0;
% Individuals which this individual dominate
individual(i).p = [];
for j = 1 : N
dom_less = 0;
dom_equal = 0;
dom_more = 0;
for k = 1 : M
if (comb10a(i,V + k) < comb10a(j,V + k))
dom_less = dom_less + 1;
elseif (comb10a(i,V + k) == comb10a(j,V + k))
dom_equal = dom_equal + 1;
else
dom_more = dom_more + 1;
end
end
if dom_less == 0 && dom_equal ~= M
individual(i).n = individual(i).n + 1;
elseif dom_more == 0 && dom_equal ~= M
individual(i).p = [individual(i).p j];
end
end
if individual(i).n == 0
comb10a(i,M + V + 1) = 1;
F(front).f = [F(front).f i];
end
end
% Find the subsequent fronts
while ~isempty(F(front).f)
Q = [];
for i = 1 : length(F(front).f)
if ~isempty(individual(F(front).f(i)).p)
for j = 1 : length(individual(F(front).f(i)).p)
individual(individual(F(front).f(i)).p(j)).n = ...
individual(individual(F(front).f(i)).p(j)).n - 1;
if individual(individual(F(front).f(i)).p(j)).n == 0
comb10a(individual(F(front).f(i)).p(j),M + V + 1) = ...
front + 1;
Q = [Q individual(F(front).f(i)).p(j)];
end
end
end
end
front = front + 1;
F(front).f = Q;
end
[temp,index_of_fronts] = sort(comb10a(:,M + V + 1));
for i = 1 : length(index_of_fronts)
sorted_based_on_front(i,:) = comb10a(index_of_fronts(i),:);
end
current_index = 0;
for front = 1 : (length(F) - 1)
% objective = [];
distance = 0;
y = [];
previous_index = current_index + 1;
for i = 1 : length(F(front).f)
y(i,:) = sorted_based_on_front(current_index + i,:);
end
current_index = current_index + i;
% Sort each individual based on the objective
sorted_based_on_objective = [];
for i = 1 : M
[sorted_based_on_objective, index_of_objectives] = ...
sort(y(:,V + i));
sorted_based_on_objective = [];
for j = 1 : length(index_of_objectives)
sorted_based_on_objective(j,:) = y(index_of_objectives(j),:);
end
f_max = ...
sorted_based_on_objective(length(index_of_objectives), V + i);
f_min = sorted_based_on_objective(1, V + i);
y(index_of_objectives(length(index_of_objectives)),M + V + 1 + i)...
= Inf;
y(index_of_objectives(1),M + V + 1 + i) = Inf;
for j = 2 : length(index_of_objectives) - 1
next_obj = sorted_based_on_objective(j + 1,V + i);
previous_obj = sorted_based_on_objective(j - 1,V + i);
if (f_max - f_min == 0)
y(index_of_objectives(j),M + V + 1 + i) = Inf;
else
y(index_of_objectives(j),M + V + 1 + i) = ...
(next_obj - previous_obj)/(f_max - f_min);
end
end
end
distance = [];
distance(:,1) = zeros(length(F(front).f),1);
for i = 1 : M
distance(:,1) = distance(:,1) + y(:,M + V + 1 + i);
end
y(:,M + V + 2) = distance;
y = y(:,1 : M + V + 2);
z(previous_index:current_index,:) = y;
end
f = z();
end
i am following this coding to find out the non dominated sorting and the crowding distance of my matrix comb10a ,where M is th objective function and V is the decision variables .But every time in the line of
[temp,index_of_fronts] = sort(comb10a(:,M + V + 1));
this i am getting one error
Index in position 2 exceeds array bounds (must not exceed 12).
Error in non_domination_sort_mod1wed (line 58)
[temp,index_of_fronts] = sort(comb10a(:,M + V + 1));
Error in mainnsga2 (line 34)
[F,front,Q, individual,temp,index_of_fronts,sorted_based_on_front,f] = non_domination_sort_mod1wed(comb10a, M, V)

3 Comments

You can simplify the code:
[N, m2] = size(comb10a);
clear m2
% Smarter:
N = size(comb10a, 1);
And:
[temp,index_of_fronts] = sort(comb10a(:,M + V + 1));
for i = 1 : length(index_of_fronts)
sorted_based_on_front(i,:) = comb10a(index_of_fronts(i),:);
end
% Smarter:
[~, index_of_fronts] = sort(comb10a(:, M + V + 1));
sorted_based_on_front = comb10a(index_of_fronts,:);
And:
distance = [];
distance(:,1) = zeros(length(F(front).f),1);
for i = 1 : M
distance(:,1) = distance(:,1) + y(:,M + V + 1 + i);
end
% Smarter:
distance = sum(y(:, M + V + 1 + (1:M)), 2);
Yes i can simplify it ,but still i have the same error .I dont understand why its happening when i am running this function in a loop .
If the code is simplified, it is much easier to debug. Obviously the code produces an error, because the loop let it use an index outside the existing range. There is no magic workaround but you have to check the indices to find out, why M + V + 1 > columns .

Sign in to comment.

Answers (1)

Put these lines in
[rows, columns] = size(comb10a)
if M + V + 1 > columns
errorMessage = sprintf('Hey! The matrix comb10a has only %d columns but you are trying to sort column #%d!, which does NOT exist!', columns, M + V + 1)
uiwait(errordlg(errorMessage));
return;
else
[temp,index_of_fronts] = sort(comb10a(:, M + V + 1);
end
Now what do you see?

2 Comments

Akash Pal
Akash Pal on 13 May 2022
Edited: Akash Pal on 13 May 2022
I got this error ,actually by the code ,we try to assign the nondominated rank in a new column and i guess based on that rank or the column number , it is sorting first and then finding the crowding distance of each fronts .
when i am doing the steps manually step by step that time its working properly but when i am giving it in a loop its showing me this result .
so what to do next ?
I'd go over the debugging training in this link
so you can learn how to step through your code and figure out how/why you're trying to sort on column 13 when there are only 12 columns in the matrix.

Sign in to comment.

Asked:

on 12 May 2022

Commented:

Jan
on 13 May 2022

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!