RVEA算法

news2024/12/24 2:47:20

RVEA

    • 1 目标函数
    • 2 预备知识
    • 3 参考向量引导选择
    • 4 更新参考向量
    • 5 流程
    • 6 代码
    • 7 运行效果

1 目标函数

min ⁡ X f ( X ) = ( f 1 ( X ) , f 2 ( X ) , . . . , f M ( X ) ) \min_{\small{X}} \pmb{f(\small{X})} = (f_1(\small{X}), f_2(\small{X}), ..., f_M(\small{X})) Xminf(X)=(f1(X),f2(X),...,fM(X))

2 预备知识

参考向量个数 N = C H + M − 1 M − 1 N = C_{H+M-1}^{M-1} N=CH+M1M1 H H H为边长分成的份数, M M M是目标的个数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XkhezIHc-1687679692188)(C:\Users\24220\AppData\Roaming\Typora\typora-user-images\image-20230615115213486.png)]

from pymoo.algorithms.moo.rvea import RVEA
from pymoo.optimize import minimize
from pymoo.problems import get_problem
from pymoo.util.ref_dirs import get_reference_directions
from pymoo.visualization.scatter import Scatter

problem = get_problem("dtlz1", n_obj=3)

ref_dirs = get_reference_directions("das-dennis", 3, n_partitions=12)

algorithm = RVEA(ref_dirs)

res = minimize(problem,
               algorithm,
               termination=('n_gen', 400),
               seed=1,
               verbose=False)

plot = Scatter()
plot.add(problem.pareto_front(ref_dirs), plot_type="surface", color="black", alpha=0.7)
plot.add(res.F, color="red")
plot.show(block=True)

此代码中 H = n _ p a r t i t i o n s = 12          M = n _ o b j = 3 H =n\_partitions = 12 \;\;\;\; M = n\_obj = 3 H=n_partitions=12M=n_obj=3

故最终的参考向量个数 N = C 12 + 3 − 1 3 − 1 = C 14 2 = 91 N = C_{12+3-1}^{3-1} = C_{14}^2 = 91 N=C12+3131=C142=91

每个参考向量需要单位化: v i = u i ∣ ∣ u i ∣ ∣ v_i=\frac{u_i}{ ||u_i||} vi=∣∣ui∣∣ui

参考向量的相似度 c o s θ = v 1 ∙ v 2 ∣ ∣ v 1 ∣ ∣ ∣ ∣ v 2 ∣ ∣ cos \theta = \frac{\pmb{v_1} \bullet\pmb{ v_2}}{||\pmb{v_1} ||||\pmb{v_2}||} cosθ=∣∣v1∣∣∣∣v2∣∣v1v2

3 参考向量引导选择

  • 理想向量: Z t m i n = ( Z t , 1 m i n , Z t , 2 m i n , . . . , Z t , m m i n ) \small{Z_t^{min}} = (\small{Z_{t, 1}^{min}}, \small{Z_{t, 2}^{min}}, ..., \small{Z_{t, m}^{min}}) Ztmin=(Zt,1min,Zt,2min,...,Zt,mmin)代表每个目标函数的最小值组成的向量

  • 目标向量平移:因为参考向量是以坐标系原点为中心的,因此需要将目标函数都平移到坐标系原点: f t , i ′ = f t , i − Z t m i n \text{f}_{t, i}^{\prime} = \text{f}_{t, i} - \small{Z_t^{min}} ft,i=ft,iZtmin f t , i \text{f}_{t, i} ft,i表示第 t t t次迭代中第 i i i个个体的目标函数向量

  • 种群划分:种群里面的每个个体按照到参考向量的最小夹角,与离得最近的目标向量归为一个集合体【与目标向量的余弦值最大】

