多目标灰狼算法(MOGWO)的Matlab代码详细注释及难点解释(佳点集改进初始种群的MOGWO)

news2024/11/24 19:40:22

目录

一、外部种群Archive机制

二、领导者选择机制

三、多目标灰狼算法运行步骤

四、MOGWO的Matlab部分代码详细注释

五、MOGWO算法难点解释

5.1 网格与膨胀因子

5.2 轮盘赌方法选择每个超立方体概率


 

      为了将灰狼算法应用于多目标优化问题,在灰狼算法中引入外部种群Archive,用于存储非支配最优解。采用领导者选择策略,从外部种群Archive选择捕食过程中的领导者eq?%5Calpha狼、eq?%5Cbeta狼及eq?%5Cdelta狼。

一、外部种群Archive机制

       算法每次迭代会产生新的个体,当个体要加入外部种群Archive时,将这些个体逐一与Archive中的个体进行比较,将会出现4种情况:

       (1)如果新个体被至少一个存档中的个体支配,则该个体不加入存档。 (2)如果新个体支配存档中的一个或多个个体,则新个体加入存档,同时将被其支配的个体从存档中删除。 (3)如果新个体与存档中的任一个体互不支配,则将该个体加入存档。 (4)如果存档中已满,应首先运行网格机制,重新安排目标空间的划分,并在最拥挤组中随机删除某些个体,新的个体被插入到不拥挤组中,提高接近最优前沿的多样性。

2ac50df81304fea547d97e5775020c4f.jpeg

二、领导者选择机制

        在存档中存放所有的非支配最优解,采用轮盘赌的方式从存档中选取头狼(包括eq?%5Calpha狼、eq?%5Cbeta狼及eq?%5Cdelta狼),选择搜索空间中最不拥挤的区域,并给出其非支配解中的一个作为eq?%5Calpha狼、eq?%5Cbeta狼或eq?%5Cdelta狼。为了提高算法的探索能力,每一个个体被选择的概率与其所在组的个体数成反比。

        如果在最不拥挤的超立方体中少于三个解,也会找到第二个不拥挤的超立方体来选择其它领导者,暂时将Delta排除在存档之外,以避免选择相同领导者;如果第二个最不拥挤的超立方体有一个解,这种情况也是一样的,因此应该从第三个最不拥挤的超立方体,选择其它领导者,暂时将Beta排除在存档之外,以避免选择相同领导者。

三、多目标灰狼算法运行步骤

2b42a482369b40b0ab33b32691219db0.png

四、MOGWO的Matlab部分代码详细注释

完整注释代码私信获取

 

clear all
clc
drawing_flag = 1;
nVar=5;        %变量维数
fobj=@(x) ZDT1(x);
lb=zeros(1,5); %下限
ub=ones(1,5);  %上限
VarSize=[1 nVar];
GreyWolves_num=100; %种群规模
for i=1:GreyWolves_num
    for j=1:nVar
        p1=2*nVar+3;
        r=2*cos(2*pi*j/p1);
        G(i,j)=mod(r*i,1);
    end
end
Boundary_no= size(ub,2); % numnber of boundaries

% If the boundaries of all variables are equal and user enter a signle
% number for both ub and lb
if Boundary_no==1
    X=G.*(ub-lb)+lb;
end

% If each variable has a different lb and ub
if Boundary_no>1
    for i=1:nVar
        ub_i=ub(i);
        lb_i=lb(i);
        X(:,i)=G(:,i).*(ub_i-lb_i)+lb_i;
    end
end

