多目标粒子群算法及其MATLAB实现

多目标粒子群优化(Multi-Objective Particle Swarm Optimization, MOPSO)算法是一种基于种群的优化算法,它结合了粒子群优化(Particle Swarm Optimization, PSO)和多目标优化的思想。多目标粒子群(MOPSO)算法是由CarlosA. Coello Coello等在2004年提出来的。

以下是对多目标粒子群算法流程的另一种表达方式:

(1) 粒子速度更新机制

粒子速度的更新是基于三个关键组成部分:

  • 惯性部分:它保持了粒子先前的运动方向和速度,有助于粒子保持其运动惯性。
  • 个体认知部分:反映了粒子向其个体历史最佳位置的趋近,体现了粒子的自我学习和调整能力。
  • 社会认知部分:体现了粒子向整个群体中的最佳位置(全局最优)的趋近,反映了粒子间的社会学习和协作。

(2) 粒子位置更新

粒子根据更新后的速度调整其位置,这个过程是粒子在搜索空间中进行探索和寻找更优解的关键步骤。

(3) 个体历史最优位置pbest的选择

对于每个粒子,算法会比较其当前目标函数值和个体历史最优位置的目标函数值。如果两者互不支配,即没有一个在所有目标上都优于另一个,则随机选择一个作为新的历史最优。若存在支配关系,则选择支配的解作为新的历史最优。

(4) 全局最优位置gbest的选择

在多目标优化中,全局最优不是单一的解,而是一组非支配解。MOPSO算法根据非支配解集中的拥挤程度来选择一个全局领导者。选择过程倾向于那些位于较不拥挤区域的粒子,以增加对未知区域的探索。选择概率与粒子的拥挤程度成反比,即粒子所处位置越拥挤,被选择的概率越低。

(5) 非支配解集的更新

在每次迭代后,非支配解集都会进行更新,以确保它包含当前种群中的最佳非支配解。更新过程包括三个步骤:

  1. 初步筛选:首先,根据支配关系去除劣解,只保留非被支配的解,并将它们加入到非支配解集中。
  2. 内部筛选:在非支配解集内部再次根据支配关系进行筛选,进一步去除可能的劣解,并确定每个粒子在网格中的位置。
  3. 数量控制:如果非支配解集的数量超过了设定的阈值,算法会根据自适应网格方法进行筛选,以减少非支配解的数量,直到满足数量限制。随后,重新进行网格划分以适应新的非支配解集。

总体流程图如下:

完整代码见: https://download.csdn.net/download/corn1949/89218695

MATLAB主程序部分代码如下:


%% 多目标粒子群算法

% 清除所有变量,关闭所有图形窗口,关闭所有警告信息
clc; close all; clear all; warning off;

% 设置随机数生成器的种子,以确保结果的可重复性
rand('seed', 100);
randn('seed', 100);

% 设置数值显示格式为长精度科学计数法
format long g;

% 定义变量的下界和上界
lb = -4 * ones(1, 5);
ub = 4 * ones(1, 5);

% 定义速度的下界和上界
vlb = (ub - lb) * -0.05;
vub = (ub - lb) * 0.05;

% 获取变量的维度
dimension = length(lb);

% 定义问题的目标数(这里设置为2,表示有两个优化目标)
N = 2;

%% 多目标粒子群算法参数设置

% 种群大小
popsize = 50;

% 帕累托集的大小
nRep = 20;

% 最大迭代次数
maxgen = 100;

% 定义算法中的一些参数
phi1 = 2.05;
phi2 = 2.05;
phi = phi1 + phi2;
chi = 2 / (phi - 2 + sqrt(phi^2 - 4 * phi));
w = chi;  % 惯性权重
wdamp = 1;  % 惯性权重阻尼比
c1 = chi * phi1;  % 个体学习系数
c2 = chi * phi2;  % 全局学习系数
alpha = 0.1;  % 网格膨胀参数
nGrid = 10;  % 每一维的网格数
beta = 4;  % 选择压力参数
gamma = 2;  % 帕累托集选择被删除的压力参数

%% 初始化粒子群

