NSGA-II改进前后数据分析代码(matlab)

数据内容

注:参数结果设置需要一样,种群大小、迭代次数,父代数量、交叉变异概率

改进前通过nsga2_test获取得到的

  • NSGA2_zdt1.mat
  • NSGA2_zdt2.mat
  • NSGA2_zdt3.mat
  • NSGA2_zdt4.mat
  • NSGA2_zdt6.mat

改进后通过my_nsga2_test获取得到的

  • MyNSGA2_zdt1.mat
  • MyNSGA2_zdt2.mat
  • MyNSGA2_zdt3.mat
  • MyNSGA2_zdt4.mat
  • MyNSGA2_zdt6mat

分析代码

代码中还包含了对SRN,和TNK函数测试结过的分析代码,可以去掉(SRN,和TNK是比较简单的带约束函数,改进前的结果已经很好了,就不做更多的分析了)

  • readfile.m:加载对应的数据,x表示对应的测试函数
  • Plot.m:画图函数,动态画出改进前与改进后每一代前沿的变化情况
  • plotTestPareto.m:根据所有测试次数结果中的最小GD画出前沿结果,加入真实前沿结果对比
  • plotTurePareto.m:根据已知获取的理想前沿结果画图
  • SaveOnlyGdSp.m:根据测试保存得到的数据,从里面抽取出GD和SP的数据,方便分析以及画图
  • constrictionGdSp.m:获取达到最大的迭代次数的最小GD时的测试的数据,画出改进前后GD、SP收敛情况对比图
  • StatisticsGdSp.m:统计测试结果中迭代到最大次数时的GD、SP【Best Worst Mean Std】,并将结果写入到excel中

readfile

function [MyNSGA2,NSGA2] = readfile(x)

%组建文件名
if x<=5
    if x == 5
        x = x +1;
    end
    filename1 = ['MyNSGA2_','zdt',num2str(x),'.mat'];
    filename2 = ['NSGA2_','zdt',num2str(x),'.mat'];
    %filename = ['ZDT/ZDT',num2str(x),'.txt'];
    variable1 = ['MyNSGA2_','zdt',num2str(x)];
    variable2 = ['NSGA2_','zdt',num2str(x)];
else
    switch x
        case 6
            filename1 = ['MyNSGA2_','srn','.mat'];
            filename2 = ['NSGA2_','srn','.mat'];
            variable1 = ['MyNSGA2_','srn'];
            variable2 = ['NSGA2_','srn'];
        case 7
            filename1 = ['MyNSGA2_','tnk','.mat'];
            filename2 = ['NSGA2_','tnk','.mat'];
            variable1 = ['MyNSGA2_','tnk'];
            variable2 = ['NSGA2_','tnk'];
    end
end
% 加载对应的文件名,并修改变量名
temp1 = load(filename1);
temp2 = load(filename2);
MyNSGA2 = temp1.(variable1);
NSGA2 = temp2.(variable2);
% 加载真实的前沿数据
%y = importdata(filename);

Plot

clc
clear
n = input('输入需要函数序号:');
[MyNSGA2,NSGA2] = readfile(n);

MyNSGA2_pop = MyNSGA2.testPop;
NSGA2_pop = NSGA2.testPop;
[~,x,y,z] = size(MyNSGA2.testPop);
MyNSGA2 = zeros(y,2);
NSGA2 = zeros(y,2);
for i = 1:x
    MyNSGA2(:,:) = MyNSGA2_pop(1,i,:,z-3:z-2);
    subplot(2,1,1)
    plot(MyNSGA2(:,1),MyNSGA2(:,2),'*')
    title(['改进的NSGA2测试第',num2str(n),'个函数第 ',num2str(i),' 代结果'])
    xlabel('f1(x)');
    ylabel('f2(x)');
    legend('改进NSGA2测试前沿');
    
    NSGA2(:,:) = NSGA2_pop(1,i,:,z-3:z-2);
    subplot(2,1,2)
    plot(NSGA2(:,1),NSGA2(:,2),'*')
    title(['传统的NSGA2测试第',num2str(n),'个函数第 ',num2str(i),' 代结果'])
    xlabel('f1(x)');
    ylabel('f2(x)');
    legend('传统NSGA2测试前沿');
    pause(0.001)