MaxIt=100;  % 最大迭代次数
Archive_size=100;   % 存档规模
alpha=0.1;  % 网格膨胀因子
nGrid=10;   % 每一维上的网格数
beta=4;     % 领导者选择压力因子
gamma=2;    % 额外的(待删除)存档个体选择压力
% 初始化
GreyWolves=CreateEmptyParticle(GreyWolves_num);
for i=1:GreyWolves_num
    GreyWolves(i).Velocity=0;
    GreyWolves(i).Position=zeros(1,nVar);
    for j=1:nVar
        GreyWolves(i).Position(1,j)=unifrnd(lb(j),ub(j),1); %随机生成变量范围内值
    end
    GreyWolves(i).Cost=fobj(GreyWolves(i).Position')';      %计算适应度值
    GreyWolves(i).Best.Position=GreyWolves(i).Position; 
    GreyWolves(i).Best.Cost=GreyWolves(i).Cost;
end
GreyWolves=DetermineDomination(GreyWolves);
Archive=GetNonDominatedParticles(GreyWolves);
Archive_costs=GetCosts(Archive);
G=CreateHypercubes(Archive_costs,nGrid,alpha);
for i=1:numel(Archive)     %对于第i个个体,第j个目标
    [Archive(i).GridIndex, Archive(i).GridSubIndex]=GetGridIndex(Archive(i),G);
end


%% MOGWO main loop
for it=1:MaxIt
    a=2-it*((2)/MaxIt);     %a从2线性减小到0
    for i=1:GreyWolves_num  %对于每个搜索个体     
        clear rep2
        clear rep3       
        % Choose the alpha, beta, and delta grey wolves
        %领导者选择组件选择搜索空间中最不拥挤的区域,并给出其非支配解中一个作为alpha,、beta或delta狼

        Delta=SelectLeader(Archive,beta);
        Beta=SelectLeader(Archive,beta);
        Alpha=SelectLeader(Archive,beta);  

        % 如果在最不拥挤的超立方体中少于三个解,也会找到第二个不拥挤的超立方体来选择其它领导者
        % 暂时将Delta排除在存档之外,以避免选择相同领导者
        if size(Archive,1)>1           %如果存档中不止一个个体
            counter=0;
            for newi=1:size(Archive,1) %对于存档中每个个体
                if sum(Delta.Position~=Archive(newi).Position)~=0 %如果Delta是存档中的个体
                    counter=counter+1;
                    rep2(counter,1)=Archive(newi);                %rep2是排除Delta后的存档
                end
            end
            Beta=SelectLeader(rep2,beta); %在排除Delta后的存档中用轮盘赌法选择Beta
        end  

.
.
.
.
.
.
.

function [occ_cell_index ,occ_cell_member_count]=GetOccupiedCells(pop)
    GridIndices=[pop.GridIndex];         %存档中每个个体在网格中的位置
    occ_cell_index=unique(GridIndices);  %GridIndices剔除一个小网格中的重复值,从小到大排序 
    occ_cell_member_count=zeros(size(occ_cell_index));
    m=numel(occ_cell_index);             %存档中个体占据的小网格数
    for k=1:m
        occ_cell_member_count(k)=sum(GridIndices==occ_cell_index(k)); %计算小网格上解数量
    end    
end


function i=RouletteWheelSelection(p)
    r=rand;
    c=cumsum(p);            %累计概率
    i=find(r<=c,1,'first'); %r首次<=c的第几个值
end


function z=ZDT1(x)
n=numel(x);
f1=x(1);
g=1+9/(n-1)*sum(x(2:end));
h=1-sqrt(f1/g);
f2=g*h;
z=[f1
    f2];
end

function z=ZDT2(x)
n=numel(x);
f1=x(1);
g=1+9/(n-1)*sum(x(2:end));
h=1-(f1/g)^2;
f2=g*h;
z=[f1
    f2];
end

function z=ZDT3(x)
n=numel(x);
f1=x(1);
g=1+9/(n-1)*sum(x(2:end));
h=1-f1/g-(f1/g)*sin(10*pi*x(1));
f2=g*h;
z=[f1
    f2];
end

function z=ZDT4(x)
n=numel(x);
f1=x(1);
sum=0;
for i=2:n
    sum = sum+(x(i)^2-10*cos(4*pi*x(i)));
end
g=1+(n-1)*10+sum;
f2=g*(1-(f1/g)^0.5);
z=[f1
    f2];
end

五、MOGWO算法难点解释

5.1 网格与膨胀因子

       算法中的网格其实就是将目标空间划分为一个个网格,划分网格后就可以知道每个网格中有几个粒子,同理也就能知道某个粒子在哪个网格中。网格膨胀因子就是将网格膨胀的参数。图一中第一坐标外的就是膨胀出的网格。eq?mincj就是膨胀后的网格下边界,eq?maxcj就是膨胀后的网格上边界。

ec67a81d313046aa862519b53c87adf4.png

图1 网格膨胀因子解释图

 mincj=min(costs(j,:));  %每个目标上的存档个体目标函数最小值
 maxcj=max(costs(j,:));  %每个目标上的存档个体目标函数的最大值      
 dcj=alpha*(maxcj-mincj);      
 mincj=mincj-dcj;          
 maxcj=maxcj+dcj;             

5.2 轮盘赌方法选择每个超立方体概率

 beta=4;     % 领导者选择压力因子
.
.
.
 p=occ_cell_member_count.^(-beta);
 p=p/sum(p); %通过轮盘赌方法进行选择,每个超立方体概率 
 selected_cell_index=occ_cell_index(RouletteWheelSelection(p)); %用轮盘赌选择的所在区域 
.
.
.
 function i=RouletteWheelSelection(p)
    r=rand;
    c=cumsum(p);            %累计概率
    i=find(r<=c,1,'first'); %r首次<=c的第几个值
 end

         例: occ_cell_member_count=[2 1 1 1 1 1 1],则 p = [0.0103 0.1649 0.1649 0.1649 0.1649 0.1649 0.1639],因为这里 p = occ_cell_member_count.^(-beta))。则累计概率c = [0.0103 0.1753 0.3402 0.5052 0.6701 0.8351 1]。因为这里eq?c%3Dcumsum%5Cleft%20%28%20p%20%5Cright%20%29 。  

         如果运行后随机数eq?r%3Drand%3D0.3828,则eq?r首次eq?%5Cleq%20c时位置为4,所以eq?i%3D4。选择的区域selected_cell_index为occ_cell_index数组中第4个位置的区域。这里假设occ_cell_index=[17 19 26 33 43 62 82],就有selected_cell_index=33。          

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/781177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)

