How to solve the problem ?

조회 수: 1 (최근 30일)
Akash Pal
Akash Pal 2022년 5월 12일
댓글: Jan 2022년 5월 13일
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
Akash Pal
Akash Pal 2022년 5월 13일
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 .
Jan
Jan 2022년 5월 13일
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 .

댓글을 달려면 로그인하십시오.

답변 (1개)

Image Analyst
Image Analyst 2022년 5월 12일
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
Akash Pal
Akash Pal 2022년 5월 13일
편집: Akash Pal 2022년 5월 13일
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 ?
Image Analyst
Image Analyst 2022년 5월 13일
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.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by