多目标粒子群优化(Multi-Objective Particle Swarm Optimization, MOPSO)算法

news2024/11/24 6:08:16

概述

多目标粒子群优化(MOPSO) 是粒子群优化(PSO)的一种扩展,用于解决具有多个目标函数的优化问题。MOPSO的目标是找到一组非支配解(Pareto最优解),这些解在不同目标之间达到平衡。

主要步骤

  1. 初始化粒子群
    随机生成一组粒子,每个粒子有一个初始位置和速度。
  2. 评估适应度
    计算每个粒子在所有目标函数上的适应度值。
    更新粒子的个人最佳位置和个人最佳适应度。
  3. 非支配解选择
    使用支配关系判断粒子之间的优劣。
    找到一组非支配解,构成当前的Pareto前沿。
  4. 更新速度和位置
    根据认知项(粒子自身的最佳位置)和社会项(全局最佳位置)更新粒子的速度。
    根据更新后的速度调整粒子的位置。
  5. 迭代优化
    重复执行适应度评估、非支配解选择和速度位置更新,直到达到最大迭代次数或满足其他停止条件。

代码功能

该代码实现了一个多目标粒子群优化(Multi-Objective Particle Swarm Optimization, MOPSO)算法,并使用Python编写。MOPSO算法用于解决具有多个目标函数的优化问题。具体来说,该代码实现了以下功能:

  1. 粒子群初始化
    创建一组粒子,每个粒子有一个初始位置和速度。
    粒子的位置在给定的边界范围内随机生成,初始速度设为零。
  2. 适应度评估
    对每个粒子计算其适应度值,即每个目标函数在该粒子位置上的值。
    更新粒子的个人最佳位置和个人最佳适应度。
  3. 速度和位置更新
    根据认知项(粒子自身的最佳位置)和社会项(全局最佳位置)更新粒子的速度。
    根据新的速度更新粒子的位置,并确保位置在搜索空间内。
  4. 非支配解选择
    使用支配关系判断粒子之间的优劣,找到一组非支配解。
    随机选择一个非支配解作为全局最佳位置。
  5. 多目标优化
    在指定的迭代次数内重复执行适应度评估、速度和位置更新以及非支配解选择。
    最终返回找到的所有非支配解的位置。
  6. 结果可视化
    计算每个非支配解在两个目标函数上的值。
    使用Matplotlib库绘制这些解在两个目标函数值上的分布图,展示Pareto前沿。
    在这里插入图片描述

代码

import numpy as np
import random
import matplotlib.pyplot as plt

class Particle:
    def __init__(self, position, velocity):
        self.position = position  # 粒子的位置
        self.velocity = velocity  # 粒子的速度
        self.best_position = position.copy()  # 粒子的个人最佳位置
        self.best_fitness = None  # 粒子的个人最佳适应度
        self.fitness = None  # 粒子的当前适应度

def initialize_population(dimensions, population_size, bounds):
    # 初始化粒子群
    particles = []
    for _ in range(population_size):
        position = [random.uniform(bounds[i][0], bounds[i][1]) for i in range(dimensions)]  # 随机生成初始位置
        velocity = [0.0 for _ in range(dimensions)]  # 初始速度为0
        particles.append(Particle(position, velocity))
    return particles

def evaluate_fitness(particle, objectives):
    # 计算粒子的适应度
    particle.fitness = [objective(particle.position) for objective in objectives]  # 计算当前适应度
    if particle.best_fitness is None or dominates(particle.fitness, particle.best_fitness):
        # 如果当前适应度优于个人最佳适应度,则更新个人最佳位置和适应度
        particle.best_fitness = particle.fitness.copy()
        particle.best_position = particle.position.copy()

def update_velocity(particle, global_best_positions, w=0.7, c1=1.5, c2=1.5):
    # 更新粒子的速度
    for i in range(len(particle.velocity)):
        r1 = random.random()
        r2 = random.random()
        cognitive = c1 * r1 * (particle.best_position[i] - particle.position[i])  # 认知项
        social = c2 * r2 * (global_best_positions[i] - particle.position[i])  # 社会项
        particle.velocity[i] = w * particle.velocity[i] + cognitive + social  # 更新速度

def update_position(particle, bounds):
    # 更新粒子的位置
    for i in range(len(particle.position)):
        particle.position[i] += particle.velocity[i]
        # 确保粒子的位置在搜索空间内
        if particle.position[i] < bounds[i][0]:
            particle.position[i] = bounds[i][0]
        elif particle.position[i] > bounds[i][1]:
            particle.position[i] = bounds[i][1]

def dominates(p1, p2):
    # 检查p1是否支配p2
    return all(f1 <= f2 for f1, f2 in zip(p1, p2)) and any(f1 < f2 for f1, f2 in zip(p1, p2))

