• 大小: 13KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-06-18
  • 语言: Matlab
  • 标签: NSGA算法  

资源简介

多目标盘优化详细代码以及中文代码注释,非支配排序,拥挤的计算等

资源截图

代码片段和文件信息

function nsga_2_optimization
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%此处可以更改
%更多机器学习内容请访问omegaxyz.com
pop = 200; %种群数量
gen = 500; %迭代次数
M = 2; %目标函数数量
V = 30; %维度(决策变量的个数)
min_range = zeros(1 V); %下界 生成1*30的个体向量 全为0
max_range = ones(1V); %上界 生成1*30的个体向量 全为1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
chromosome = initialize_variables(pop M V min_range max_range);%初始化种群
chromosome = non_domination_sort_mod(chromosome M V);%对初始化种群进行非支配快速排序和拥挤度计算


for i = 1 : gen
    pool = round(pop/2);%round() 四舍五入取整 交配池大小
    tour = 2;%竞标赛  参赛选手个数
    parent_chromosome = tournament_selection(chromosome pool tour);%竞标赛选择适合繁殖的父代
    mu = 20;%交叉和变异算法的分布指数
    mum = 20;
    offspring_chromosome = genetic_operator(parent_chromosomeM V mu mum min_range max_range);%进行交叉变异产生子代 该代码中使用模拟二进制交叉和多项式变异 采用实数编码
    [main_pop~] = size(chromosome);%父代种群的大小
    [offspring_pop~] = size(offspring_chromosome);%子代种群的大小
    
    clear temp
    intermediate_chromosome(1:main_pop:) = chromosome;
    intermediate_chromosome(main_pop + 1 : main_pop + offspring_pop1 : M+V) = offspring_chromosome;%合并父代种群和子代种群
    intermediate_chromosome = non_domination_sort_mod(intermediate_chromosome M V);%对新的种群进行快速非支配排序
    chromosome = replace_chromosome(intermediate_chromosome M V pop);%选择合并种群中前N个优先的个体组成新种群
    if ~mod(i100)
        clc;
        fprintf(‘%d generations completed\n‘i);
    end
end


if M == 2
    plot(chromosome(:V + 1)chromosome(:V + 2)‘*‘);
    xlabel(‘f_1‘); ylabel(‘f_2‘);
    title(‘Pareto Optimal Front‘);
elseif M == 3
    plot3(chromosome(:V + 1)chromosome(:V + 2)chromosome(:V + 3)‘*‘);
    xlabel(‘f_1‘); ylabel(‘f_2‘); zlabel(‘f_3‘);
    title(‘Pareto Optimal Surface‘);
end
function f = initialize_variables(N M V min_range max_range)%f是一个由种群个体组成的矩阵
min = min_range;
max = max_range;
K = M + V;%%K是数组的总元素个数。为了便于计算,决策变量和目标函数串在一起形成一个数组。  
%对于交叉和变异,利用目标变量对决策变量进行选择
for i = 1 : N
    for j = 1 : V
        f(ij) = min(j) + (max(j) - min(j))*rand(1);%f(i j)表示的是种群中第i个个体中的第j个决策变量,
                                                    %这行代码为每个个体的所有决策变量在约束条件内随机取值
    end
    f(iV + 1: K) = evaluate_objective(f(i:) M V); % M是目标函数数量 V是决策变量个数
                                                    %为了简化计算将对应的目标函数值储存在染色体的V + 1 到 K的位置。
end
%% 对初始种群开始排序 快速非支配排序
% 使用非支配排序对种群进行排序。该函数返回每个个体对应的排序值和拥挤距离,是一个两列的矩阵。  
% 并将排序值和拥挤距离添加到染色体矩阵中 
function f = non_domination_sort_mod(x M V)
[N ~] = size(x);% N为矩阵x的行数,也是种群的数量
clear m
front = 1;
F(front).f = [];
individual = [];
 
for i = 1 : N
    individual(i).n = 0;%n是个体i被支配的个体数量
    individual(i).p = [];%p是被个体i支配的个体集合
    for j = 1 : N
        dom_less = 0;
        dom_equal = 0;
        dom_more = 0;
        for k = 1 : M        %判断个体i和个体j的支配关系
            if (x(iV + k) < x(jV + k))  
                dom_less = dom_less + 1;
            elseif (x(iV + k) == x(jV + k))
                dom_equal = dom_equal + 1;

评论

共有 条评论

相关资源