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

目录

一、外部种群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);  

        % 如果在最不拥挤的超立方体中少于三个解,也会找到第二个不拥挤的超立方体来选择其它领导者
       
        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。          

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能】大模型平台新贵——文心千帆

个人主页&#xff1a;【&#x1f60a;个人主页】 &#x1f31e;热爱编程&#xff0c;热爱生活&#x1f31e; 文章目录 前言大模型平台文心千帆发布会推理能力模型微调 作用 前言 在不久的之前我们曾讨论过在ChatGPT爆火的大环境下&#xff0c;百度推出的“中国版ChatGPT”—文…

【C++】STL使用仿函数控制优先级队列priority_queue

文章目录 前言一、priority_queue的底层实现二、使用仿函数控制priority_queue的底层总结 前言 本文章讲解CSTL的容器适配器&#xff1a;priority_queue的实现&#xff0c;并实现仿函数控制priority_queue底层。 一、priority_queue的底层实现 priority_queue叫做优先级队列&…

C进阶:文件操作

C语言文件操作 什么是文件 磁盘上的数据是文件。 但是在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件&#xff08;例如.c,.h这一类编译&#xff0c;链接过程中的文件&#xff09;&#xff0c;数据文件。 程序文件 包括源程序文件&#xff08;后缀为.c&…

【PostgreSQL内核学习(十)—— 查询执行(可优化语句执行)】

可优化语句执行 概述物理代数与处理模型物理操作符的数据结构执行器的运行 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在适用的情况下注明引用来源。 本文主要…

macOS系统下编译linux-adk源码

1.下载 linux-adk源码 https://github.com/gibsson/linux-adk.git 2.安装libusb库 brew install libusb 3.修改Makefile CFLAGS += -Isrc -I/usr/local/Cellar/libusb/1.0.26/include/libusb-1.0 4.编译 make ./linux-adk -h 查看用法 查看系统已连接USB设备 system_p…

C#使用Linq和Loop计算集合的平均值、方差【标准差】

方差【标准差】 标准差公式是一种数学公式。标准差也被称为标准偏差&#xff0c;或者实验标准差&#xff0c;公式如下所示&#xff1a; 样本标准差方差的算术平方根ssqrt(((x1-x)^2 (x2-x)^2 ......(xn-x)^2)/n) 总体标准差σsqrt(((x1-x)^2 (x2-x)^2 ......(xn-x)^2)/n ) …

win11我们无法创建新的分区也找不到现有的分区

U盘重装系统的时候 提示&#xff1a;win11我们无法创建新的分区也找不到现有的分区 ShiftF10 &#xff0c;调出 命令提示符&#xff1b; diskpart list disk select disk 盘编号 clean convert gpt 参考&#xff1a;怎么解决我们无法创建新的分区也找不到现有的分区问题&#x…

OpenCV实现照片换底色处理

目录 1.导言 2.引言 3.代码分析 4.优化改进 5.总结 1.导言 在图像处理领域&#xff0c;OpenCV是一款强大而广泛应用的开源库&#xff0c;能够提供丰富的图像处理和计算机视觉功能。本篇博客将介绍如何利用Qt 编辑器调用OpenCV库对照片进行换底色处理&#xff0c;实现更加…

HTTP 缓存机制 强制缓存/协商缓存

为什么被缓存&#xff0c;如何命中缓存以及缓存什么时候生效的&#xff0c;我们却很少在实际开发中去了解。借助动画形式来从根上理解 HTTP 缓存机制及原理。 HTTP 缓存&#xff0c;对于前端的性能优化方面来讲&#xff0c;是非常关键的&#xff0c;从缓存中读取数据和直接向服…

REST和RPC的区别

1 REST REST 不是一种协议&#xff0c;它是一种架构。大部分REST的实现中使用了RPC的机制&#xff0c;大致由三部分组成&#xff1a; method&#xff1a;动词&#xff08;GET、POST、PUT、DELETE之类的&#xff09;Host&#xff1a;URI&#xff08;统一资源标识&#xff09;&…

前端Vue uni-app App/小程序/H5 通用tree树形结构图

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。 通过组件化开发&#xff0c;可以有效实现…

Apple M1 Pro macOS 切换中文输入法卡住

(macOS 在切换中文输入法时出现卡住的情况 1&#xff0c;切换为中文输入法后再次卡住2&#xff0c;杀死 简体中文输入方式的进程参考 将光标移到菜单栏的输入法切换为英文输入法 多次切换为英文输入法&#xff0c;可以切换为英文输入法 切换为英文输入法后电脑不卡顿了&#xf…

云原生基础设施实践:NebulaGraph 的 KubeBlocks 集成故事

像是 NebulaGraph 这类基础设施上云&#xff0c;通用的方法一般是将线下物理机替换成云端的虚拟资源&#xff0c;依托各大云服务厂商实现“服务上云”。但还有一种选择&#xff0c;就是依托云数据基础设施&#xff0c;将数据库产品变成为云生态的一环&#xff0c;不只是提供自身…

《面试1v1》如何提高远程用户的吞吐量

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

【单调栈 +前缀和】AcWing 4738. 快乐子数组

原题链接 原题链接 相关算法概念介绍 前缀和&#xff08;Prefix Sum&#xff09; 前缀和是指将数组中从开头位置到当前位置的所有元素累加得到的新数组。通常&#xff0c;我们使用一个额外的数组来保存这些累加和&#xff0c;这个数组被称为前缀和数组。对于原始数组A&…

性能测试Ⅵ(总结)

locust&#xff1a;是基于Python语言的性能测试工具&#xff0c;它是基于协程的思想来进行设计的。Python语言是没有办法利用多核的优势&#xff0c;所以了Python为了解决这个问题&#xff0c;设计了协程&#xff0c;作为协程的任务&#xff0c;遇到IO堵塞就立刻切换。 生命是协…

项目初始化--uniapp--vscode--vue3--ts

HBuilderX 创建 uni-app 项目 注意开启服务端口 目录结构 ├─pages 业务页面文件存放的目录 │ └─index │ └─index.vue index页面 ├─static 存放应用引用的本地静态资源的目录(注意&#xff1a;静态资源只能存放于此) ├─unpackage …

Ceph 应用

Ceph 应用 一、创建 CephFS 文件系统 MDS 接口 1.服务端操作 1&#xff09;在管理节点创建 mds 服务 cd /etc/ceph ceph-deploy mds create node01 node02 node032&#xff09;查看各个节点的 mds 服务 ssh rootnode01 systemctl status ceph-mdsnode01 ssh rootnode02 syst…

代码随想录| 图论02●695岛屿最大面积 ●1020飞地的数量 ●130被围绕的区域 ●417太平洋大西洋水流问题

#695岛屿最大面积 模板题&#xff0c;很快.以下两种dfs&#xff0c;区别是看第一个点放不放到dfs函数中处理&#xff0c;那么初始化的area一个是1一个是0 int dir[4][2]{0,1,0,-1,1,0,-1,0};void dfs(int x, int y,int n, int m, int &area,vector<vector<bool>…

K8S初级入门系列之十一-安全

一、前言 安全是K8S重要的特性&#xff0c;在K8S初级入门系列之四-Namespace/ConfigMap/Secret章节&#xff0c;我们已经已经了解了Namespace&#xff0c;Secret与安全相关的知识。本篇将梳理K8S在安全方面的策略。主要包括两个方面&#xff0c;API安全访问策略以及Pod安全策略…