c o s θ t , i , j = f t , i ′ ∙ v t , j ∣ ∣ f t , i ′ ∣ ∣ P ˉ t , k = { I t , i ∣ k = argmax i ∈ { 1 , 2 , . . . , N } c o s θ t , i , j } \begin{align} & cos \theta_{t, i, j} = \frac{\text{f}_{t, i}^{\prime} \bullet \pmb{v}_{t, j}}{||\text{f}_{t, i}^{\prime}||} \\ & \bar{P}_{t, k} = \{I_{t, i}|k = \underset{i \in \{1, 2, ..., N\}}{\text{argmax}} cos \theta_{t, i, j}\} \end{align} cosθt,i,j=∣∣ft,i∣∣ft,ivt,jPˉt,k={It,ik=i{1,2,...,N}argmaxcosθt,i,j}

  • 角度惩罚距离
    d t , i , j = ( 1 + P ( θ t , i , j ) ) ∙ ∣ ∣ f t , i ′ ∣ ∣ P ( θ t , i , j ) = M . ( t t m a x ) α . θ t , i , j γ v t , j γ v t , j = min ⁡ i ∈ { 1 , 2 , . . . , N } , i ≠ j < v t , i , v t , j >          最小角 \begin{align} d_{t, i, j} &= (1 + P(\theta_{t, i, j})) \bullet ||\text f_{t, i}^{\prime}|| \\ P(\theta_{t, i, j}) &= M . (\frac{t}{t_{max}}) ^\alpha . \frac{\theta_{t, i, j}}{\gamma_{\pmb v_{t, j}}} \\ \gamma_{\pmb v_{t, j}} &= \min_{i \in \{1, 2, ..., N\}, i \neq j} <\pmb v_{t, i}, \pmb v_{t, j}> \;\;\;\; \text{最小角} \end{align} dt,i,jP(θt,i,j)γvt,j=(1+P(θt,i,j))∣∣ft,i∣∣=M.(tmaxt)α.γvt,jθt,i,j=i{1,2,...,N},i=jmin<vt,i,vt,j>最小角

4 更新参考向量

v t + 1 , i = v 0 , i ∘ ( Z t + 1 m a x − Z t + 1 m i n ) ∣ ∣ v 0 , i ∘ ( Z t + 1 m a x − Z t + 1 m i n ) ∣ ∣ \pmb v_{t+1, i} = \frac{\pmb v_{0, i} \circ (\small Z_{t+1}^{max} - Z_{t+1}^{min})}{||\pmb v_{0, i} \circ (\small Z_{t+1}^{max} - Z_{t+1}^{min})||} vt+1,i=∣∣v0,i(Zt+1maxZt+1min)∣∣v0,i(Zt+1maxZt+1min)

5 流程

整体流程
![在这里插入图片描述](https://img-blog.csdnimg.cn/6f71e37498f445f7bfc5101d535c68f5.png

参考向量指导选择
在这里插入图片描述

更新参考向量
在这里插入图片描述

fr通常设置为 0.2 0.2 0.2

alpha通常设置为 2 2 2

t_max通常设置为 400 400 400

6 代码

import numpy as np
from matplotlib import pyplot as plt
from pymoo.util.ref_dirs import get_reference_directions
import geatpy as ea
from pymoo.visualization.scatter import Scatter

class DTLZ1(ea.Problem):  # 继承Problem父类
    def __init__(self, M=3, Dim=None):  # M : 目标维数;Dim : 决策变量维数
        name = 'DTLZ1'  # 初始化name(函数名称,可以随意设置)
        maxormins = [1] * M  # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)
        if Dim is None:
            Dim = M + 4  # 初始化Dim(决策变量维数)
        varTypes = np.array([0] * Dim)  # 初始化varTypes(决策变量的类型,0:实数;1:整数)
        lb = [0] * Dim  # 决策变量下界
        ub = [1] * Dim  # 决策变量上界
        lbin = [1] * Dim  # 决策变量下边界(0表示不包含该变量的下边界,1表示包含)
        ubin = [1] * Dim  # 决策变量上边界(0表示不包含该变量的上边界,1表示包含)
        # 调用父类构造方法完成实例化
        ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)

    def evalVars(self, Vars):  # 目标函数
        XM = Vars[:, (self.M - 1):]
        g = 100 * (self.Dim - self.M + 1 + np.sum(((XM - 0.5) ** 2 - np.cos(20 * np.pi * (XM - 0.5))), 1,
                                                  keepdims=True))
        ones_metrix = np.ones((Vars.shape[0], 1))
        f = 0.5 * np.hstack([np.fliplr(np.cumprod(Vars[:, :self.M - 1], 1)), ones_metrix]) * np.hstack(
            [ones_metrix, 1 - Vars[:, range(self.M - 2, -1, -1)]]) * (1 + g)
        return f


