多目标灰狼算法(MOGWO)的Matlab代码详细注释及难点解释

目录

一、外部种群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_numfor j=1:nVarp1=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==1X=G.*(ub-lb)+lb;
end% If each variable has a different lb and ub
if Boundary_no>1for i=1:nVarub_i=ub(i);lb_i=lb(i);X(:,i)=G(:,i).*(ub_i-lb_i)+lb_i;end
endMaxIt=100;  % 最大迭代次数
Archive_size=100;   % 存档规模
alpha=0.1;  % 网格膨胀因子
nGrid=10;   % 每一维上的网格数
beta=4;     % 领导者选择压力因子
gamma=2;    % 额外的(待删除)存档个体选择压力
% 初始化
GreyWolves=CreateEmptyParticle(GreyWolves_num);
for i=1:GreyWolves_numGreyWolves(i).Velocity=0;GreyWolves(i).Position=zeros(1,nVar);for j=1:nVarGreyWolves(i).Position(1,j)=unifrnd(lb(j),ub(j),1); %随机生成变量范围内值endGreyWolves(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:MaxIta=2-it*((2)/MaxIt);     %a从2线性减小到0for i=1:GreyWolves_num  %对于每个搜索个体     clear rep2clear 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后的存档endendBeta=SelectLeader(rep2,beta); %在排除Delta后的存档中用轮盘赌法选择Betaend  .
.
.
.
.
.
.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:mocc_cell_member_count(k)=sum(GridIndices==occ_cell_index(k)); %计算小网格上解数量end    
endfunction i=RouletteWheelSelection(p)r=rand;c=cumsum(p);            %累计概率i=find(r<=c,1,'first'); %r首次<=c的第几个值
endfunction 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=[f1f2];
endfunction 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=[f1f2];
endfunction 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=[f1f2];
endfunction z=ZDT4(x)
n=numel(x);
f1=x(1);
sum=0;
for i=2:nsum = 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=[f1f2];
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.mzph.cn/news/5578.shtml

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

相关文章

Vue第六篇:电商网站图片放大镜功能

本文参考&#xff1a;https://blog.csdn.net/liushi21/article/details/127497487 效果如下&#xff1a; 功能实现分解如下&#xff1a; &#xff08;1&#xff09;商品图区域&#xff1a;主要是浏览图片&#xff0c;根据图片的url显示图片。当鼠标离开此区域时"放大镜区…

ES6解构对象、数组、函数传参

目录 1.对象解构 2.对象解构的细节处理 2.1.解构的值对象中不存在时 2.2.给予解构值默认参数 2.3.非同名属性解构 3.数组解构 3.1基础解构语法 3.2数组嵌套解构 4.函数解构传参 5.解构小练习 在ES6的新语法中新增了解构的方法&#xff0c;它可以让我们很方便的从数组或…

每天五分钟机器学习:多项式非线性回归模型

本文重点 在前面的课程中,我们学习了线性回归模型和非线性回归模型的区别和联系。多项式非线性回归模型是一种用于拟合非线性数据的回归模型。与线性回归模型不同,多项式非线性回归模型可以通过增加多项式的次数来适应更复杂的数据模式。在本文中,我们将介绍多项式非线性回…

关于Arduino IDE库文件存放路径问题总结(双版本)

在开发过程中,如果不注意,库文件存放路径很乱,如果在转移系统环境时,容易忘记备份。编译过程中出现多个可用引用包的位置,为了解决这些问题,要明白各文件夹的默认路径在哪,区别在哪,如有了解不对的地方请指正。 IDE安装目录(默认C盘,自定义可以其他盘符下)IDE升级可…

IDEA如何打包springboot成jar包,并运行、停止、重启,本地依赖不能打包怎么办

1、将springboot项目打包成jar 第一步 这里要注意依赖的包的导入&#xff0c;有pom.xml中网络依赖导入&#xff0c;有的包是本地依赖导入&#xff0c;本地依赖的包只需在pom.xml加入一下代码即可&#xff01; <dependency><groupId>jacob</groupId>//名称…

eclipse中经常遇到的maven相关的问题

maven工程依赖的jar包无法部署到tomcat中 右键maven工程&#xff0c;选择“属性” 将工程在tomcat重新发布即可。 2、Update Project or use Quick Fix maven工程总是提示更新&#xff0c;一更新java版本又回到1.5 在pom.xml添加如下&#xff1a; <build><finalN…

rabbitmq是什么?rabbitmq安装、原理、部署

rabbitmq是什么&#xff1f; MQ的全称是Messagee Queue&#xff0c;因为消息的队列是队列&#xff0c;所以遵循FIFO 先进先出的原则是上下游传递信息的跨过程通信机制。 RabbitMQ是一套开源&#xff08;MPL&#xff09;新闻队列服务软件由 LShift 提供的一个 Advanced Messag…

量子计算机操作系统介绍

下载&#xff1a;https://m.originqc.com.cn/zh 为量子计算编程而生的一站式学习与开发平台&#xff0c;提供量子编程开发环境&#xff0c;支持量子计算资源随时调用&#xff0c;支持量子应用打开即用。 产品特点 无需安装配置 PilotOS客户端集成量子编程开发环境所需的Pyt…

前端对后端路径的下载//流文件下载

1.前端对后端路径的下载 2.流文件下载

【git基本使用】

初识git 一、git安装 1.1 Linux-centos 如果你的的平台是centos&#xff0c;安装git相当简单&#xff0c;以我的centos7.6为例&#xff1a; ⾸先&#xff0c;你可以试着输⼊Git&#xff0c;看看系统有没有安装Git&#xff1a; git-bash: git: command not found 出现像上⾯…

MYSQL练习一答案

练习1答案 构建数据库 数据库 数据表 answer开头表为对应题号答案形成的数据表 表结构 表数据 答案&#xff1a; 1、查询商品库存等于50的所有商品&#xff0c;显示商品编号&#xff0c;商 品名称&#xff0c;商品售价&#xff0c;商品库存。 SQL语句 select good_no,good…

【树上操作】定长裁剪 CF1833 G

Problem - G - Codeforces 题意&#xff1a; 给定一棵n个节点的树&#xff0c;请你减掉一些边&#xff0c;使得剪掉后的每个树只有三个节点&#xff0c; 如果可以&#xff0c;第一行返回减掉边的数量&#xff0c;第二行返回减掉边的编号&#xff1b;如果无解&#xff0c;输出…

Redis的内存回收与内存淘汰策略

对于redis这样的内存型数据库而言&#xff0c;如何删除已过期的数据以及如何在内存满时回收内存是一项很重要的工作。 常见的redis内存回收的工作主要分为两个方面&#xff1a; 清理过期的key在内存不足时回收到足够的内存用以存储新的key 清理过期的key 我们很少在redis中…

Cesium态势标绘专题-普通点(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

[golang gin框架] 40.Gin商城项目-微服务实战之Captcha验证码微服务

本次内容需要 gin框架基础知识, golang微服务基础知识才能更好理解 一.Captcha验证码功能引入 在前面,讲解了微服务的架构等,这里,来讲解前面商城项目的 Captcha验证码 微服务 ,captcha验证码功能在前台,后端 都要用到 ,可以把它 抽离出来 ,做成微服务功能 编辑 这个验证码功能…

《零基础入门学习Python》第063讲:论一只爬虫的自我修养11:Scrapy框架之初窥门径

上一节课我们好不容易装好了 Scrapy&#xff0c;今天我们就来学习如何用好它&#xff0c;有些同学可能会有些疑惑&#xff0c;既然我们懂得了Python编写爬虫的技巧&#xff0c;那要这个所谓的爬虫框架又有什么用呢&#xff1f;其实啊&#xff0c;你懂得Python写爬虫的代码&…

20 QTreeWidget控件

代码&#xff1a; //treeWidget树控件//1&#xff1a;设置头部标签 QStringList()匿名对象创建ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄介绍");//2&#xff1a;设置itemQTreeWidgetItem * liItem new QTreeWidg…

Linux 系统中异常与中断

文章目录 异常与中断的关系中断的处理流程异常向量表Linux 系统对中断的处理ARM 处理器程序运行的过程程序被中断时&#xff0c;怎么保存现场Linux 系统对中断处理的演进Linux 对中断的扩展&#xff1a;硬件中断、软件中断硬件中断软件中断 中断处理原则&#xff1a;耗时中断的…

【面试题】万字总结MYSQL面试题

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 1、三大范式 2、DML 语句和 DDL 语句区别 3、主键和外键的区别 4、drop、delete、truncate 区别 5、基础架构 6、MyISAM 和 InnoDB 有什么区别&#xff1f; 7、推荐自增id作为…

【C++】STL---list基本用法介绍

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…