NSGA2算法MATLAB实现(能够自定义优化函数) – OmegaXYZ

您所在的位置:网站首页 目标函数例子图 NSGA2算法MATLAB实现(能够自定义优化函数) – OmegaXYZ

NSGA2算法MATLAB实现(能够自定义优化函数) – OmegaXYZ

2023-09-07 19:33| 来源: 网络整理| 查看: 265

以前写了一个简单的NSGA2的算法能够用在ZDT1函数上:http://www.omegaxyz.com/2017/05/04/nsga2matlabzdt1/

那个NSGA2的算法不具有普遍性,下面参考课国外的课题小组的代码重新修改了内部冗余内容,使之能够自定义优化函数。

NSGA2的过程为:

1、随机产生一个初始父代Po,在此基础上采用二元锦标赛选择、交叉和变异操作产生子代Qo, Po 和Qo群体规模均为N

2、将Pt和Qt并入到Rt中(初始时t=0),对Rt进行快速非支配解排序,构造其所有不同等级的非支配解集F1、F2……..

3、按照需要计算Fi中所有个体的拥挤距离,并根据拥挤比较运算符构造Pt+1,直至Pt+1规模为N,图中的Fi为F3

具体解释请见:http://www.omegaxyz.com/2017/04/14/nsga-iiintro/

C++代码请见(测试函数ZDT1):http://www.omegaxyz.com/2017/04/20/nsga2zdt1/

下面是完整版的代码:

①nsga2-optimization.m

MATLAB 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 function nsga_2_optimization%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %此处可以更改 %更多机器学习内容请访问omegaxyz.com pop = 500; %种群数量gen = 500; %迭代次数M = 2; %目标数量V = 30; %维度min_range = zeros(1, V); %下界max_range = ones(1,V); %上界%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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);    tour = 2;    parent_chromosome = tournament_selection(chromosome, pool, tour);    mu = 20;    mum = 20;    offspring_chromosome = genetic_operator(parent_chromosome,M, 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_pop,1 : M+V) = offspring_chromosome;    intermediate_chromosome = non_domination_sort_mod(intermediate_chromosome, M, V);    chromosome = replace_chromosome(intermediate_chromosome, M, V, pop);    if ~mod(i,100)        clc;        fprintf('%d generations completed\n',i);    endend 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

②initialize_variables.m

MATLAB 12345678910 function f = initialize_variables(N, M, V, min_range, max_range)min = min_range;max = max_range;K = M + V;for i = 1 : N    for j = 1 : V        f(i,j) = min(j) + (max(j) - min(j))*rand(1);    end    f(i,V + 1: K) = evaluate_objective(f(i,:), M, V);end

③non_domination_sort_mod.m

MATLAB 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 function f = non_domination_sort_mod(x, M, V)[N, ~] = size(x);clear mfront = 1;F(front).f = [];individual = []; for i = 1 : N    individual(i).n = 0;    individual(i).p = [];    for j = 1 : N        dom_less = 0;        dom_equal = 0;        dom_more = 0;        for k = 1 : M            if (x(i,V + k) MATLAB 123456789101112131415161718192021222324252627282930313233343536 function f = tournament_selection(chromosome, pool_size, tour_size)[pop, variables] = size(chromosome);rank = variables - 1;distance = variables;for i = 1 : pool_size    for j = 1 : tour_size        candidate(j) = round(pop*rand(1));        if candidate(j) == 0            candidate(j) = 1;        end        if j > 1            while ~isempty(find(candidate(1 : j - 1) == candidate(j)))                candidate(j) = round(pop*rand(1));                if candidate(j) == 0                    candidate(j) = 1;                end            end        end    end    for j = 1 : tour_size        c_obj_rank(j) = chromosome(candidate(j),rank);        c_obj_distance(j) = chromosome(candidate(j),distance);    end    min_candidate = ...        find(c_obj_rank == min(c_obj_rank));    if length(min_candidate) ~= 1        max_candidate = ...        find(c_obj_distance(min_candidate) == max(c_obj_distance(min_candidate)));        if length(max_candidate) ~= 1            max_candidate = max_candidate(1);        end        f(i,:) = chromosome(candidate(min_candidate(max_candidate)),:);    else        f(i,:) = chromosome(candidate(min_candidate(1)),:);    endend

⑤genetic_operator.m

MATLAB 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 function f  = genetic_operator(parent_chromosome, M, V, mu, mum, l_limit, u_limit)[N,m] = size(parent_chromosome); clear mp = 1;was_crossover = 0;was_mutation = 0;  for i = 1 : N    % With 90 % probability perform crossover    if rand(1)

⑦自定义评价函数(我选用的ZDT1函数)

MATLAB 1234567891011 function f = evaluate_objective(x, M, V)f = [];f(1) = x(1);g = 1;sum = 0;for i = 2:V    sum = sum + x(i);endg = g + 9*sum / (V-1));f(2) = g * (1 - sqrt(x(1) / g));end

500个种群运行500代的结果:

代码打包下载:http://download.csdn.net/download/xyisv/10217700

Github项目地址:https://github.com/xyjigsaw/NSGA2_MATLAB



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3