多目标白鲸优化算法

1.白鲸优化算法
参考论文:Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired metaheuristic algorithm[J]. Knowledge-Based Systems, 2022: 109215.
主要内容:本文提出了一种基于白鲸行为的元启发式算法白鲸优化(BWO)来解决优化问题。BWO建立了探索、开发和捕鲸三个阶段,分别对应于对游、猎物和落鲸的行为。BWO中鲸鱼跌倒的平衡因子和概率是自适应的,对控制勘探开发能力起着重要作用。此外,在开发阶段引入了征税飞行来增强全球收敛性。利用30个基准函数对该BWO的有效性进行了测试,并进行了定性、定量和可扩展性分析,并将统计结果与其他15种元启发式算法进行了比较。根据结果和讨论,BWO是一种解决单峰和多模态优化问题的竞争算法,通过弗里德曼排名检验,第一个比较元启发式算法之间基准函数的可扩展性分析。最后,四个工程问题证明了BWO在解决复杂的现实世界优化问题中的优点和潜力。
白鲸的行为示意图如下:游泳,对应于勘探阶段;觅食,对应于开发阶段;鲸鱼坠落,为鲸鱼坠落的阶段。
在这里插入图片描述算法总体框架示意图如下:
在这里插入图片描述2.NSGAII
参考论文:Deb K, Pratap A, Agarwal S, et al. A fast and elitist multiobjective genetic algorithm: NSGA-II[J]. IEEE transactions on evolutionary computation, 2002, 6(2): 182-197.
3.多目标白鲸优化算法(MOBWO)
在原论文中,白鲸优化算法是对单目标进行优化的。这里为了实现多目标白鲸优化算法,现将白鲸优化算法嵌入到NSGAII中,从而解决多目标优化问题。程序具体由matlab编程实现,具体核心代码如下所示:

(1)多目标白鲸优化算法(MOBWO)(无约束版本)

%---------------------------------------------------------------------
%程序功能:实现多目标白鲸优化算法(MOBWO)(无约束),测试函数为ZDT1,ZDT2,ZDT3,ZDT4,ZDT6,DTLZ1,DTLZ2
%择优策略:非支配排序,拥挤度计算,精英选择
%交配池:二元竞争选择
%遗传算子:白鲸优化算法(BWO)
%参考论文1:Deb K, Pratap A, Agarwal S, et al. A fast and elitist multiobjective 
%genetic algorithm: NSGA-II[J]. IEEE transactions on evolutionary computation, 2002, 6(2): 182-197.
%参考论文2:Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired
%metaheuristic algorithm[J]. Knowledge-Based Systems, 2022: 109215.
%创建时间:2022.8.29
%----------------------------------------------------------------------
clear all
clc
tic;
%参数设置
fun='ZDT4';
funfun;%函数选择
pop=100;%种群大小100
gen=1000;%250进化代数
pc=1;%交叉概率
pm=1/x_num;%变异概率
yita1=1;%模拟二进制交叉参数
yita2=20;%多项式变异参数
chromo=initialize(pop,f_num,x_num,x_min,x_max,fun);%初始化种群
%初始种群的非支配排序
[F1,chromo_non]=non_domination_sort(pop,chromo,f_num,x_num);%F为pareto等级为pareto_rank的集合,%p为每个个体p的集合(包括每个个体p的被支配个数n和该个体支配的解的集合s),chromo最后一列加入个体的等级
%计算拥挤度进行排序
chromo=crowding_distance_sort(F1,chromo_non,f_num,x_num);
%循环开始
for i=1:gen
    %二进制竞赛选择(k取了pop/2,所以选两次)
    chromo_parent_1 = tournament_selection(chromo);%从整个种群中选择一半的种群
    chromo_parent_2 = tournament_selection(chromo);%从整个种群中选择一半的种群
    chromo_parent=[chromo_parent_1;chromo_parent_2];%合并种群
    chromo_offspring = BWO(pop,gen,i,x_min,x_max,x_num,chromo,f_num,fun);
    %精英保留策略
    %将父代和子代合并
    [pop_parent,~]=size(chromo);
    [pop_offspring,~]=size(chromo_offspring);
    combine_chromo(1:pop_parent,1:(f_num+x_num))=chromo(:,1:(f_num+x_num));
    combine_chromo((pop_parent+1):(pop_parent+pop_offspring),1:(f_num+x_num))=chromo_offspring(:,1:(f_num+x_num));
    %快速非支配排序
    [pop2,~]=size(combine_chromo);
    [F2,combine_chromo1]=non_domination_sort(pop2,combine_chromo,f_num,x_num);
    %计算拥挤度进行排序
    combine_chromo2=crowding_distance_sort(F2,combine_chromo1,f_num,x_num);
    %精英保留产生下一代种群
    chromo=elitism(pop,combine_chromo2,f_num,x_num);
    if mod(i,10) == 0%10代提醒一次
        fprintf('%d gen has completed!\n',i);%若是则输出多少代完成的提示
    end