def find_global_best(particles):
    # 找到全局最佳位置
    non_dominated_sorting = []
    for particle in particles:
        is_dominated = False
        for other in particles:
            if dominates(other.fitness, particle.fitness):
                is_dominated = True
                break
        if not is_dominated:
            non_dominated_sorting.append(particle)
    if non_dominated_sorting:
        # 随机选择一个非支配解作为全局最佳位置
        return random.choice(non_dominated_sorting).position
    else:
        return particles[0].position

def mopso(objectives, dimensions, bounds, population_size, iterations):
    # 多目标粒子群优化算法
    particles = initialize_population(dimensions, population_size, bounds)
    for particle in particles:
        evaluate_fitness(particle, objectives)

    for _ in range(iterations):
        global_best_positions = find_global_best(particles)
        for particle in particles:
            update_velocity(particle, global_best_positions)
            update_position(particle, bounds)
            evaluate_fitness(particle, objectives)

    # 返回找到的最佳位置
    return [p.position for p in particles]

# 示例用法
def obj1(x):
    return sum(xi**2 for xi in x)  # 目标函数1

def obj2(x):
    return sum((xi-2)**2 for xi in x)  # 目标函数2

dimensions = 2  # 维度数
bounds = [(-5.12, 5.12)] * dimensions  # 每个维度的边界
population_size = 50  # 粒子群大小
iterations = 1000  # 迭代次数

solutions = mopso([obj1, obj2], dimensions, bounds, population_size, iterations)

# 计算最终解的适应度
final_fitness = [(obj1(sol), obj2(sol)) for sol in solutions]

# 绘制结果
plt.scatter([f1 for f1, f2 in final_fitness], [f2 for f1, f2 in final_fitness])
plt.xlabel('Objective 1')
plt.ylabel('Objective 2')
plt.title('Pareto Front')
plt.grid(True)
plt.show()

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

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

相关文章

tomcat 后台部署 war 包 getshell

1. tomcat 后台部署 war 包 getshell 首先进入该漏洞的文件目录 使用docker启动靶场环境 查看端口的开放情况 访问靶场&#xff1a;192.168.187.135:8080 访问靶机地址 http://192.168.187.135:8080/manager/html Tomcat 默认页面登录管理就在 manager/html 下&#xff0c…

4.6 JMeter HTTP信息头管理器

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言1 HTTP信息头管理器的位置2 常见的HTTP请求头3 添加 HTTP 信息头管理器4 应用场景 前言 在 JMeter 中&#xff0c;HTTP信息头管理器&#xff08;HTTP Header Manager&#xff09…

NVR管理平台EasyNVR多品牌NVR管理工具的流媒体视频融合与汇聚管理方案

随着信息技术的飞速发展&#xff0c;视频监控已经成为现代社会安全管理和业务运营不可或缺的一部分。无论是智慧城市、智能交通、还是大型企业、校园安防&#xff0c;视频监控系统的应用都日益广泛。NVR管理平台EasyNVR&#xff0c;作为功能强大的流媒体服务器软件&#xff0c;…

【大数据学习 | Spark-Core】Spark的改变分区的算子

当分区由多变少时&#xff0c;不需要shuffle&#xff0c;也就是父RDD与子RDD之间是窄依赖。 当分区由少变多时&#xff0c;是需要shuffle的。 但极端情况下&#xff08;1000个分区变成1个分区)&#xff0c;这时如果将shuffle设置为false&#xff0c;父子RDD是窄依赖关系&…

微代码-C语言如何分配内存并自动清零?(calloc)

背景 在C语言中&#xff0c;calloc 函数用于分配内存&#xff0c;并且会自动将所有位初始化为零。calloc 的原型定义在 stdlib.h 头文件中&#xff0c;其函数原型如下&#xff1a; void *calloc(size_t num, size_t size);使用例子&#xff1a; #include <stdio.h> #i…

自动语音识别(ASR)与文本转语音(TTS)技术的应用与发展

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ARM 架构(Advanced RISC Machine)精简指令集计算机(Reduced Instruction Set Computer)

文章目录 1、ARM 架构ARM 架构的特点ARM 架构的应用ARM 架构的未来发展 2、RISCRISC 的基本概念RISC 的优势RISC 的应用RISC 与 CISC 的对比总结 1、ARM 架构 ARM 架构是一种低功耗、高性能的处理器架构&#xff0c;广泛应用于移动设备、嵌入式系统以及越来越多的服务器和桌面…

戴尔 AI Factory 上的 Agentic RAG 搭载 NVIDIA 和 Elasticsearch 向量数据库

作者&#xff1a;来自 Elastic Hemant Malik, Dell Team 我们很高兴与戴尔合作撰写白皮书《戴尔 AI Factory with NVIDIA 上的 Agentic RAG》。白皮书是一份供开发人员参考的设计文档&#xff0c;概述了实施 Agentic 检索增强生成 (retrieval augmented generation - RAG) 应用…