if __name__ == '__main__':
    M = 3  # 目标函数的个数
    ref_dirs0 = get_reference_directions("das-dennis", M, n_partitions=12)  # 初始化参考向量

    N = ref_dirs0.shape[0]  # 参考向量的大小
    dim = 7  # 决策变量的维度

    for i in range(ref_dirs0.shape[0]):
        ref_dirs0[i] = ref_dirs0[i] / np.linalg.norm(ref_dirs0[i])

    ref_dirs = np.copy(ref_dirs0)

    pop = np.random.random((100, dim))

    crossover = ea.Recsbx(XOVR=1, n=30)  # 交叉
    mutation = ea.Mutpolyn(Pm=1 / dim)  # 变异

    lb = np.array([0] * dim)
    ub = np.array([1] * dim)
    varsType = np.array([0] * dim)

    problem = DTLZ1()
    t_max = 400
    alpha = 2
    fr = 0.2
    for t in range(t_max):
        print(t)
        children = crossover.do(pop)
        children = mutation.do('RI', children, np.array([lb, ub, varsType]))

        pop = np.row_stack((pop, children))  # 合并种群
        ObjV = problem.evalVars(pop)  # 计算种群的目标值

        # ==================   参考向量指导选择  ==================
        z_min = np.min(ObjV, axis=0)  # 计算最优点

        # =======================    更新参考向量   ==============================
        if np.mod(t / t_max, fr) == 0:
            z_max = np.max(ObjV, axis=0)  # 计算最差点
            for j in range(N):
                ref_dirs[j] = np.multiply(ref_dirs0[j], z_max - z_min)
                ref_dirs[j] = ref_dirs[j] / np.linalg.norm(ref_dirs[j])
        # =======================    更新参考向量   ==============================

        ObjV_1 = ObjV - z_min   # 目标值转换到坐标轴
        pop_size = pop.shape[0]

        theta_set = np.full((pop_size, N), np.nan)  # 根据目标值与参考点之间的夹角,划分种群
        for i in range(pop_size):
            for j in range(N):
                cos_theta = ObjV_1[i].dot(ref_dirs[j]) / np.maximum(np.linalg.norm(ObjV_1[i]), 1e-64)
                theta_set[i, j] = np.arccos(cos_theta)

        partition = [[] for _ in range(N)]   # 划分为 N 个种群

        for i in range(pop_size):
            k = np.argmin(theta_set[i])
            partition[k].append(i)

        gamma = np.full((N, N), np.nan)  # 参考向量之间的夹角
        for i in range(N):
            for j in range(N):
                if i == j:
                    gamma[i, j] = np.pi
                    continue
                gamma[i, j] = np.arccos(ref_dirs[i].dot(ref_dirs[j]))

        gamma = np.min(gamma, axis=1)

        apd_partition = [[] for _ in range(N)]

        for j in range(N):  # 设置角度惩罚
            partiton_j = partition[j]
            for i in partiton_j:
                p_theta = M * np.power(t / t_max, alpha) * (theta_set[i, j] / gamma[j])
                apd = (1 + p_theta) * np.linalg.norm(ObjV_1[i])
                apd_partition[j].append(apd)
        # ==================   参考向量指导选择   =====================

        # ====================   精英选择   ========================
        survivor = []
        for j in range(N):
            partiton_j = partition[j]
            if not partiton_j:
                continue
            k = np.argmin(apd_partition[j])
            survivor.append(partiton_j[k])
        pop = pop[survivor]
        # ====================   精英选择   =======================

    ObjV = problem.evalVars(pop)
    print(ObjV.shape)
    
    plot = Scatter()
    plot.add(ObjV)
    plot.show()

