多目标粒子群算法及其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:popsizeparticle(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:maxgenfor 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.5particle(i).Best.Position = particle(i).Position;particle(i).Best.Cost = particle(i).Cost;endend% 确定粒子间的支配关系,并获取非支配粒子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) > nRepEXTRA = 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==1trace_best_mat(gen,:)=min(costs20gen');elsevminmat=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);endtrace_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.mzph.cn/diannao/4442.shtml

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

相关文章

开发工具-pycharm的代码自动部署服务器以及服务端python配置、项目开发环境一键启动服务

文章目录 一、pycharm的ssh配置1.本地生成ssh密钥2.密钥配置到远端服务器(1-1) 有权限ssh访问到服务器(1-2) 无权限ssh访问到服务器(1-3) 没有办法通过以上形式上传到服务器(2) 配置到authorized_keys自动访问 3.pycharm中配置ssh(1) 选择File中的settings(1) 选择Tools中的SSH…

js的算法-插入排序(折半插入排序)

直接插入排序的步骤 1. 从前面的有序子表中查找出待插入元素应该被插入的位置 2. 给插入位置腾空间 3. 将待插入元素复制到表中的插入位置。 直接插入排序&#xff1a;边比较边移动&#xff1b; 折半插入排序 先折半查找出元素的待插入位置&#xff0c;然后统一地移动待插…

上位机图像处理和嵌入式模块部署(树莓派4b之远程vnc桌面访问)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于很多嵌入式开发比较精通的同学来说&#xff0c;使用命令行和开发板之间进行沟通是他们完全能够接受的一种开发方式。但是对于更多的朋友来说&a…

0425DormAJAX项目

0425DormAJAX项目包-CSDN博客 数据库字段 添加界面&#xff1a; 初始状态&#xff1a; 点击性别&#xff0c;宿舍号使用ajax动态添加&#xff1a; 学生主界面&#xff1a; 实现分页查询&#xff1a; 点击修改学生宿舍&#xff0c;查看换寝记录&#xff0c;ajax动态显示列表&…

C语言例题29:在屏幕上显示一个等腰三角形

#include <stdio.h>void main() {int i, j;int x;printf("输入等腰三角形行数&#xff1a;");scanf("%d", &x);for (i 1; i < x; i) {for (j i; j < x; j) {printf(" "); //输出空格占位}for (j 1; j < 2 * i; j) {printf…

接字符串注入攻击简介

连接字符串注入攻击简介 什么是连接字符串注入攻击&#xff1f; 连接字符串注入攻击是一种安全攻击类型&#xff0c;攻击者通过修改应用程序使用的数据库连接字符串来注入恶意内容。连接字符串是包含数据库连接所需数据&#xff08;如服务器地址、数据库名、用户名和密码等&a…

5.1 海思SS928开发 - kernle开发 - 镜像制作

5.1 kernle开发 - 镜像制作 本文主要讲解如何编译生成可用的 ss928 kernel 镜像。 ATF&#xff08;ARM Trusted Firmware&#xff09;准备 准备步骤如下&#xff1a; cd ~/hiss928/kernel/ss928_kernel_v4.19/ # 拷贝相关文件 cp -rf ~/hiss928/sdk/ema_2.0.2.2/SS928V100_SD…

吴恩达2022机器学习专项课程(一) 7.1 逻辑回归的成本函数第三周课后实验:Lab4逻辑回归的损失函数

问题预览/关键词 上节课回顾逻辑回归模型使用线性回归模型的平方误差成本函数单个训练样本的损失损失函数&#xff0c;成本函数&#xff0c;代价函数的区别线性回归损失函数和逻辑回归损失函数的区别逻辑回归模型的成本函数是什么&#xff1f;逻辑回归模型的损失函数实验逻辑回…

深信服超融合虚拟机备份报错显示准备备分镜像失败

问题&#xff1a;最近一段时间深信服超融合虚拟机在执行备份策略时总是报错&#xff0c;备份空间又还很富余。 解决办法&#xff1a; 1 删除备份失败虚拟机的所有备份 2 解绑该虚拟机的备份策略 可靠服务>>备份与CDP>> 找到备份策略>>点【编辑】>>…

P44,45 属性预处理,执行后游戏效果回调,附录指定区域内修改变量

这节课主要是怎么对Attribute进行在进行到游戏角色前先进行处理,以及游戏效果如何回调 AuraAttributeSet.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "AttributeSet.h&…

实验五 Spark SQL编程初级实践

Spark SQL编程初级实践 Spark SQL基本操作 将下列JSON格式数据复制到Linux系统中&#xff0c;并保存命名为employee.json。 { "id":1 , "name":" Ella" , "age":36 } { "id":2, "name":"Bob","a…

堆的介绍,实现(c语言实现)

目录 堆的概念 堆的性质&#xff1a; 堆的分类 父子结点的下标关系 堆的向下调整算法 ​编辑小堆 大堆 建堆 堆的向上调整算法 小堆 大堆 堆的基本操作 定义堆 初始化堆 销毁堆 打印堆 堆的插入 堆的删除 大堆&#xff08;Max Heap&#xff09;的向下调整算法…

CentOS系统服务器装机后常用的操作命令大全

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【Linux系统编程】基础指令(三)

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

Redis底层数据结构之IntSet

目录 一、概述二、IntSet结构三、自动升级 redis底层数据结构已完结&#x1f44f;&#x1f44f;&#x1f44f;&#xff1a; ☑️redis底层数据结构之SDS☑️redis底层数据结构之ziplist☑️redis底层数据结构之quicklist☑️redis底层数据结构之Dict☑️redis底层数据结构之Int…

java中switch条件语句的用法、switch的三种语法、switch支持的参数类型

文章目录 一、switch的应用场景二、switch三种语法2.1、switch 标准方式2.2、switch - > 用法2.2、switch yield 用法 三、什么是case穿透&#xff1f;四、示例4.1、标准示例4.2、错误示例4.3、引申用法&#xff08;多条件合并&#xff09; 一、switch的应用场景 在分支结构…

Elasticsearch概念 使用docker安装Elasticsearch和kibana

目录 一、Elasticsearch概念 倒排索引和正向索引 正向和倒排 二、ES安装 三、安装 kibana 四、IK分词器 下载ES中文分词器 扩展或停用词条 一、Elasticsearch概念 倒排索引和正向索引 正向索引 就像在mysql数据中搜索非主键字段的内容&#xff0c;就需要逐条数据的去查…

WEB攻防-.NET特性常见漏洞

目录 前置知识&#xff1a; DLL文件 .NET和DLL文件 C#和DLL文件 关系总结 .NET 配置调试-信息泄露 .NET 源码反编译-DLL 反编译与未授权访问 编译DLL文件 反编译DLL文件 注意事项 案例&#xff1a; 验证代码文件有没有可以绕过&#xff08;Cookie&Session&…

【C++】二叉树的进阶

二叉树的进阶 二叉搜索树概念操作实现创建树形结构拷贝构造函数构造函数析构函数赋值运算符重载循环版本查找插入删除 递归版本查找插入删除 应用K模型KV模型性能分析 二叉树进阶面试题二叉树创建字符串二叉树的分层遍历I最近公共祖先二叉搜索树与双向链表前序遍历与中序遍历构…

PyCharm 无法运行的解决方案

问题&#xff1a; PyCharm 无法运行&#xff0c;该怎么办&#xff1f; 解决方案&#xff1a; 1. 检查 Python 解释器 确保已为 PyCharm 配置正确的 Python 解释器。打开 PyCharm&#xff0c;转到“文件”>“设置”>“项目”>“Python 解释器”。选择所需的 Python …