目录 1. 返回静态页面 2. 返回非静态页面 2.1 ResponseBody 返回页面内容 2.2 RestController ResponseBody Controller 2.3 示例:实现简单计算的功能 3. 返回JSON对象 3.1 实现登录功能&#xff0c;返回 JSON 对象 4. 请求转发(forward)或请求重定向(redirect) 4.1 请…

Day 63 : 集成学习之 AdaBoosting (1. 带权数据集)

63.1 AdaBoosting基本算法&#xff1a;先从初始训练集训练一个弱学习器&#xff0c;在根据弱学习器的表现对训练样本进行权重调整&#xff0c;经过若干轮之后&#xff0c;将得到一组分类器&#xff0c;将数据输入这组分类器后会得到一个综合且准确的的分类结果。“三个臭皮匠&a…

评论管理功能

后端 bp.get("/comment/list") def comment_list():comments CommentModel.query.order_by(CommentModel.create_time.desc()).all()comment_list []for comment in comments:comment_dict comment.to_dict()comment_list.append(comment_dict)return restful.ok…

Python模块requests基本用法

简介 Python 的 requests 模块是一个流行的第三方库&#xff0c;用于发送HTTP请求。它提供了一组简洁且易于使用的API&#xff0c;使得在Python中进行网络通信变得更加简单和灵活。 目录 1. 基本概念 1.1. HTTP 协议 1.2. GET 请求 1.3. POST 请求 1.4. get 和 post 的区别…

uniapp 小程序 评分组件

效果图&#xff1a; 1、组件&#xff1a;starsRating.vue <template><view class"stars"><image click"btnStars1" class"starsicon" :src"starsObject[0]" mode"widthFix"></image><image c…

Stream API将对象中的某一字段取出转换为list或数组

List<DevicePartMaintain> devicePartMaintainList devicePartMaintainMapper.selectDevicePartMaintainByMitId(mitId);所有id转换为List 要使用Stream流获取devicePartMaintainList中所有的id&#xff0c;您可以使用stream()方法将列表转换为流&#xff0c;然后使用…

从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现

目录 1. 红黑树的引入和简介 2. 红黑树的性质和定义 3. 红黑树的插入 3.1 调整情况一 3.2 调整情况二 3.2.1 调整情况二中的单旋变色 3.2.2 调整情况二中的双旋变色 3.3 调整情况三 3.4 红黑树插入完整代码 4. 红黑树的验证和完整代码 4.1 验证是不是搜索树&#xf…

Pytorch个人学习记录总结 07

目录 神经网络-非线性激活 神经网络-线形层及其他层介绍 神经网络-非线性激活 官方文档地址&#xff1a;torch.nn — PyTorch 2.0 documentation 常用的&#xff1a;Sigmoid、ReLU、LeakyReLU等。 作用&#xff1a;为模型引入非线性特征&#xff0c;这样才能在训练过程中…

【0基础学习python】顺序结构+条件语句+循环结构(文章后面有人生重开模拟器的相关逻辑和简单实现)