7 运行效果

在这里插入图片描述

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

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

相关文章

数据结构——快速排序的介绍

快速排序 快速排序是霍尔(Hoare)于1962年提出的一种二叉树结构的交换排序方法。快速排序是一种常用的排序算法&#xff0c;其基本思想是通过选择一个元素作为"基准值"&#xff0c;将待排序序列分割成两个子序列&#xff0c;其中一个子序列的元素都小于等于基准值&am…

DAY29:回溯算法(四)组合总和+组合总和Ⅱ

文章目录 39.组合总和思路伪代码为什么传入i而不是i1&#xff0c;不会导致无限循环 完整版剪枝优化剪枝修改完整版补充&#xff1a;std::sort升降序的问题&#xff08;默认升序&#xff09; 40.组合总和Ⅱ思路最开始的写法debug测试&#xff1a;逻辑错误修改完整版&#xff1a;…

营销策划报告个人心得

营销策划报告个人心得篇1 20__年3月27日晚&#xff0c;我们12级市营专业的同学们早早的来到了大成楼。根据网络营销与策划课程实训要求&#xff0c;覃希老师邀请了校外企业经理给我们进行产品培训。 我们按实训项目分别安排在C302和C304教室培训&#xff0c;培训中同学们认认真…

基于深度学习的高精度水果检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度水果&#xff08;苹果、香蕉、葡萄、橘子、菠萝和西瓜&#xff09;检测识别系统可用于日常生活中或野外来检测与定位水果目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的水果目标检测识别&#xff0c;另外支持结果可视…

OpenGL 模板测试

1.示例效果图 选中模型对象&#xff0c;出现模型轮廓。 2.简介 当片段着色器处理完一个片段之后&#xff0c;模板测试会开始执行&#xff0c;和深度测试一样&#xff0c;它也可能会丢弃片段。接下来&#xff0c;被保留的片段会进入深度测试&#xff0c;它可能会丢弃更多的片…

MongoDB集群管理(三)

MongoDB集群管理 集群介绍 为什么使用集群 随着业务数据和并发量的增加&#xff0c;若只使用一台MongoDB服务器&#xff0c;存在着断电和数据风险的问题&#xff0c;故采用Mongodb复制集的方式&#xff0c;来提高项目的高可用、安全性等性能。 MongoDB复制是将数据同步到多个…

LNMP (Nginx网站服务) nginx 平滑升级

目录 1.1 Nginx的简介 1.2 Apache与Nginx的区别 Nginx对比Apache的优势&#xff1a; 1.3 Nginx的进程 Nginx的两个进程&#xff1a; 同步&#xff0c;异步&#xff0c;阻塞&#xff0c;非阻塞的概念补充 阻塞与非阻塞 同步和异步 2.1 编译安装Nginx 2.1 .1 关闭防火墙…

两点边值问题的有限元方法以及边值条件的处理示例