end

plotTestPareto

function plotTestPareto()
clc
clear
x = input('输入需要函数序号:');
[MyNSGA2,NSGA2] = readfile(x);

% 获取在500代的时候距离指标GD
MyNSGA2_GD = MyNSGA2.testGD(:,end);
NSGA2_GD = NSGA2.testGD(:,end);
% 得到最小距离指标,和测试的id
[MyNSGA2_min_GD,test_id1] = min(MyNSGA2_GD); %最小距离指标
[NSGA2_min_GD,test_id2] = min(NSGA2_GD);
% 打印30次测试所得的最小GD
disp(['改进与传统的最佳GD:',num2str([MyNSGA2_min_GD,NSGA2_min_GD])]);

%得到数据
[~,~,z,w] = size(MyNSGA2.testPop); % 获取纬度和种群信息
MyNSGA2_pop = zeros(z,2);              % 初始化数据
NSGA2_pop = zeros(z,2);
MyNSGA2_pop(:,:) = MyNSGA2.testPop(test_id1,end,:,w-3:w-2);  % 获取最佳种群
NSGA2_pop(:,:) = NSGA2.testPop(test_id2,end,:,w-3:w-2);

% 画出最后的Pareto前沿
figure(1)
plot(MyNSGA2_pop(:,1),MyNSGA2_pop(:,2),'*')
grid on 
xlabel('f1(x)');
ylabel('f2(x)');
legend('改进NSGA2测试前沿');

figure(2)
plot(NSGA2_pop(:,1),NSGA2_pop(:,2),'*')
grid on 
xlabel('f1(x)');
ylabel('f2(x)');
legend('传统NSGA2测试前沿');

% 加入真实前沿图
plotTurePareto(x)

plotTurePareto

function plotTurePareto(x)
% 获取文件名
if x<=5
    if x == 5
        x = x +1;
    end
    filename = ['ZDT/ZDT',num2str(x),'.txt'];
end
% 读取数据
y = importdata(filename);
y = sortrows(y,[1,2]);

% 加入真实前沿图
figure(1)
hold on
plot(y(:,1),y(:,2),'-','LineWidth',3)
legend('改进NSGA2测试前沿','已知前沿')

figure(2)
hold on
plot(y(:,1),y(:,2),'-','LineWidth',3)
legend('传统NSGA2测试前沿','已知前沿')

SaveOnlyGdSp

clc
clear
MyNSGA2_GdSp.GD = [];
MyNSGA2_GdSp.SP = [];
NSGA2_GdSp.GD = [];
NSGA2_GdSp.SP = [];
for x = 1:7
    disp(x)
    if x<=5
        i = x;
        if x == 5
            i = x +1;
        end
        filename1 = ['MyNSGA2_','zdt',num2str(i),'.mat'];
        filename2 = ['NSGA2_','zdt',num2str(i),'.mat'];
        %filename = ['ZDT/ZDT',num2str(x),'.txt'];
        variable1 = ['MyNSGA2_','zdt',num2str(i)];
        variable2 = ['NSGA2_','zdt',num2str(i)];
    else
        switch x
            case 6
                filename1 = ['MyNSGA2_','srn','.mat'];
                filename2 = ['NSGA2_','srn','.mat'];
                variable1 = ['MyNSGA2_','srn'];
                variable2 = ['NSGA2_','srn'];
            case 7
                filename1 = ['MyNSGA2_','tnk','.mat'];
                filename2 = ['NSGA2_','tnk','.mat'];
                variable1 = ['MyNSGA2_','tnk'];
                variable2 = ['NSGA2_','tnk'];
        end
    end
    % 加载对应的文件名,并修改变量名
    temp1 = load(filename1);
    temp2 = load(filename2);
    MyNSGA2 = temp1.(variable1);
    NSGA2 = temp2.(variable2);
    MyNSGA2_GdSp(x).GD = MyNSGA2.testGD;
    MyNSGA2_GdSp(x).SP = MyNSGA2.testSP;
    NSGA2_GdSp(x).GD = NSGA2.testGD;
    NSGA2_GdSp(x).SP = NSGA2.testSP;