end
hold on
if(f_num==2)
    plot(chromo(:,x_num+1),chromo(:,x_num+2),'ro');
end
if(f_num==3)
    plot3(chromo(:,x_num+1),chromo(:,x_num+2),chromo(:,x_num+3),'ro');
end

(2)多目标白鲸优化算法(MOBWO)(处理约束版本)

clear
clc
global V M xl xu etac etam p pop_size pm p1 p2 pc
%% 描述
%---------------------------------------------------------------------
%程序功能:实现约束多目标白鲸优化算法(MOBWO)
%测试函数:1:Test1(BNH无约束) 2:ZDT1 3:kUR 4:SCH 5:ZDT2 6:Test2 7:ZDT3 8:ZDT4 
%9:ZDT6 10:BNH 11:SRN 12:TNK 13:OSY 14:CONSTR 15:FON 16:POL
%择优策略:非支配排序,拥挤度计算,精英选择,可行性法则
%交配池:二元竞争选择
%遗传算子:白鲸优化算法(BWO)
%参考论文1:Deb K, Pratap A, Agarwal S, et al. A fast and elitist multiobjective 
%genetic algorithm: NSGA-II[J]. IEEE transactions on evolutionary computation, 2002, 6(2): 182-197.
%参考论文2:Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired
%metaheuristic algorithm[J]. Knowledge-Based Systems, 2022: 109215.
%创建时间:2022.8.31
%----------------------------------------------------------------------
%% 程序开始
%p=input('Test problem index  :');%输入测试函数索引
%测试集:test_case 测试序列p:1:Test1(BNH无约束) 2:ZDT1 3:kUR 4:SCH 5:ZDT2 6:Test2 7:ZDT3 8:ZDT4
%9:ZDT6 10:BNH 11:SRN 12:TNK 13:OSY 14:CONSTR 15:FON 16:POL
%测试集:test_case1 测试序列p1:1:单目标 8约束 2:单目标 2约束 3:单目标 12约束
%测试集:test_case2 测试序列p2:1:DTLZ1 2:DTLZ2 3:DTLZ3
%% 公共参数
fname='test_case';%测试案例:test_case,test_case1,test_case2
M=2;%目标函数数量,可选:1,2,3
p=16;%2目标测试函数
p1=3;%1目标测试函数
p2=1;%3目标测试函数
pop_size=100;%种群大小
gen_max=250;%最大停止的代数
pc=1;%交叉概率
etac = 20;%分配交叉的索引20
etam = 20;%分配变异的索引,20,100
%% 2目标测试函数参数设置
if M==2               
if p<=9%无约束测试函数
tV=[2;30;3;1;30;4;30;10;10];%每各个体的维数
V=tV(p);%选择维数
txl=[-5*ones(1,V);zeros(1,V);-5*ones(1,V);-1000*ones(1,V);zeros(1,V);-1/sqrt(V)*ones(1,V);zeros(1,V); 0 -5*ones(1,V-1);zeros(1,V)]; %因为有九个测试函数所以获取一个9行加维数列个数据
txu=[10*ones(1,V); ones(1,V);5*ones(1,V);1000*ones(1,V);ones(1,V);1/sqrt(V) *ones(1,V);ones(1,V);1 5*ones(1,V-1);ones(1,V)];%因为有九个测试函数所以获取一个9行加维数列个数据
xl=(txl(p,1:V));            % 取值下限
xu=(txu(p,1:V));            % 取值上限
etac = 20;                  % 分配交叉的指数
etam = 20;                  % 分配变异的指数
pm=1/V;%变异概率
else %约束测试函数
p1=p-9;
if p1<8
tV=[2;2;2;6;2;3;2];%分配维数
V=tV(p1);%获取维数
txl=[0 0 0 0 0 0;-20 -20 0 0 0 0;0 0 0 0 0 0;0 0 1 0 1 0;0.1 0 0 0 0 0;-4*ones(1,6);-pi*ones(1,6)];%分配5行6列的个体
txu=[5 3 0 0 0 0;20 20 0 0 0 0;pi pi 0 0 0 0;10 10 5 6 5 10;1 5 0 0 0 0;4*ones(1,6);pi*ones(1,6)];%分配5行6列的个体
xl=(txl(p1,1:V));           % 取值下限
xu=(txu(p1,1:V));           % 取值上限
pm=1/V;%变异概率
end
if p1==8
V=50;
xl=zeros(1,V);        % 取值下限
xu=ones(1,V);           % 取值上限
pm=1/V;%变异概率
end
if p1==9
V=15;
xl=zeros(1,V);        % 取值下限
xu=ones(1,V);           % 取值上限
pm=1/V;%变异概率
end
if p1==10
V=15;
xl=zeros(1,V);        % 取值下限
xu=ones(1,V);           % 取值上限
pm=1/V;%变异概率
end
if p1==11
V=15;
xl=zeros(1,V);        % 取值下限
xu=ones(1,V);           % 取值上限
pm=1/V;%变异概率
end
if p1==12
V=4;
xl=[55 75 1000 2];        % 取值下限
xu=[80 110 3000 20];           % 取值上限
pm=1/V;%变异概率
end
end
end
%% 3目标测试函数参数设置
if M==3
if p2==1
    V=7;
    xl=zeros(1,V); 
    xu=ones(1,V);
