MATLAB大神们,本人菜鸟一枚,近期在做一个课题,利用多目标遗传算法求解系统设备调度问题,主程序使用的是算法包,但计算过程中,在非支配排序环节出现了错误,我没有动过这部分的程序,不知道为什么会出错?下面附上错误以及代码,求各位大神指点迷津,十分感谢!!!


function f = non_domination_sort_mod(x, M, V)
% x 每个个体
% M 目标空间的维数
% V 决策变量空间的维数
% 使用非支配排序对种群进行排序。 这将返回两个列,每个人是排名和拥挤距离对应于他们
% 在前面他们所属的位置。 在这个阶段,每个染色体的等级和拥挤距离被添加到染色体向量
% 以便于计算。
%M是目标空间的维数,V是决策变量空间的维数,chromosome染色体向量
%%
[N, m] = size(x); %N为规模,即个体数目
clear m
front = 1; %初始化前沿为1

%此步骤没有重大意义,只是为了简单计算
F(front).f = []; %包含被个体支配的集合
individual = []; %个体集合

%% 非支配排序
%在NSGA进行非支配排序时,规模为N的种群中的每个个体都要针对M个目标函数
%和种群中的N-1个个体进行比较,复杂度为O(MN)
for i = 1 : N
%支配这个个体的个体数量
individual(i).n = 0; %支配p个体的个体数量
individual(i).p = []; % 被p支配的个体
for j = 1 : N
dom_less = 0;
dom_equal = 0;
dom_more = 0;
for k = 1 : M
%判断支配关系
if (x(i,V + k) < x(j,V + k)) %i支配j
dom_less = dom_less + 1;
elseif (x(i,V + k) == x(j,V + k)) %弱支配
dom_equal = dom_equal + 1;
else %j支配i
dom_more = dom_more + 1;
end
end
if dom_less == 0 && dom_equal ~= M %j 支配了i,则把np+1
individual(i).n = individual(i).n + 1;
elseif dom_more == 0 && dom_equal ~= M %i支配了j,将j添加到Sp列表中
individual(i).p = [individual(i).p j];
end
end
if individual(i).n == 0 %如果该个体的np为0,即i不存在被支配的,那么它划分的等级为1
x(i,M + V + 1) = 1; %排序放在了列中
F(front).f = [F(front).f i]; %F是个结构体,包含多个矩阵f。比如front=4,那么F(front).f 表示结构体中第四个矩阵。f 的值可以自己设定。相互间不冲突。
end
end

% Find the subsequent fronts 发现后续的front集合
%这里是精妙开始之处,检测front的支配集的非支配解,当每检测到一次,减少一,
% 最先减为0,也就是除了小于等于front的可以支配它,
% 剩下的就是它支配了,也就是当前下一个front集合里的
while ~isempty(F(front).f) %判断一个数组是否是空的(没有任何元素)
% if= isempty(A)
% 如果A是一个空数组,返回逻辑1(true);其他,则返回0(false)。
Q = []; %Q存放下一个front集合的
for i = 1 : length(F(front).f) %对所有在Sp集合中的个体进行排序
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),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(x(:,M + V + 1));%错误之处
for i = 1 : length(index_of_fronts)
sorted_based_on_front(i,:) = x(index_of_fronts(i)?; %将染色体从小到大存储到sorted_based_on_front中
end
current_index = 0;

%% 拥挤度距离
% 找到每个个体到前沿的拥挤度距离
for front = 1 : (length(F) - 1) %每个前沿个体数目fi每一级的集合
% objective = [];
distance = 0; %初始化距离
y = []; %染色体集合
previous_index = current_index + 1; %以前的级数=当前级数+1

for i = 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 : M 
    [sorted_based_on_objective, index_of_objectives] =sort(y(:,V + i));    %决策变量V
    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)    %排除分母为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);    %+1是非支配排序+2是拥挤度距离
z(previous_index:current_index,:) = y;

end
f = z();

以上算法包为网上下载,若有不妥,请告知,感谢

更多推荐

求教MATLAB、遗传算法大神们