end
save('MyNSGA2_GdSp.mat','MyNSGA2_GdSp')
save('NSGA2_GdSp.mat','NSGA2_GdSp')

constrictionGdSp

function constrictionGdSp()
% 函数序号:
% 1、ZDT1
% 2、ZDT2
% 3、ZDT3
% 4、ZDT4
% 5、ZDT6
% 6、SRN
% 7、TNK
x = input('输入需要函数序号:');
load('MyNSGA2_GdSp.mat')
load('NSGA2_GdSp.mat')
MyNSGA_GD = MyNSGA2_GdSp(x).GD;
MyNSGA_SP = MyNSGA2_GdSp(x).SP;

NSGA_GD = NSGA2_GdSp(x).GD;
NSGA_SP = NSGA2_GdSp(x).SP;

% 获取达到最大的迭代次数的最小GD时的测试的数据
[~,id1] = min(MyNSGA_GD(:,end));
[~,id2] = min(NSGA_GD(:,end));

x = 1:500;
figure(1)
plot(x,MyNSGA_GD(id1,:),x,NSGA_GD(id2,:));
grid on
xlabel('进化代数');
ylabel('GD');
legend('改进的NSGA2的距离指标','传统的NSGA2的距离指标')
title('距离指标GD收敛情况对比图');

figure(2)
plot(x,MyNSGA_SP(id1,:),x,NSGA_SP(id2,:));
grid on
xlabel('进化代数');
ylabel('SP');
legend('改进的NSGA2的分布性指标','传统的NSGA2的分布性指标')
title('分布性指标SP收敛情况对比图');

StatisticsGdSp

function StatisticsGdSp()
% 统计30次测试结果中迭代到最大次数时的距离指标和分布性指标
% Best Worst Mean Std
% 将统计的结果写入Excel文件
load('MyNSGA2_GdSp.mat')
load('NSGA2_GdSp.mat')

% 测试次数30,共7个函数
MyNSGA2_Gd = zeros(30,7);
MyNSGA2_Sp = zeros(30,7);
NSGA2_Gd = zeros(30,7);
NSGA2_Sp = zeros(30,7);

for i = 1:7
    MyNSGA2_Gd(:,i) = MyNSGA2_GdSp(i).GD(:,end);
    MyNSGA2_Sp(:,i) = MyNSGA2_GdSp(i).SP(:,end);
    NSGA2_Gd(:,i) = NSGA2_GdSp(i).GD(:,end);
    NSGA2_Sp(:,i) = NSGA2_GdSp(i).SP(:,end);
end

% 合并两个算法的GD和SP,前为传统,后为改进
% 分别计算每个算法的Best Worst Mean Std
% GD2:改进,GD1:传统
[MyNSGA2_Gd_Best,~] = min(MyNSGA2_Gd);
[MyNSGA2_Gd_Worst,~] = max(MyNSGA2_Gd);
MyNSGA2_Gd_Mean = mean(MyNSGA2_Gd);
MyNSGA2_Gd_Std = std(MyNSGA2_Gd);
GD2 = [MyNSGA2_Gd_Best;MyNSGA2_Gd_Worst;MyNSGA2_Gd_Mean;MyNSGA2_Gd_Std];

[NSGA2_Gd_Best,~] = min(NSGA2_Gd);
[NSGA2_Gd_Worst,~] = max(NSGA2_Gd);
NSGA2_Gd_Mean = mean(NSGA2_Gd);
NSGA2_Gd_Std = std(NSGA2_Gd);
GD1 = [NSGA2_Gd_Best;NSGA2_Gd_Worst;NSGA2_Gd_Mean;NSGA2_Gd_Std];