Vue实训---0-完成Vue开发环境的搭建

1.在官网下载和安装VS Code编辑器 完成中文语言扩展&#xff08;chinese&#xff09;&#xff0c;安装成功后&#xff0c;需要重新启动VS Code编辑器&#xff0c;中文语言扩展才可以生效。 安装Vue-Official扩展&#xff0c;步骤与安装中文语言扩展相同&#xff08;专门用于为“…

POA-CNN-SVM鹈鹕算法优化卷积神经网络结合支持向量机多特征分类预测

分类预测 | Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络结合支持向量机多特征分类预测 目录 分类预测 | Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络结合支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现POA-CNN-SVM鹈鹕算法…

(STM32)ADC驱动配置

1.ADC驱动&#xff08;STM32&#xff09; ADC模块中&#xff0c;**常规模式&#xff08;Regular Mode&#xff09;和注入模式&#xff08;Injected Mode&#xff09;**是两种不同的ADC工作模式 常规模式&#xff1a;用于普通的ADC转换&#xff0c;是默认的ADC工作模式。 注入…

flume-将日志采集到hdfs

看到hdfs大家应该做什么&#xff1f; 是的你应该去把集群打开&#xff0c; cd /export/servers/hadoop/sbin 启动集群 ./start-all.sh 在虚拟机hadoop02和hadoop03上的conf目录下配置相同的日志采集方案&#xff0c;‘ cd /export/servers/flume/conf 切换完成之后&#…

机器人SLAM建图与自主导航:从基础到实践

前言 这篇文章我开始和大家一起探讨机器人SLAM建图与自主导航 &#xff0c;在前面的内容中&#xff0c;我们介绍了差速轮式机器人的概念及应用&#xff0c;谈到了使用Gazebo平台搭建仿真环境的教程&#xff0c;主要是利用gmapping slam算法&#xff0c;生成一张二维的仿真环境…

在线解析工具链接

在线字数统计工具-统计字符字节汉字数字标点符号-计算word文章字数字数统计,字符统计,字节统计,字数计算,统计字数,统计字节数,统计字符数,统计word字数,在线字数统计,在线查字数,计算字数,字数统计工具,支持手机移动端查询多少字数,英文:Calculate the number of words,Count …

学习Servlet(含义,作用)

目录 前言 Servlet 的含义 Servlet 的作用 前言 一个完整的前后端项目&#xff0c;是需要前端和后端&#xff08;Java实现&#xff09;共同完成的。那应该如何实现前后端进行交互呢&#xff1f;答案&#xff1a;使用Servlet实现前后端交互 我会从了解Servlet的含义&…

从源码到应用:在线教育系统与教培网校APP开发实战指南

时下&#xff0c;各类教培网校APP逐渐成为教育机构的核心工具。那么&#xff0c;如何从源码出发&#xff0c;开发一套符合需求的在线教育系统与教培网校APP&#xff1f;本文将从架构设计、功能实现到部署上线&#xff0c;提供一份全面的开发实战指南。 一、在线教育系统的核心架…

Pyqt5的簡單教程

簡介 pyqt5是qt的Python版本&#xff0c;因為最近需要做一個有界面的程式&#xff0c;所以想到這個庫&#xff0c;這裡就稍微介紹它的安裝和使用教程 1.安裝qt5 可能需要安裝vs的c編譯組件 pip install pyQt52.使用拖拽組件編寫頁面 使用此工具打開組件 ctrls 生成.ui文件 …

---Arrays类

一 java 1.Arrays类 1.1 toString&#xff08;&#xff09; 1.2 arrays.sort( )-----sort排序 1&#xff09;直接调用sort&#xff08;&#xff09; Arrays.sort() 方法的默认排序顺序是 从小到大&#xff08;升序&#xff09;。 2&#xff09;定制排序【具体使用时 调整正负…

STM32F4----ADC模拟量转换成数字量

STM32F4----ADC模拟量转换成数字量 基本原理 当需要测量和记录外部电压的变化&#xff0c;或者根据外部电压的变化量来决定是否触发某个动作时&#xff0c;我们可以使用ADC&#xff08;模拟—数字转换器&#xff09;功能。这个功能可以将模拟的电压信号转换为数字信号&#x…

《Python 股票交易分析:开启智能投资新时代》(二)

Python 进行股票交易分析的优势 简洁易读&#xff1a;Python 的语法简洁明了&#xff0c;即使是编程新手也能较快上手&#xff0c;降低了股票交易分析的门槛。 Python 的简洁易读是其在股票交易分析中受欢迎的重要原因之一。Python 的语法简洁明了&#xff0c;与其他编程语言相…