% 生成初始粒子和速度
[psomat, vmat] = genchrom(popsize, dimension, lb, ub, vlb, vub);
particle = CreateEmptyParticle(popsize);

% 初始化每个粒子的速度、位置、成本和最佳位置
for i = 1:popsize
    particle(i).Velocity = vmat(i, :);
    particle(i).Position = psomat(i, :);
    particle(i).Cost = myfun(particle(i).Position);
    particle(i).Best.Position = particle(i).Position;
    particle(i).Best.Cost = particle(i).Cost;
end

% 确定粒子间的支配关系
particle = DetermineDomination(particle);

% 获取非支配粒子
rep = GetNonDominatedParticles(particle);
rep_costs = GetCosts(rep);

% 创建超立方体网格
G = CreateHypercubes(rep_costs, nGrid, alpha);

% 为每个非支配粒子分配网格索引
for i = 1:numel(rep)
    [rep(i).GridIndex rep(i).GridSubIndex] = GetGridIndex(rep(i), G);
end

% 初始化记录每代最佳和平均成本的矩阵
trace_best_mat = zeros(maxgen, N);
trace_mean_mat = zeros(maxgen, N);

%% MOPSO主循环

wait_hand = waitbar(0, 'running...', 'tag', 'TMWWaitbar');
for gen = 1:maxgen
    for i = 1:popsize
        % 选择领导者粒子
        rep_h = SelectLeader(rep, beta);
        
        % 更新粒子的速度
        V = particle(i).Velocity;
        V = w * V + c1 * rand * (particle(i).Best.Position - particle(i).Position) + c2 * rand * (rep_h.Position - particle(i).Position);
        V = limitspeed(V, vlb, vub, dimension);
        particle(i).Velocity = V;
        
        % 更新粒子位置
        p = particle(i).Position;
        p = p + V;
        p = limitposition(p, lb, ub, dimension);
        particle(i).Position = p;
        particle(i).Cost = myfun(particle(i).Position);
        
        % 更新粒子的最佳位置
        if Dominates(particle(i), particle(i).Best)
            particle(i).Best.Position = particle(i).Position;
            particle(i).Best.Cost = particle(i).Cost;
        elseif ~Dominates(particle(i).Best, particle(i)) && rand < 0.5
            particle(i).Best.Position = particle(i).Position;
            particle(i).Best.Cost = particle(i).Cost;
        end
    end
    
    % 确定粒子间的支配关系,并获取非支配粒子
    particle = DetermineDomination(particle);
    nd_particle = GetNonDominatedParticles(particle);
    rep = [rep; nd_particle];
    rep = DetermineDomination(rep);
    rep = GetNonDominatedParticles(rep);
    
    % 为每个非支配粒子分配网格索引
    for i = 1:numel(rep)
        [rep(i).GridIndex rep(i).GridSubIndex] = GetGridIndex(rep(i), G);
    end
    
    % 如果非支配解的数量超过了设定的帕累托集大小,则进行删除操作
    if numel(rep) > nRep
        EXTRA = numel(rep) - nRep;
        rep = DeleteFromRep(rep, EXTRA, gamma);
        rep_costs = GetCosts(rep);
        G = CreateHypercubes(rep_costs, nGrid, alpha);
    end
    
    % 更新惯性权重
    w = w * wdamp;
    
    % 记录每代的最佳和平均成本
    costs20gen=GetCosts(particle);
    % trace_best_mat(gen,:)=min(costs20gen');
    if gen==1
        trace_best_mat(gen,:)=min(costs20gen');
    else
        vminmat=min(costs20gen');
        vminmat2=trace_best_mat(gen-1,:);
        trace_best_mat(gen,:)=trace_best_mat(gen-1,:);
        mat301=vminmat-vminmat2;
        h301= mat301<0;
        trace_best_mat(gen,h301)=vminmat(h301);
    end
    trace_mean_mat(gen,:)=mean(costs20gen');
    
    waitbar(gen/maxgen,wait_hand);
end
delete(wait_hand);
%% 输出结果

costs=GetCosts(particle);
rep_costs=GetCosts(rep);





程序结果如下:

非支配解

paretomat =

      -0.00227284102228413        0.0712188161550257       -0.0163216279512607        0.0223268028879513          0.03405075873276
      -0.00978636830453622         0.170156524714462      -0.00723451433058267        0.0182846191284416        0.0771681625528947
       -0.0176101654801064       -0.0159523975594723      -0.00302200380115747      -0.00849832458300534       -0.0324966912535463
       -0.0419332201068704        0.0746825423487237       -0.0563764778122908       -0.0524243448303948       -0.0229788168721254
       -0.0554839057394384       -0.0989784771813438       -0.0262242055862137        0.0297280418138594     -0.000227264370436242
       -0.0776369060456135       0.00216881072591707       -0.0702366970770566        -0.102944631440041        -0.217642861858831
       -0.0800190754495594        0.0233548532432994        -0.131623720484054       -0.0668297989337753       -0.0185859224973561
       -0.0983626982392394        -0.048037643077243       -0.0692611671055516       -0.0529905948017304       -0.0609328036656522
        -0.105760339390864       -0.0347358884736846       -0.0892373267932827       -0.0545751682409862        0.0407188033358694
        -0.125033787402079        -0.131232202936618        -0.141447071858335        -0.172444620296566        -0.168915834021728
        -0.188399920778113        -0.119726577587646        -0.197052439456695        -0.139812180253481        -0.111490249458453
        -0.189019350743697        -0.144860818694586        -0.192348693379104        -0.179658414736104        -0.141473793690724
        -0.214940684352413        -0.190635157923252        -0.180726899336942        -0.182491821843856        -0.155094670744462
        -0.224468241501541        -0.227546563527362        -0.260585401957969        -0.265522548982672        -0.233156930268307
        -0.259084486658183        -0.195921556728781         -0.29153143335854        -0.231227768412947        -0.176736149549026
        -0.385640587641675        -0.405131975319977        -0.383266402124398        -0.378920251924422        -0.362410294125239
        -0.409708206256663        -0.232258263008486        -0.383276198073093        -0.387622420293001        -0.404531363301304
        0.0266622627949854        0.0199937608076338           0.1020344140958          0.16462373320381         0.335206887783278
         0.029252090464726         0.040560254090536        0.0582231007878223        0.0772952250813304        0.0143580767172984
        0.0523711335156912       0.00916152080864516         0.104635526130941        0.0906404136369576         0.129224191514728
        0.0634041083085849         0.111252555481021        0.0695940580687484        0.0953555138623883         0.124797310908963
        0.0768012955752901        0.0888719244083341         0.076244376622001        0.0273308115915742        0.0763923948232536
        0.0773288220286295        0.0534328982763007          0.12090850599578          0.14178695686211         0.124222179286853
        0.0867509132221776        0.0699405325222435         0.125072236606695        0.0312453154029308        0.0272014961143899
         0.089475649803505        0.0291507738967921        0.0765259423071948        0.0147511082690438        0.0909264711466479
         0.148789021129548         0.161174452260867         0.166142427712131         0.173501657183426         0.196366758068039
         0.151315789987184        0.0688968682546646         0.200197186970212         0.103900972227278        0.0378663627411232
         0.157245805067246          0.15882761519839         0.185975998293083         0.130233154440741         0.188752564844483
          0.16142983238422         0.195238405764086         0.194463073952494          0.16959756042971        0.0874732116423768
          0.22245205415835         0.269650371838859         0.224140784075583         0.246205835016685         0.274971785453224
         0.225154322749349         0.208181362098171         0.249976110858735         0.278973450904965         0.177928756027206
         0.230231006144887         0.235171902542444         0.266234156364099         0.274764469150482         0.174615593267893
         0.236626509303455         0.236665306073303         0.256782832006794         0.296167489627297         0.305962623989305
           0.2477228921018         0.298320394377546         0.289268192825444         0.315014091405021         0.352339375907663
         0.266947443396633         0.324382171096344         0.328350838090562         0.335921585226187         0.235513723671755
         0.278973420929827         0.304392708688683         0.282276552822378         0.289283667760178         0.293413794959001
         0.292384979308659         0.284785782539692         0.339886915529597         0.313743643095613         0.320354289049389
         0.363243384937082         0.379846924117677         0.351984258497255         0.331709064688054         0.347154150516659
         0.518632240891831          0.52936147168219         0.498201970418901         0.474523098342005         0.397491700185792

>> 

 完整代码见: https://download.csdn.net/download/corn1949/89218695

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

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

相关文章

DevOps(八)Jenkins的Maven和Git插件

一、Maven简介 Maven是一个构建生命周期管理和理解工具&#xff0c;用于Java项目。它提供了标准化的构建流程&#xff0c;并简化了从项目编译到文档生成等各种构建方面的管理。 Maven是由Apache软件基金会开发和维护的一个流行的项目管理工具。它的设计目的是简化Java项目的构…

PE结构(二)PE头字段说明

PE头字段 DOS头 PE标记 标准PE头 可选PE头 我们今天分析一下PE头字段中所有重要成员的含义 DOS头 DOS头中我们需要去分析的是如下两个成员&#xff1a; 1.WORD e_magic&#xff1a;MZ标记&#xff0c;用于判断是否为可执行文件&#xff0c;即如果显示4D 5A&#xff0c;…

[2021年最新]国产时序性数据TDenige入门

一、TDenige简介 TDengine&#xff1a;是涛思数据面对高速增长的物联网大数据市场和技术挑战推出的创新性的大数据处理产品&#xff0c;它不依赖任何第三方软件&#xff0c;也不是优化或包装了一个开源的数据库或流式计算产品&#xff0c;而是在吸取众多传统关系型数据库、NoS…

图搜索的经典启发式算法A星(A*、A Star)算法详解

文章目录 1. 引言2. 广度优先搜索3. Dijkstra 算法4. 启发式优先搜索&#xff08;Heuristic&#xff09;4.1 贪心最佳优先搜索4.2 A*搜索 1. 引言 在许多场景中&#xff0c;我们常会遇到一类问题&#xff0c;即“找到一个位置到另一个位置的距离最短&#xff08;用时最少&…

ELK 日志分析系统(二)

一、ELK Kibana 部署 1.1 安装Kibana软件包 #上传软件包 kibana-5.5.1-x86_64.rpm 到/opt目录 cd /opt rpm -ivh kibana-5.5.1-x86_64.rpm 1.2 设置 Kibana 的主配置文件 vim /etc/kibana/kibana.yml --2--取消注释&#xff0c;Kiabana 服务的默认监听端口为5601 server.po…

ubuntu 24.04 beta server NAT模式上网设置

在Ubuntu 24.04 Beta上设置网络通常涉及使用命令行工具。以下是设置静态IP地址和动态IP地址的步骤&#xff1a; 动态IP设置&#xff1a; 查找你的网络接口名称&#xff1a; ip a ens37是我NAT模型的一张网卡&#xff0c;此时是没有ip的。 下面介绍如何NAT模式下添加DHCP动态…

Maven多模块快速升级超好用Idea插件-MPVP

功能&#xff1a;多模块maven项目快速升级指定版本插件&#xff0c;并提供预览和相关升级模块日志能力。 可快速进行版本升级&#xff0c;进行部署到Maven仓库。 安装&#xff1a; 可在idea插件中心进行安装 / 下载资源拖动安装 MPVP(Maven) - IntelliJ IDEs Plugin | Marke…

node.js 解析post请求 方法一

前提&#xff1a;依旧以前面发的node.js服务器动态资源处理代码 具体见 http://t.csdnimg.cn/TSNW9为模板&#xff0c;在这基础上进行修改。与动态资源处理代码不同的是&#xff0c;这次的用户信息我们借用表单来实现。post请求解析来获取和展示用户表单填写信息 1》代码难点&…

快速新建springboot项目

一、初始化 1.打开IDEA&#xff0c;在Spring initializer这里按照下图项目进行配置。注意&#xff1a;如果jdk是1.8建议将Server URL这里替换为图中的阿里云服务器&#xff0c;否则容易找不到对应的java8&#xff0c;然后点击next 2.在这里提前配置一些需要使用的依赖&#xf…

Linux上部署Jupyter notebook

安装jupyter notebook pip install notebook #或者 conda install notebook配置 jupyter notebook --generate-config## The IP address the notebook server will listen on. # Default: localhost # 设置可以访问的ip, 默认是localhost, 将其改为 * c.NotebookApp.ip *#…

CMakeLists.txt中如何添加编译选项?

1. 引子 编译器有多种可供选择&#xff0c;如g、c、clang等&#xff0c;如下以c作为示例。 2. 使用CMAKE_CXX_FLAGS添加编译选项 在Makefile中可能用类似如下的指令来添加编译选项&#xff1a; /usr/bin/c -Wall -Wextra -Wno-sign-compare -Wno-unused-variable -Wno-unuse…

LLM大语言模型(十三):ChatGLM3-6B兼容Langchain的Function Call的一步一步的详细转换过程记录

# LangChain&#xff1a;原始prompt System: Respond to the human as helpfully and accurately as possible. You have access to the following tools: Calculator: Useful for when you need to calculate math problems, args: {\calculation\: {\description\: \calcul…

云安全防御篇:如何识别并做好服务器DDoS防护?

伴随着全球互联网业务和云计算的快速发展&#xff0c;作为一种破坏力巨大的攻击方式&#xff0c;DDoS攻击正以超出服务器承受能力的流量淹没网站&#xff0c;导致服务器宕机、企业营业额下跌&#xff0c;甚至企业品牌形象受损。越是面对复杂的攻击&#xff0c;就需要性能更强的…

linux安装nacos(单机简易版本)

1. 查看Java版本&#xff0c;必须有jdk支持 2. 下载安装包&#xff0c;解压 下载地址&#xff1a; https://github.com/alibaba/Nacos/releases 2.1 上传到 /opt文件夹 2.2使用解压命令 tar -zxvf nacos-server-2.2.1.tar.gz 2.3 解压后产生文件夹 3. 配置 3.1 修改配置&…

牛客NC98 判断t1树中是否有与t2树完全相同的子树【simple 深度优先dfs C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/4eaccec5ee8f4fe8a4309463b807a542 思路 深度优先搜索暴力匹配 思路和算法这是一种最朴素的方法——深度优先搜索枚举 s 中的每一个节点&#xff0c;判断这个点的子树是否和 t 相等。如何判断一个节点的子树是否…

zabbix6.4告警配置(短信告警和邮件告警),脚本触发

目录 一、前提二、告警配置1.邮件告警脚本配置2.短信告警脚本配置3.zabbix添加报警媒介4.zabbix创建动作4.给用户添加报警媒介 一、前提 已经搭建好zabbix-server 在需要监控的mysql服务器上安装zabbix-agent2 上述安装步骤参考我的上篇文章&#xff1a;通过docker容器安装za…

WEP、WPA、WPA2 和 WPA3:区别和说明

无线网络安全是保持在线安全的一个重要因素。通过不安全的链路或网络连接到互联网是一种安全风险&#xff0c;可能会导致数据丢失、帐户凭据泄露&#xff0c;以及他人在您的网络上安装恶意软件。必须使用适当的 Wi-Fi 安全措施 - 但在这样做时&#xff0c;也必须了解不同的无线…

[Linux初阶]常见的指令

我们学Linux指令&#xff0c;其实就是和学windows一样&#xff0c;学习Linux的操作 一、Linux下基本指令 ls 指令 语法 &#xff1a; ls [ 选项 ] [ 目录或文件 ] 功能 &#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出…

就业班 第三阶段(负载均衡) 2401--4.19 day3

二、企业 keepalived 高可用项目实战 1、Keepalived VRRP 介绍 keepalived是什么keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 ​ keepalived工作原理keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundan…

装饰模式【结构型模式C++】

1.概述 装饰模式是一种结构型设计模式&#xff0c; 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 2.结构 抽象构件&#xff08;Component&#xff09;角色&#xff1a;定义一个抽象接口以规范准备接收附加责任的对象。具体构件&#xff08;Concrete…
最新文章