% 计算每个的SP
% SP2:改进,SP1:传统
[MyNSGA2_Sp_Best,~] = min(MyNSGA2_Sp);
[MyNSGA2_Sp_Worst,~] = max(MyNSGA2_Sp);
MyNSGA2_Sp_Mean = mean(MyNSGA2_Sp);
MyNSGA2_Sp_Std = std(MyNSGA2_Sp);
SP2 = [MyNSGA2_Sp_Best;MyNSGA2_Sp_Worst;MyNSGA2_Sp_Mean;MyNSGA2_Sp_Std];

[NSGA2_Sp_Best,~] = min(NSGA2_Sp);
[NSGA2_Sp_Worst,~] = max(NSGA2_Sp);
NSGA2_Sp_Mean = mean(NSGA2_Sp);
NSGA2_Sp_Std = std(NSGA2_Sp);
SP1 = [NSGA2_Sp_Best;NSGA2_Sp_Worst;NSGA2_Sp_Mean;NSGA2_Sp_Std];

disp('开始写入数据')
% ZDT 函数
% 数据写入Excel
GD = [GD1(:,1:5);GD2(:,1:5)];
SP = [SP1(:,1:5);SP2(:,1:5)];
xlswrite('StatisticsGdSp.xls',GD,'Sheet1','C2:G9');
xlswrite('StatisticsGdSp.xls',SP,'Sheet2','C2:G9');

% % 对srn、tnk函数的写入
GD = [GD1(:,6:7)',GD2(:,6:7)'];
SP = [SP1(:,6:7)',SP2(:,6:7)'];
xlswrite('StatisticsGdSp.xls',GD,'Sheet3','B3:I4');
xlswrite('StatisticsGdSp.xls',SP,'Sheet4','B3:I4');

disp('数据已写入')

运行结果

Plot结果

画zdt4函数为例:会画出整个的迭代过程种群情况

在这里插入图片描述在这里插入图片描述

plotTestPareto结果

画zdt4函数为例:得到测试前言与已知前沿的对比
在这里插入图片描述

在这里插入图片描述

constrictionGdSp结果

先运行SaveOnlyGdSp,得到MyNSGA2_GdSp.mat和NSGA2_GdSp.mat之后,再执行constrictionGdSp
结果可以参考
基于NSGA-II算法的研究和改进

画zdt1函数为例:

在这里插入图片描述

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
NSGA-II(Nondominated Sorting Genetic Algorithm II)是一种多目标优化算法,可用于求解水库调度问题。水库调度问题是通过合理安排水库的放水策略,以满足下游需水量、发电需求和洪水调节等多个目标。 在使用NSGA-II求解水库调度问题时,需要将问题转化为一个多目标优化问题。常见的目标包括:最大化发电量、最小化下游缺水量、最小化下游洪水峰值等。同时,还需考虑到水库的运行约束,如保证水位在合理范围内、避免过快过慢的调节等。 NSGA-II算法的基本步骤如下: 1. 初始化种群:随机生成一组初始解,代表水库的放水策略。 2. 评估适应度:根据每个解所对应的目标函数值,计算适应度。 3. 非支配排序:根据解的适应度值,进行非支配排序,将解划分为不同的等级。 4. 拥挤度计算:根据解所在的等级和其在该等级中的密度,计算每个解的拥挤度。 5. 选择操作:根据非支配排序和拥挤度计算结果,选择出下一代的解。 6. 交叉操作:对选择出的解进行交叉操作,生成新的解。 7. 变异操作:对新生成的解进行变异操作,引入新的搜索空间。 8. 终止条件判断:判断是否满足终止条件,如果不满足则返回步骤3,否则结束算法。 通过多次迭代,NSGA-II算法可以逐步优化水库调度策略,找到一组最优解的近似集合,供决策者选择最合适的方案。需要注意的是,NSGA-II算法的结果并不是唯一的,而是一组可能的最优解,决策者需要根据具体情况进行选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值