• 【智能优化算法-白鲸算法】基于白鲸优化算法求解多目标优化问题附matlab代码


    1 内容介绍

    在本文中,一种新的基于群体的元启发式算法灵感来自白鲸的行为鲸鱼,称为白鲸优化(BWO),是为了解决优化问题而提出的。三在 BWO 中建立了探索、开发和鲸落的阶段,对应于成对游泳、猎物和鲸落的行为,分别。平衡因子和概率BWO中的鲸落具有自适应性,对控制探索能力起着重要作用和剥削。此外,Levy 航班的引入是为了加强全球范围内的趋同。开发阶段。使用 30 个基准函数测试了提议的 BWO 的有效性,进行定性、定量和可扩展性分析,并将统计结果与15 种其他元启发式算法。根据结果和讨论,BWO 是一个有竞争力的算法解决单峰和多峰优化问题,BWO的总排名是比较元启发式算法中基准函数的可扩展性分析中的第一个通过弗里德曼排名检验。最后,四个工程问题展示了优点和BWO 在解决复杂的现实世界优化问题方面的潜力。

    2 部分代码

    %% 描述

    % 1.输入的变量 'population'的大小为: [size(popuation), V+M+1]

    % 2.输出的变量 'chromosome_NDS_CD' 的大小为: [size(population),V+M+3]

    %% 参考文献:

    %Kalyanmoy Deb, Amrit Pratap, Sameer Agarwal, and T. Meyarivan, " A Fast and Elitist Multiobjective Genetic Algorithm: NSGA-II", 

    %IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTATION, VOL. 6, No. 2, APRIL 2002. 

    %% 函数开始

    function [chromosome_NDS_CD, front] = NDS_CD_cons(population)

    global V M problem_type 

    %% 初始化结构体和变量

    chromosome_NDS_CD1=[];

    infpop=[];

    front.fr=[];%定义结构体,且第一行元素为fr

    struct.sp=[];%定义结构体,且第一行元素为sp

    rank=1;%帕累托前沿为1

    %% 种群的可行解和不可行解

    if all(population(:,V+M+1)==0)

        problem_type=0;%第一类无约束问题

        chromosome=population(:,1:V+M);%违约度都为0,都是可行的个体,抽取种群中不包含违约度的数据部分    

        pop_size1=size(chromosome,1);%获取种群大小,行值,由于第二个元素为1,则去第一个元素

    elseif all(population(:,V+M+1)~=0)%如果违约度不为0

        problem_type=1;%第二类有约束问题

        pop_size1=0;%种群大小为0

        infchromosome=population;%违约度都不为0,都是不可行的个体,此时获取这些个体       

    else

        problem_type=0.5;%如果违约度不全为0,则为第三类问题,问题为0.5类型

        feas_index=population(:,V+M+1)==0;%获取违约度为0个体的索引

        chromosome=population(feas_index,1:V+M);%获取可行的个体 

        pop_size1=size(chromosome,1);%获取可行个体大小

        infeas_index=population(:,V+M+1)~=0;%获取违约度不为0个体的索引

        infchromosome=population(infeas_index,1:V+M+1);% 获取不可行个体的种群

    end

    %%处理可行的解

    if problem_type==0 || problem_type==0.5

          pop_size1 = size(chromosome,1);

    %非支配排序

    %第一层,最前沿层

    for p=1:pop_size1

         n1=0;

         sp=[];

     for j=1:pop_size1

            less=0;%y'的目标函数值小于个体的目标函数值数目

            equal=0;%y'的目标函数值等于个体的目标函数值数目

            greater=0;%y'的目标函数值大于个体的目标函数值数目

            for k=1:M

                if(chromosome(p,V+k)

                    less=less+1;

                elseif(chromosome(p,V+k)==chromosome(j,V+k))

                    equal=equal+1;

                else

                    greater=greater+1;

                end

            end

            if(less==0 && equal~=M)%if(less==0 && greater~=0)

               n1=n1+1;%被支配个体数目n+1

            elseif(greater==0 && equal~=M)%elseif(greater==0 && less~=0)

               sp=[sp j];

            end

     end

      n(p)=n1;

      struct(p).sp=sp;

    end

    front(1).fr=find(n==0);%获取帕累托最前沿数据

    %其他层,其他前沿层

    while (~isempty(front(rank).fr))%如果某层帕累托前沿数据不为空

        front_indiv=front(rank).fr;%获取该层的数据

        n(front_indiv)=inf;%然后将各个元素所对应支配解的个数赋值为无穷大

        chromosome(front_indiv,V+M+1)=rank;%对此此层的每个个体的帕累托前沿层数赋值为rand并在该元素的数据后进行标记

        rank=rank+1;%帕累托前沿面的层数加1

        front(rank).fr=[];%现将结构体对应的下一层的数据赋值为空

       for i = 1:length(front_indiv)%对下一层的数据进行相应的处理

            temp=struct(front_indiv(i)).sp;%获取当前层每个元素对应的支配解集

            n(temp)=n(temp)-1;%对下一层每个元素被支配数减1,原因为下一层中为除去第一层后的最前沿,故其被支配的个体数减1

       end 

            q=find(n==0);%发现新的被支配数为1的个体

            front(rank).fr=[front(rank).fr q];%更新下一层帕累托前沿面数据

       

    end

    chromosome_sorted=sortrows(chromosome,V+M+1); %按照帕累托前沿面的等级进行排序 

    %拥挤度计算

    current_index = 0;

    for pareto_rank=1:(length(front)-1)%计算F的循环时多了一次空,所以减掉

        nd=[];%%拥挤度初始化为0

        nd(:,1)=zeros(length(front(pareto_rank).fr),1);%%拥挤度初始化为0

        %y=[];%储存当前处理的等级的个体

        [~,mm2]=size(chromosome_sorted);%mm2为temp中个体的维数

        y=zeros(length(front(pareto_rank).fr),mm2);%储存当前处理的等级的个体

        previous_index=current_index + 1;%预处理的个体为拥挤度加1

        for i=1:length(front(pareto_rank).fr)%遍历每层帕累托前沿的个体

            y(i,:)=chromosome_sorted(current_index + i,:);%存储每层待处理的个体

        end

        current_index=current_index + i;

        %%对于每一个目标函数fm

        for i=1:M

            %%根据该目标函数值对该等级的个体进行排序

            [~,index_objective]=sort(y(:,V+i));

            [~,mm3]=size(y);

            objective_sort=zeros(length(index_objective),mm3);%通过目标函数排序后的个体

            for j=1:length(index_objective)

                objective_sort(j,:)=y(index_objective(j),:);%存储对于每个目标函数进行排序后的个体

            end

            %%记fmax为最大值,fmin为最小值

            fmin=objective_sort(1,V+i);%记录最小值

            fmax=objective_sort(length(index_objective),V+i);%记录最大值

            %%对排序后的两个边界拥挤度设为1d和nd设为无穷

            y(index_objective(1),V+M+1+i)=Inf;%将两边的拥挤度设置成无穷大

            y(index_objective(length(index_objective)),V+M+1+i)=Inf;%将两边的拥挤度设置成无穷大

            %%计算nd=nd+(fm(i+1)-fm(i-1))/(fmax-fmin)

            for j=2:(length(index_objective)-1)%遍历除去最大目标函数值,和最小目标函数值,每个个体的其它目标函数值

                pre_f=objective_sort(j-1,V+i);%记录前一个函数值

                next_f=objective_sort(j+1,V+i);%记录后一个函数值,这里的i是指中间的函数值

                if (fmax-fmin==0)%如果最大值减去最小值为0,可以认为仅仅有一个目标函数,且最大值与最小值相等

                    y(index_objective(j),M+V+1+i)=Inf;%满足此条件,记录拥挤度为无穷大

                else

                    y(index_objective(j),M+V+1+i)=(next_f-pre_f)/(fmax-fmin);%或者可以进行拥挤度计算,即如果对于f2求拥挤度则可以写作,d=(f2+f1)/(fmax-fmin)

                end

            end

        end

        %多个目标函数拥挤度求和

        for i=1:M

            nd(:,1)=nd(:,1)+y(:,M+V+1+i);%每层所有个体各个目标函数的拥挤度求和

        end

        %第2列保存拥挤度,其他的覆盖掉

        y(:,M+V+2)=nd;

        y=y(:,1:(M+V+2));

        temp_two(previous_index:current_index,:) = y;

    end

    chromosome_NDS_CD1 = [temp_two(:,1:V+M) zeros(pop_size1,1) temp_two(:,V+M+1) temp_two(:,V+M+2)]; % 最后输出的结果分别为,种群个体的编码,目标函数值,违约度,支配等级,拥挤度计算值

    end

    %% 处理不可行解

    if problem_type==1 || problem_type==0.5%如果都是不可行解,或者可行个体和不可行个体都有

    infpop=sortrows(infchromosome,V+M+1);%对不可行个体按照违约度进行排序

    infpop=[infpop(:,1:V+M+1) (rank:rank-1+size(infpop,1))' inf*(ones(size(infpop,1),1))];%将不可行个体的编码,违约度,个体所在的位置,拥挤度记录下来

    for kk = (size(front,2)):(size(front,2))+(length(infchromosome))-1%可行个体的支配层数的下一层到不可行个体的个数

    front(kk).fr= pop_size1+1;%对不可行个体进行划分支配等级

    end

    end

    chromosome_NDS_CD = [chromosome_NDS_CD1;infpop]; %最后输出可行个体和不可行个体的基因编码

    3 运行结果

    4 参考文献

    博主简介:擅长智能优化算法神经网络预测信号处理元胞自动机图像处理路径规划无人机雷达通信无线传感器等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

    部分理论引用网络文献,若有侵权联系博主删除。

  • 相关阅读:
    100-150
    GitLab的使用
    【Python基础】字典和函数拓展
    C++ Reference: Standard C++ Library reference: C Library: cmath: atan
    javascript中格式化时间,时间戳与时间相互转化,显示为年月日时分秒星期
    根据中序与后序遍历结果构造二叉树
    哭了,早知道就不用花钱去学3D建模了️
    好消息!PMP项目管理证书列入急需紧缺专业人才人员
    二叉苹果树——树形dp问题
    宏记录器 Macro Recorder 2.0 注册版
  • 原文地址:https://blog.csdn.net/qq_59747472/article/details/126794630