文章目录 引言题目补全方程刚度矩阵构造基底边值条件非齐次左边值条件非齐次右边值条件非齐次非齐次边值条件有限元方程 求数值解直接求总刚度矩阵先求单元刚度矩阵 引言 本文参考李荣华教授的《偏微分方程数值解法》一书 题目 对于非齐次第二边值问题 { − d d x ( p d u …

陶哲轩甩出调教GPT-4聊天记录,点击领取大佬的研究助理

量子位 | 公众号 QbitAI 鹅妹子嘤&#xff0c;天才数学家陶哲轩搞数学研究&#xff0c;已经离不开普通人手里的“数学菜鸡”GPT了&#xff01; 就在他最新解决的一个数学难题下面&#xff0c;陶哲轩明确指出自己“使用了GPT-4”&#xff0c;后者给他提出了一种可行的解决方法…

【FFmpeg实战】avformat_find_stream_info() 函数源码解析

转载自地址&#xff1a;https://cloud.tencent.com/developer/article/1873836 先来看一下 avformat_find_stream_info() 的头文件里的注释对该函数的介绍&#xff0c;本文我们基于 FFmpeg n4.2 版本的源码分析。 /*** Read packets of a media file to get stream informatio…

Apikit 自学日记:创建 API 文档

Apikit 中一共有5种创建API文档的方式&#xff1a; 新建API文档 导入API文档&#xff0c;详情可查看《导入、导出API文档》 从模板添加API文档&#xff0c;详情可查看《API文档模板》 自动生成API文档&#xff0c;详情可查看《自动生成API文档》 IDEA插件注释同步API文档 …

linux 在线安装 Redis

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

生成式AI掀起产业智能化新浪潮|爱分析报告

报告摘要 大模型支撑的生成式AI&#xff0c;让人类社会有望步入通用人工智能时代&#xff0c;拥有广阔的应用前景&#xff0c;有望赋能千行百业。当前生成式AI的落地整体处于初级阶段&#xff0c;不同模态的落地时间表差异明显&#xff0c;企业需求主要集中在数字化程度高、容…

地平线旭日x3派部署yolov8

地平线旭日x3派部署yolov8 总体流程1.导出onnx模型导出YOLOV8_onnxruntime.py验证onnxutils.py 2.在开发机转为bin模型2.1准备数据图片2.2转换必备的yaml文件2.3开始转换 3.开发机验证**quantized_model.onnx4.板子运行bin模型 资源链接 总体流程 1.导出onnx模型 导出 使用y…

03 | 事务隔离:为什么你改了我还看不见?

以下出自 《MySQL 实战 45 讲》 03 | 事务隔离&#xff1a;为什么你改了我还看不见&#xff1f; 隔离性与隔离级别 当数据库上有多个事务同时执行的时候&#xff0c;就可能出现脏读&#xff08;dirty read&#xff09;、不可重复读&#xff08;non-repeatable read&#xff0…

搜索功能全流程解析

在产品中一般会分布着大大小小的搜索&#xff0c;以便提升用户的信息获取效率和信息消费的能力。本文作者全流程角度&#xff0c;对搜索功能进行了讲解&#xff0c;并从搜索流程中寻找提升体验的触点&#xff0c;一起来看一下吧。 在产品中因多功能诉求和业务复杂性等因素&…

《Pytorch深度学习和图神经网络(卷 1)》学习笔记——第三章

学习基于如下书籍&#xff0c;仅供自己学习&#xff0c;用来记录回顾&#xff0c;非教程。 <PyTorch深度学习和图神经网络&#xff08;卷 1&#xff09;——基础知识>一书配套代码&#xff1a; https://github.com/aianaconda/pytorch-GNN-1st 百度网盘链接&#xff1a;…

vite优化

1.利用 rollup-plugin-analyzer 插件进行进行代码体积分析&#xff0c;从而优化你的代码。 根据项目体积分析&#xff0c;进行接下来的优化&#xff1a; &#xff08;一&#xff09;使用unplugin-vue-components插件按需加载antd vue 组件&#xff1a; 使用步骤 1、安装插件…

6.18 、Java初级:锁

1 同步锁 1.1 前言 经过前面多线程编程的学习,我们遇到了线程安全的相关问题,比如多线程售票情景下的超卖/重卖现象. 上节笔记点这里-进程与线程笔记 我们如何判断程序有没有可能出现线程安全问题,主要有以下三个条件: 在多线程程序中 有共享数据 多条语句操作共享数据 多…

GPT-4 的创造力全方位持平或碾压人类 | 一项最新研究发现

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 最近&#xff0c;一项有关 GPT-4 的创造力思维测试火了。来自蒙大拿大学和 UM Western 大学的研究团队发现&#xff0c;GPT-4 在 Torrance 创造性思维…