多目标粒子群算法(MOPSO):原理讲解与代码实现 Matlab代码免费获取

        声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~

目录

粒子群算法

多目标粒子群算法

一、外部档案

二、突变算子

流程图

性能测评

完整代码


粒子群优化算法(PSO)是一种模拟鸟类觅食行为的算法,由Eberhart 和Kennedy 于1995年提出。这种算法因其操作简单、速度快等特点,在处理多目标优化问题时被广泛采用。多目标粒子群优化算法(MOPSO)由Carlos A. CoelloCoello 等人提出,旨在将传统的粒子群算法(PSO)扩展到多目标优化问题中。

MOPSO算法通过外部存档和Pareto支配基本原理来处理多个目标,具有适用范围广、设置参数少、优化结构简单的特点,在多个领域得到了广泛应用。相比于单目标算法,多目标算法考虑的内容更多,更容易受到审稿人的青睐。因此,本文将介绍该算法的原理与代码。

本期代码免费赠送,需要代码的小伙伴可直接拉到最后!

粒子群算法

作为群体智能演化算法,PSO模拟自然界中鸟类的觅食行为,将食物的位置类比为优化问题的最优解集,将鸟类的飞行方向与位置类比为粒子的速度和位置。根据全局最优(gBest)和个体历史最优(pBest)的信息交互,不断更新粒子的位置和速度,提高搜索效率、有效引导种群往PF方向收敛,但这也导致其可能陷入局部最优,其具体更新过程可以表示如下:

式中:Xi(t)为位置向量,Xi(t)=[xi1(t),xi2(t),…,xid(t)],Vi(t)为速度向量,Vi(t)=[vi1(t),vi2(t),…,vid(t)],Xi(t)和Vi(t)分别表示粒子i第t时刻的位置和速度,Xi(t+1)和Vi(t+1)分别为更新后的位置和速度;pBesti(t)和gBesti(t)分别表示粒子i在t时刻的历史最优位置和全局最优位置;w为惯性权重因子;c1和c2为大于零的加速因子;γ1, γ2∈[0,1]。

多目标粒子群算法

相比于刚刚的单目标粒子群算法,多目标粒子群算法MOPSO主要体现在两个方面的区别,一是外部档案,二是突变算子。

一、外部档案

外部档案即利用网格划分法对算法中的精英个体进行更新。首先,将目标空间划分为若干网格,任意一个网格都为考察对象,并计算外部存档内种群个体的适应度值;其次,计算每个网格内粒子个数,并将其作为分布密度,分布密度的倒数即为网格被选择概率,通过轮盘赌方式选择网格。最后,被选中的网格中随机确定精英个体位置。具体分为以下几个步骤:

1)目标空间划分

对目标空间进行划分时,需确定目标空间中每个维度的最大、最小边界(minFi ,maxFi)。通过边界计算网格的模,公式如下:

式中:Fi 为第 i 个维度的目标函数值, i =1,2, ……, n;M为第 i 个维度要划分的网格数。

2)计算网格内粒子数

遍历外部存档中的粒子,计算粒子所在网格编号。对于第i个粒子,通过公式(5)计算网格位置。

通过粒子编号可以确定粒子所处的网格位置,以此来确定,每个网格被选择的概率为

式中:Numk 为第 k 个网络的粒子数。

3)基于轮盘赌确定网格和猎物位置

通过轮盘赌方式确定网格。首先,需要将每个网格被选中的概率归一化处理,如下:

其次,计算各网格累积概率,如下: 

最后,通过生成随机数选择网格内的粒子。通过网格划分法确定猎物位置避免算法陷入局部最优的同时,为提升算法收敛速度,当种群超出边界时,算法不对个体直接赋边界值,而是超出界限的相应值赋予猎物位置,避免算法重复搜索边界位置。公式如下:

网格划分法基于划分网格内粒子数对网格进行选取,为算法提供了更优猎物位置使算法的Pareto前沿分布更加均匀。而且对超出搜索边界的个体位置选取返回猎物位置的更新方法而不是采取返回边界位置的更新方法,更加有效的提升了算法收敛速度。

二、突变算子

突变算子通过引入随机扰动,有效避免了粒子群陷入局部最优,提升了算法的全局搜索能力。均匀突变保证了随机性,而非均匀突变则随着迭代次数的增加逐渐减少突变程度,平衡了探索和开发的关系。

将粒子群分成三部分,分别是不进行突变、进行均匀突变和进行非均匀突变。

第一部分粒子不进行突变。

第二部分粒子,按照比例进行均匀突变,即随机改变一部分粒子的位置。均匀突变的粒子位置重新在搜索空间内生成。

第三部分粒子,进行非均匀突变,其突变程度随代数的增加而逐渐减小。

突变算子通过增加搜索空间的多样性以及不同类型的突变策略,保证算法在初期进行充分的探索,而在后期则逐渐收敛至最优解附近。

流程图

为了更清晰的展示PSO与MOPSO的流程,这边给出两个算法的流程图,非常清晰~

性能测评

为这边以三个多目标函数“ZDT1”、“ZDT3”、“Viennet2”为例,检测一下MOPSO的性能。图中有帕累托真实前沿,越靠近前沿面则代表效果越好。

ZDT1:

ZDT3:

Viennet2:

可以看到,绝大多数粒子都能够接近前沿面,但仍然有改进的空间~

完整代码

MOPSO完整代码如下:

