NSGA2-Matlab

Fermé
nadet2 Messages postés 2 Date d'inscription dimanche 28 juin 2015 Statut Membre Dernière intervention 5 juillet 2015 - 4 juil. 2015 à 17:12
Bonjour,

Quelqu'un peut m'expliquer cette fonction svp?

function f = rankcon(pop,n_pop,n_obj,nvar,nvar_d,nvar_c);

for (i = 1 : 1 : n_pop)
for (j = 1 : 1 : nvar_c)
x(i,j) = pop.ind(i).xreal(j);
end
for (j = 1 : 1 : nvar_d)
x(i,nvar_c+j) = pop.ind(i).xbin(j);
end
for (j = 1 : 1 : n_obj)
x(i,nvar_c+nvar_d+j) = pop.ind(i).Fitness(j);
end
end

for (i = 1 : 1 : n_pop)
x(i,n_obj+nvar+2) = i;
end

front = 1;
F(front).f = [];
individual = [];
for (i = 1 : 1 : n_pop)
individual(i).n = 0;
individual(i).p = [];
for (j = 1 : 1 : n_pop)
dom_less = 0;
dom_equal = 0;
dom_more = 0;
for (k = 1 : 1 : n_obj)
if (x(i,nvar + k) < x(j,nvar + k))
dom_less = dom_less + 1;
elseif (x(i,nvar + k) == x(j,nvar + k))
dom_equal = dom_equal + 1;
else
dom_more = dom_more + 1;
end
end
if (dom_less == 0) & (dom_equal ~= n_obj)
individual(i).n = individual(i).n+1;
elseif (dom_more == 0) & (dom_equal ~= n_obj)
individual(i).p = [individual(i).p j];
end
end
if individual(i).n == 0
x(i,n_obj+nvar+1) = 1;
F(front).f = [F(front).f i];
end
end

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
x(individual(F(front).f(i)).p(j),n_obj+nvar+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(x(:,n_obj+nvar+1));
for i = 1 : length(index_of_fronts)
sorted_based_on_front(i,:) = x(index_of_fronts(i),:);
end

for (i = 1 : 1 : n_pop)
pop.ind(i).flag = 1;
pop.ind(i).rank = x(i,n_obj+nvar+1);
pop.rankno(i) = x(i,n_obj+nvar+1);
end

maxrank1 = 0;
for (i = 1 : 1 : n_pop)
rnk = pop.ind(i).rank;
if (rnk > maxrank1)
maxrank1 = rnk;
end
end
pop.maxrank = maxrank1;

current_index = 0;
for front = 1 : (length(F) - 1)
objective = [];
distance = 0;
y = [];
previous_index = current_index + 1;
for (i = 1 : 1 : length(F(front).f))
y(i,:) = sorted_based_on_front(current_index + i,:);
end
current_index = current_index + i;

sorted_based_on_objective = [];
for (i = 1 : 1 : n_obj)
[sorted_based_on_objective, index_of_objectives] = sort(y(:,nvar+i));
sorted_based_on_objective = [];
for (j = 1 : 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),nvar+i);
f_min = sorted_based_on_objective(1,nvar+i);
y(index_of_objectives(length(index_of_objectives)),n_obj+nvar+2+i) = Inf;
y(index_of_objectives(1),n_obj+nvar+2+i) = Inf;
for (j = 2 : 1 : length(index_of_objectives)-1)
next_obj = sorted_based_on_objective(j+1,nvar+i);
previous_obj = sorted_based_on_objective(j-1,nvar+i);
if (f_max - f_min == 0)
y(index_of_objectives(j),n_obj+nvar+2+i) = Inf;
else
y(index_of_objectives(j),n_obj+nvar+2+i) = (next_obj - previous_obj)/(f_max - f_min);
end
end
end
distance = [];
distance(:,1) = zeros(length(F(front).f),1);
for (i = 1 : n_obj)
distance(:,1) = distance(:,1)+y(:,n_obj+nvar+2+i);
end
y(:,n_obj+nvar+3) = distance;
y = y(:,1 : n_obj+nvar+3);
z(previous_index:current_index,:) = y;
end

for (i = 1 : 1 : n_pop)
for(j = 1 : 1 : n_pop)
if (z(j,nvar+n_obj+2) == i)
pop.ind(i).cub_len = z(j,nvar+n_obj+3);
end
end
end

f = pop;