end
if p2==2
    V=5;
    xl=zeros(1,V); 
    xu=ones(1,V);
end
pm=1/V;%变异概率
end
%% 1目标测试函数参数设置
if M==1
if p1==1
    V=10;
    xl=-10*ones(1,V); 
    xu=10*ones(1,V);
elseif p1==2
    V=2;
    xl=zeros(1,V); 
    xu=6*ones(1,V);
elseif p1==3
    V=8;
    xl=10*ones(1,V); 
    xu=1000*ones(1,V);
end
pm=1/V;%变异概率
end
%% 初始化
xl_temp=repmat(xl, pop_size,1);%将x1复制pop_size份到x1_temp中,repmat(x1,a,b):
%这个函数所表达的意思为,将x1中的行复制a份列复制b份到一个新的矩阵中去,可以用来初始化种群
xu_temp=repmat(xu, pop_size,1);%将xu复制pop_size份到xu_temp中
x = xl_temp+((xu_temp-xl_temp).*rand(pop_size,V));%初始化种群x,这里用的是点乘
if p==2||p==5||p==7||p==8||p==9
    PP=Pareto_F(p);%获取真实的帕累托前沿面
end
%% 目标评估
for i =1:pop_size%评估函数值
[ff(i,:), err(i,:)] =feval(fname, x(i,:));%目标函数评估,等价于[ff(i,:) err(i,:)]=test_case(x)
end
error_norm=normalisation(err);% 标准化违约度值,对种群中每个个体的违约度进行标准化
population_init=[x ff error_norm];%得到初始化种群,其中包括种群的大小,目标函数值,违约度值
[population, front]=NDS_CD_cons(population_init);%对于初始化种群进行非支配排序
%% 迭代开始
for gen_count=1:gen_max
%% 选择pop_size种群大小
parent_selected=tour_selection(population);%二元竞赛选择
%% 产生后代
child_offspring = BWO(pop_size,gen_max,i,xl,xu,V,parent_selected,M);
for ii = 1:pop_size
[fff(ii,:), err(ii,:)]=feval(fname, child_offspring(ii,:));% 对后代进行评估
end
error_norm=normalisation(err);                                  
child_offspring=[child_offspring fff error_norm];%得到初始化子代种群,其中包括种群的大小,目标函数值,违约度值
%% 后代种群并上子代种群,得到大小为2N的新种群
population_inter=[population(:,1:V+M+1) ; child_offspring(:,1:V+M+1)];%合并子代和父代的种群大小为2N
[population_inter_sorted, front]=NDS_CD_cons(population_inter);%对新种群进行非支配排序
%% 挑选大小为N的新种群
new_pop=replacement(population_inter_sorted, front);
population=new_pop;%更新种群为新种群
if M==1
    bestf(gen_count,:)=min(new_pop(:,V+M));
end
end
new_pop=sortrows(new_pop,V+1);%按照目标函数值1进行排序
%% 画出帕累托前沿点
if M==2
    if p==2||p==5||p==7||p==8||p==9
        plot(PP(:,1),PP(:,2),'g*');
    end
end
hold on;
if M==2
plot(new_pop(:,V+1),new_pop(:,V+2),'ro');
elseif  M==1
plot(bestf,'r-'); 
elseif  M==3 
plot3(new_pop(:,V+1),new_pop(:,V+2),new_pop(:,V+3),'ro');
end
xlabel('objective function 1')
ylabel('objective function 2')
if M==2
    switch p     
        case 1
    title(' 1 - Test1')
        case 2
    title(' 2  - ZDT1')
        case 3 
    title(' 3  - KUR')
        case 4
    title(' 4  - SCH')
        case 5
    title(' 5  - ZDT2')
        case 6
    title(' 6 - Test2')
        case 7
    title(' 7 - ZDT3')
        case 8
    title(' 8  - ZDT4')
        case 9
    title(' 9  - ZDT6')
        case 10
    title(' 10  - BNH')
        case 11
    title(' 11 - SRN')
        case 12
    title(' 12 - TNK')
        case 13
    title(' 13 - OSY')
        case 14
    title(' 14 - CONSTR')
        case 15
    title(' 15 - FON')
        case 16
    title(' 16 - POL')
    end
end

具体的代码资源:https://download.csdn.net/download/weixin_41929577/86506857

  • 5
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值