function REP = MOPSO(params,MultiObj)
​% ParametersNp      = params.Np;Nr      = params.Nr;maxgen  = params.maxgen;W       = params.W;C1      = params.C1;C2      = params.C2;ngrid   = params.ngrid;maxvel  = params.maxvel;u_mut   = params.u_mut;fun     = MultiObj.fun;nVar    = MultiObj.nVar;var_min = MultiObj.var_min(:);var_max = MultiObj.var_max(:);
​% InitializationPOS = repmat((var_max-var_min)',Np,1).*rand(Np,nVar) + repmat(var_min',Np,1);VEL = zeros(Np,nVar);POS_fit  = fun(POS);if size(POS,1) ~= size(POS_fit,1)warning(['The objective function is badly programmed. It is not returning' ...'a value for each particle, please check it.']);endPBEST    = POS;PBEST_fit= POS_fit;DOMINATED= checkDomination(POS_fit);REP.pos  = POS(~DOMINATED,:);REP.pos_fit = POS_fit(~DOMINATED,:);REP      = updateGrid(REP,ngrid);maxvel   = (var_max-var_min).*maxvel./100;gen      = 1;
​% Plotting and verboseif(size(POS_fit,2)==2)h_fig = figure(1);h_par = plot(POS_fit(:,1),POS_fit(:,2),'or'); hold on;h_rep = plot(REP.pos_fit(:,1),REP.pos_fit(:,2),'ok'); hold on;tryset(gca,'xtick',REP.hypercube_limits(:,1)','ytick',REP.hypercube_limits(:,2)');axis([min(REP.hypercube_limits(:,1)) max(REP.hypercube_limits(:,1)) ...min(REP.hypercube_limits(:,2)) max(REP.hypercube_limits(:,2))]);grid on; xlabel('f1'); ylabel('f2');enddrawnow;endif(size(POS_fit,2)==3)h_fig = figure(1);h_par = plot3(POS_fit(:,1),POS_fit(:,2),POS_fit(:,3),'or'); hold on;h_rep = plot3(REP.pos_fit(:,1),REP.pos_fit(:,2),REP.pos_fit(:,3),'ok'); hold on;tryset(gca,'xtick',REP.hypercube_limits(:,1)','ytick',REP.hypercube_limits(:,2)','ztick',REP.hypercube_limits(:,3)');axis([min(REP.hypercube_limits(:,1)) max(REP.hypercube_limits(:,1)) ...min(REP.hypercube_limits(:,2)) max(REP.hypercube_limits(:,2))]);endgrid on; xlabel('f1'); ylabel('f2'); zlabel('f3');drawnow;axis square;enddisplay(['Generation #0 - Repository size: ' num2str(size(REP.pos,1))]);
​% Main MPSO loopstopCondition = false;while ~stopCondition
​% Select leaderh = selectLeader(REP);
​% Update speeds and positionsVEL = W.*VEL + C1*rand(Np,nVar).*(PBEST-POS) ...+ C2*rand(Np,nVar).*(repmat(REP.pos(h,:),Np,1)-POS);POS = POS + VEL;
​% Perform mutationPOS = mutation(POS,gen,maxgen,Np,var_max,var_min,nVar,u_mut);
​% Check boundaries[POS,VEL] = checkBoundaries(POS,VEL,maxvel,var_max,var_min);       
​% Evaluate the populationPOS_fit = fun(POS);
​% Update the repositoryREP = updateRepository(REP,POS,POS_fit,ngrid);if(size(REP.pos,1)>Nr)REP = deleteFromRepository(REP,size(REP.pos,1)-Nr,ngrid);end
​% Update the best positions found so far for each particlepos_best = dominates(POS_fit, PBEST_fit);best_pos = ~dominates(PBEST_fit, POS_fit);best_pos(rand(Np,1)>=0.5) = 0;if(sum(pos_best)>1)PBEST_fit(pos_best,:) = POS_fit(pos_best,:);PBEST(pos_best,:) = POS(pos_best,:);endif(sum(best_pos)>1)PBEST_fit(best_pos,:) = POS_fit(best_pos,:);PBEST(best_pos,:) = POS(best_pos,:);end
​% Plotting and verboseif(size(POS_fit,2)==2)figure(h_fig); delete(h_par); delete(h_rep);h_par = plot(POS_fit(:,1),POS_fit(:,2),'or'); hold on;h_rep = plot(REP.pos_fit(:,1),REP.pos_fit(:,2),'ok'); hold on;tryset(gca,'xtick',REP.hypercube_limits(:,1)','ytick',REP.hypercube_limits(:,2)');axis([min(REP.hypercube_limits(:,1)) max(REP.hypercube_limits(:,1)) ...min(REP.hypercube_limits(:,2)) max(REP.hypercube_limits(:,2))]);endif(isfield(MultiObj,'truePF'))try delete(h_pf); endh_pf = plot(MultiObj.truePF(:,1),MultiObj.truePF(:,2),'.','color','g'); hold on;endgrid on; xlabel('f1'); ylabel('f2');drawnow;axis square;endif(size(POS_fit,2)==3)figure(h_fig); delete(h_par); delete(h_rep); h_par = plot3(POS_fit(:,1),POS_fit(:,2),POS_fit(:,3),'or'); hold on;h_rep = plot3(REP.pos_fit(:,1),REP.pos_fit(:,2),REP.pos_fit(:,3),'ok'); hold on;tryset(gca,'xtick',REP.hypercube_limits(:,1)','ytick',REP.hypercube_limits(:,2)','ztick',REP.hypercube_limits(:,3)');axis([min(REP.hypercube_limits(:,1)) max(REP.hypercube_limits(:,1)) ...min(REP.hypercube_limits(:,2)) max(REP.hypercube_limits(:,2)) ...min(REP.hypercube_limits(:,3)) max(REP.hypercube_limits(:,3))]);endif(isfield(MultiObj,'truePF'))try delete(h_pf); endh_pf = plot3(MultiObj.truePF(:,1),MultiObj.truePF(:,2),MultiObj.truePF(:,3),'.','color','g'); hold on;endgrid on; xlabel('f1'); ylabel('f2'); zlabel('f3');drawnow;axis square;enddisplay(['Generation #' num2str(gen) ' - Repository size: ' num2str(size(REP.pos,1))]);
​% Update generation and check for terminationgen = gen + 1;if(gen>maxgen), stopCondition = true; endendhold off;
end

其中有部分函数封装为了子函数,因篇幅原因文章中无法全部放下。

因此,需要完整代码(能够运行出结果展示中的图片)的小伙伴因此,需要完整代码的小伙伴只需点击下方小卡片,再后台回复关键词,不区分大小写:

MOPSO

若有其他更多代码需求或免费代码,可查看链接:更多代码链接

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

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

相关文章

Android11 以Window的视角来看FallbackHome的启动

在WMS中,使用WindowState代表着一个Window并维护着一个Window的"层级树",每个Window需要按照"层级"的规则进行排列。对于FallbackHome,其Window是挂载在home task上,而home task挂载在DefaultTaskDisplayArea…

python之日志(三)--将捕获的异常写入日志中

1.日志级别 import logging #日志模块 #默认下只会从第3级开始打印 logging.debug(DEBUG级别) #1级 logging.info(INFO级别) #2级 logging.warning(WARNING级别) #3级 logging.error(ERROR级别) #4级 logging.critical(CRITICAL级别) #5级 默认第1和第2级的日志不会打印 …

解决 uniapp h5 页面在私有企微iOS平台 间歇性调用uni api不成功问题(uni.previewImage为例)。

demo <template><view class"content"><image class"logo" src"/static/logo.png"></image><button click"previewImage">预览图片</button></view> </template><script> //打…

React@16.x(32)useDebugValue

目录 1&#xff0c;介绍2&#xff0c;作用 1&#xff0c;介绍 从一个例子开始&#xff1a; export default function App() {const [n, setN] useState(0);const refH1 useRef();useEffect(() > {console.log("父组件");});return <h1 ref{refH1}>{n}&l…

使用 imu_utils 、Kalibr 工具进行IMU和相机内外参外参标定

文章目录 一、问题描述二、imu_utils 工具的使用1. 安装1.1 下载与编译1.2 编译bug解决 2. 标定 IMU2.1 imu bag包录制2.1.1 imu 数据格式2.1.2 imu 数据录制 2.2 imu 标定 三、Kalibr 工具的使用1. 安装1.1 下载与编译1.2 问题解决 一、问题描述 vins系列安装完成后&#xff…

EasyRecovery电脑数据恢复软件2024数据守护神#误删文件神器#硬盘恢复利器#数据丢失救星

&#x1f310; 你是否曾经因为误删文件、硬盘损坏等原因&#xff0c;失去了重要的数据&#xff1f;别担心&#xff0c;EasyRecovery电脑数据恢复软件是你的救星&#xff01;它能够帮你找回丢失的文件&#xff0c;让你的数据重新焕发生机。 &#x1f50d; EasyRecovery软件的核…

有关健身的俄语表达,柯桥零基础俄语培训

фитнес 健身 тренер 教练 абонемент 会员卡 аэробика 有氧运动 анаэробика 无氧运动 плавание 游泳 пробежка / бег трусцой 慢跑 беговая дорожка 跑步机 йога 瑜伽 коври…

持续学习的综述: 理论、方法与应用

摘要 为了应对现实世界的动态&#xff0c;智能系统需要在其整个生命周期中增量地获取、更新、积累和利用知识。这种能力被称为持续学习&#xff0c;为人工智能系统自适应发展提供了基础。从一般意义上讲&#xff0c;持续学习明显受到灾难性遗忘的限制&#xff0c;在这种情况下…

【Linux硬盘数据读取】WIN10访问linux分区解决方案:ext2fsd

<div id"content_views" class"htmledit_views" style"user-select: auto;"><p>尝试ext2explore、Paragon ExtFS都不好用&#xff0c;强烈安利ext2fsd&#xff0c;可读写&#xff0c;很强大</p> 转自&#xff1a;https://blog…

C++之模板(一)

1、为什么需要模板 将具有相同逻辑的一段代码提供一份模板&#xff0c;当我们需要处理不同类型的时候&#xff0c;可以通过数据类型当作参数来传递&#xff0c;从而实例化出对应类型的处理版本。 2、模板的定义 也是一种静态多态。 3、模板的分类 4、函数模板 5、函数模板的使…

-------------------------面试散文-----------------------------------

问题1&#xff1a;vue中动态引入图片&#xff0c;为什么使用require&#xff1f; 回答&#xff1a;因为动态添加的src 编译过后的文件地址和被编译过后的资源文件地址不一致&#xff0c;从而导致无法访问题 而使用require 返回的就是资源文件被编译后的文件地址&#xff0c;从…

Aeron:Aeron Agent

Aeron Agent 是一个 Java 代理&#xff0c;用于提供 Aeron、Aeron Archive 和 Aeron Cluster 中发生的运行时低级日志信息。这些日志语句包括从高级管理员事件到大容量数据帧事件。 在调试 Archive 和 Cluster 问题时&#xff0c;Aeron Agent 的日志数据尤其有用。 一、Availab…

本地无法连接linux上的MariaDB数据库

问题&#xff1a;本地用DBeaver无法连接服务器上的MariaDB数据库 &#xff1f; 测试1&#xff1a;在cmd中ping 服务器IP&#xff0c;看是否能ping通&#xff0c;能ping通&#xff0c;没有问题 测试2&#xff1a;在cmd中telnet 服务器IP 端口&#xff0c;看是否能访问&#xf…

常见的Redis使用问题及解决方案

目录 1. 缓存穿透 1.1 解决方案 2. 缓存击穿 2.1 解决方案 3. 缓存雪崩 3.1 概念图及问题描述 ​编辑3.2 解决方案 4. 分布式锁 4.1 概念 4.2 基于redis来实现分布式锁 4.3 用idea来操作一遍redis分布式锁 4.4 分布式上锁的情况下&#xff0c;锁释放了服务器b中的锁…

多态深度剖析

前言 继承是多态的基础&#xff0c; 如果对于继承的知识还不够了解&#xff0c; 可以去阅读上一篇文章 继承深度剖析 基本概念与定义 概念&#xff1a; 通俗来说&#xff0c;就是多种形态。具体点就是去完成某个行为&#xff0c; 当不同的对象去完成时会产生出不同的状…

如何完美解决 Xshell 使用 SSH 连接 Linux 服务器报错:找不到匹配的 host key 算法

&#x1f6e0;️ 如何完美解决 Xshell 使用 SSH 连接 Linux 服务器报错&#xff1a;找不到匹配的 host key 算法 摘要&#xff1a; 本文将带领大家深入学习如何解决 Xshell 使用 SSH 连接 Linux 服务器时报错“找不到匹配的 host key 算法”的问题。通过详细的操作步骤和代码案…

Shopee虾皮API:获取商家店铺商品列表

一、平台介绍 Shopee&#xff0c;作为东南亚及中国台湾地区领先的电商平台&#xff0c;为卖家提供了一个便捷、高效的销售渠道。作为卖家&#xff0c;能够将自己的商品展示在Shopee平台上&#xff0c;并通过平台的流量和工具&#xff0c;将商品销售给更多的潜在买家。 为了帮…

系统架构设计师 - 操作系统(2)

操作系统 操作系统&#xff08;5-6分&#xff09;文件管理绝对路径与相对路径 ★索引文件 ★★★位示图 ★ 存储管理段页式存储 ★★★页式存储段式存储段页式存储&#xff08;了解&#xff09; 页面置换算法 ★ 微内核操作系统嵌入式操作系统 ★★★ 大家好呀&#xff01;我是…

数据库课设-中小企业工资管理系统

一、效果展示 二、后端代码 import string import random from flask import Flask, render_template, request, jsonify, redirect, session import pymysql from flask_cors import CORS import time import schedule from datetime import datetime import threading from …