1.顺序语句 默认情况下&#xff0c;python的代码执行顺序是按照从上到下的顺序&#xff0c;依次执行的。 print(1) print(2) print(3)执行的结果一定为 1 2 3 &#xff0c;而不会出现 3 2 1 或者 1 3 2等&#xff0c;这种按照顺序执行的代码&#xff0c;我们称为顺序语句。 …

C++第六讲

思维导图 顺序栈定义成模板类 /* ---------------------------------author&#xff1a;YoungZorncreated on 2023/7/22 16:23.--------------------------------- */ #include<iostream>using namespace std;template<typename T> class my_stack { private:T *p…

Unity进阶--声音管理器学习笔记

文章目录 声音管理器 using System.Collections; using System.Collections.Generic; using UnityEngine;public class AudioManager : MyrSingletonBase<AudioManager> {//环境音private AudioSource enPlayer;//音效private AudioSource sePlayer;//音乐private Audio…

IDEA使用AWS CodeWhisperer

IDEA使用AWS CodeWhisperer 首先在IDEA的插件市场中下载AWS Toolkit&#xff1a; 这里我使用的IDEA是2023.1&#xff0c;就是在ToolWindows里把AWS Toolkit面板调出来&#xff1a; 连接&#xff1a; 打开的网页中粘贴上面提过的代码。进入注册流程。 注册完成后返回IDEA&am…

自动驾驶感知系统-毫米波雷达

毫米波雷达就是电磁波&#xff0c;雷达通过发射无线电信号并接收反射信号来测定车辆与物体间的距离&#xff0c;其频率通常介于10~300GHz之间。与厘米波导引头相比&#xff0c;毫米波导引头体积小&#xff0c;质量轻&#xff0c;空间分辨率高&#xff1b;与红外、激光、电视等光…

Vue--插槽

一、插槽-默认插槽 1.作用 让组件内部的一些 结构 支持 自定义 2.需求 将需要多次显示的对话框,封装成一个组件 3.问题 组件的内容部分&#xff0c;不希望写死&#xff0c;希望能使用的时候自定义。怎么办 4.插槽的基本语法 组件内需要定制的结构部分&#xff0c;改用**…

STM32 HAL库定时器输入捕获+更新中断

STM32 HAL库定时器输入捕获更新中断 &#x1f4cd;相关参考&#xff1a;https://www.cnblogs.com/kevin-nancy/p/12569377.html#4621839&#x1f4cc;相关篇《STM32 HAL库定时器输入捕获SlaveMode脉宽测量》 ✨高级定时器的输入捕获功能在脉宽信号测量方面是非常方便的。尤其时…

代码随想录算法训练营第二十一天 | 读PDF复习环节1

读PDF复习环节1 本博客的内容只是做一个大概的记录&#xff0c;整个PDF看下来&#xff0c;内容上是不如代码随想录网站上的文章全面的&#xff0c;并且PDF中有些地方的描述&#xff0c;是很让我疑惑的&#xff0c;在困扰我很久后&#xff0c;无意间发现&#xff0c;其网站上的讲…

JavaEE——Spring中存取Bean的注解

目录 一、存储Bean对象 1、定义 2、存储方式 &#xff08;1&#xff09;、类注解 【1】、Controller&#xff08;控制器存储&#xff09; 【2】、Service&#xff08;服务存储&#xff09; 【3】、Repository&#xff08;仓库存储&#xff09; 【4】、Component&#xf…

创造型模式-原型模式(场景体验-》方案解决===代码图解)

创造型模式-原型模式 创建重复对象-场景体验解决方案&#xff08;原型模式&#xff09;原型模式定义 创建重复对象-场景体验 今天来一个大客户&#xff0c;他要求帮他下100个订单。每个订单除了用户ID&#xff0c;和用户名不同之外&#xff0c;其他个人信息完全相同。 订单类 …

DASCTF 2023 0X401七月暑期挑战赛RE题解

比赛期间没有什么时间&#xff0c;赛后做的题。 TCP 这题最难&#xff0c;耗时最久&#xff0c;好像做出来的人不多。 程序开始有个初始化随机数的过程&#xff0c;数据写入qword_5060开始的48个字节。 这里是主函数&#xff0c;连接到服务器以后&#xff0c;先接收32个字节…

c函数学习

函数的概念 函数是c语言的功能单位&#xff0c;实现一个功能可以封装一个函数来实现。定义函数的时候一切以功能为目的&#xff0c;根据功能去定义函数的参数和返回值 函数的分类 从定义角度分类&#xff1a;库函数&#xff08;c库实现的&#xff09;&#xff0c;自定义函数&…