NSGA and NSGA-II

news2024/11/18 15:45:36

目录

  • 1 NSGA
    • 1.1 传统多目标优化方法
    • 1.2 多目标转为单目标的缺点
    • 1.3 权重向量距离说明
    • 1.4 NSGA方法
      • 1.4.1 流程
      • 1.4.2 关键步骤
    • 1.5 注意
  • 2 NSGA-II
    • 2.1 NSGA的缺点
    • 2.2 NSGA-II在NSGA上的变动
    • 2.3 NSGA-II流程

1 NSGA

1.1 传统多目标优化方法

  1. 使用权重向量,将多目标问题转化为单目标问题: Z = ∑ i = 1 N w i f i ( x ) Z = \sum_{i = 1}^N w_if_i(x) Z=i=1Nwifi(x) w i w_i wi为目标的重要程度, f i ( x ) f_i(x) fi(x)为目标函数

所有目标权重相等会出现冲突,但是在现实需求上,需要对公式的权重优先降低以符合需求

  1. 距离向量函数:

距离向量函数和目标权重相似,不同点在于距离向量函数需要知道每个目标函数的标,而目标权重方法则需要赋予每个目标相关重要性

  1. 最大最小公式: min ⁡ F ( x ) = max ⁡ [ Z j ( x ) ] \min\mathcal{F}(x) = \max [\mathcal{Z_j(x)}] minF(x)=max[Zj(x)]
    在这里插入图片描述
  1. 适用于优先级相等的目标
  2. 可以和无量纲的权重结合,以改变优先级
  3. 可以和需求等级向量结合使用

1.2 多目标转为单目标的缺点

  • 单目标的优化可以保证pareto最优解,但结果是单点解
  • 如果某些目标有噪声或具有不连续的变量空间,这些方法可能无法有效工作。其中一些方法也很昂贵,因为它们需要在向量优化之前了解个体最优

1.3 权重向量距离说明

在这里插入图片描述

  1. 权重向量为 ( 0.5 , 0.5 ) (0.5, 0.5) (0.5,0.5)时,说明要求 f 11 f11 f11 f 12 f12 f12同时兼顾较小,故解为 x = 1 x = 1 x=1
  2. 权重向量为 ( 1 , 0 ) (1, 0) (1,0)时,说明更加强调 f 11 f11 f11小,因此此时的解为 x = 0 x = 0 x=0
  3. 权重向量为 ( 0 , 1 ) (0, 1) (0,1)时,说明更加强调 f 12 f12 f12小,因此此时的解为 x = 2 x = 2 x=2

如果想获得图中 ( 0 , 2 ) (0, 2) (0,2)之间特殊的Pareto可行解必须要知道权重,但是这个区间的Pareto解对应的权重不易获取

1.4 NSGA方法

1.4.1 流程

在这里插入图片描述

1.4.2 关键步骤

  1. 对于 f 1 , f 2 f_1, f_2 f1,f2均为最小化问题,如果 f 1 ( i ) < f 1 ( j )    a n d    f 2 ( i ) < f 2 ( j ) f_1(i) < f_1(j) \;and \; f_2(i) < f_2(j) f1(i)<f1(j)andf2(i)<f2(j),则 i i i支配 j j j
# 选择排序
def non_sort(matrix):
    realValue = binaryDecode(matrix)
    # realValue = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
    # y1[j] < y1[i] and y2[j] < y2[i] 说明j支配i
    ranks = []  # 等级列表
    y1 = np.array(f1(realValue))
    # y1 = np.array([2, 3, 3, 4, 4, 5, 5, 5, 6])
    y2 = np.array(f2(realValue))
    # y2 = np.array([7.5, 6, 7.5, 5, 6.5, 4.5, 6, 7, 6.5])
    while True:
        rank = []   # 同一等级的元素列表
        indexs = []   # 记录当前非支配的索引
        for i in range(y1.size):
            nondominated = True  # 当前元素知否被其它元素所支配
            for j in range(y1.size):
                if y1[j] < y1[i] and y2[j] < y2[i] and i != j:
                    nondominated = False     # i被j支配
                    break
            if nondominated == True:
                rank.append(realValue[i])
                indexs.append(i)

        if len(rank) > 0:
            ranks.append(rank)

        # 移除已经分好等级的元素
        y1 = np.delete(y1, indexs)
        y2 = np.delete(y2, indexs)
        realValue = np.delete(realValue, indexs)

        if y1.size == 0:
            break

    return ranks
  1. 求小生境 n i c h e niche niche
    S h ( d i j ) = { 1 − ( d i j σ s h a r e ) 2 d i j < σ s h a r e 0 e l s e Sh(d_{ij})= \begin{cases} 1- (\frac {d_{ij}}{\sigma_{share}})^2 & d_{ij} < \sigma_{share} \\ 0 & else \end{cases} Sh(dij)={1(σsharedij)20dij<σshareelse

A parameter niche count is calculated by adding the above sharing function values for all individuals in the current front.

n i c h e C o u n t = ∑ i N − 1 S h nicheCount = \sum_i^{N - 1} Sh nicheCount=iN1Sh

# 求当前等级中各元素小生境的个数,在目标空间上共享
def niche(rank):
    l = len(rank)
    counts = [0] * l
    y1 = f1(np.array(rank))
    y2 = f2(np.array(rank))
    # x = np.array(rank)
    for i in range(l):
        for j in range(l):
            if i == j:
                continue
            dij = math.pow((y1[i] - y1[j]) ** 2 + (y2[i] - y2[j]) ** 2, 0.5)
            # dij = math.fabs((x[i] - x[j]))
            if dij < shareDistance:
                counts[i] += 1 - (dij / shareDistance) ** 2
    return counts

共享可以在参数上共享也可以在目标上共享

3. 求个体适应度值
f i t n e s s = d u m m y F i t n e s s n i c h e C o u n t fitness = \frac {dummyFitness}{nicheCount} fitness=nicheCountdummyFitness

def fitness(ranks):
    dummyFitness = 1
    fits = []
    for rank in ranks:
        counts = niche(rank)
        for count in counts:
            if count == 0:
                fit = dummyFitness
            else:
                fit = dummyFitness / count
            fits.append(fit)
        dummyFitness = dummyFitness - 1/len(ranks)
    return fits

1.5 注意

  1. σ s h a r e \sigma_{share} σshare需要指定,指定的不合适收敛比较难
  2. 在参数上共享容易提早收敛,在目标上共享会使得目标值具有多样性,但是参数变量不具有多样性。
  3. 种群太小,导致非支配解过少;种群太大,容易提早收敛
  4. 随着 r a n k rank rank变大, d u m m y F i t n e s s dummyFitness dummyFitness 减小。 d u m m y F i t n e s s dummyFitness dummyFitness 是自己指定的

2 NSGA-II

2.1 NSGA的缺点

  1. 非支配排序计算复杂度高
  2. 缺乏精英策略
  3. 需要指定合适的共享参数 σ s h a r e \sigma_{share} σshare

2.2 NSGA-II在NSGA上的变动

  1. 采用了快速的非支配排序(精英主义),以达到快速收敛的目的
  2. 采用拥挤度,为了使得pareto解具有多样性

2.3 NSGA-II流程

  1. 父代子代混合
    在这里插入图片描述
    在这里插入图片描述

  2. 对混合后的个体计算两个值: n p 和 S e t p n_p和Set_p npSetp
    在这里插入图片描述

  3. 对混合后的个体进行非支配排序
    在这里插入图片描述

  4. 计算拥挤度
    i < n j i < _n j i<nj表示 i i i拥挤度支配 j j j
    i < n j      满足下面至少一个条件 i r a n k < j r a n k                      条件 1 i r a n k = j r a n k      a n d      i d i s t a n c e > j d i s t a n c e                    条件 2 i < _n j \;\;满足下面至少一个条件\\ i_{rank} < j_{rank} \;\;\; \;\;\;\;\;\;\;条件1\\ i_{rank} = j_{rank} \;\;and \;\; i_{distance} > j_{distance} \;\;\;\;\;\;\;\;\; 条件2 i<nj满足下面至少一个条件irank<jrank条件1irank=jrankandidistance>jdistance条件2
    将当前的个体按照目标函数进行排序
    在这里插入图片描述
    对于两个目标函数拥挤距离为长方形周长的 1 2 \frac{1}{2} 21
    1. 不需要计算全部拥挤度,只需要按照ranks来计算,只要个数达到N,拥挤度计算就可以停止了。
    2. 要对所有目标函数归一化。
    3. 第一个和最后一个个体的拥挤度为无穷,因为这两个点只有一边有值。
    伪代码
    在这里插入图片描述
    I [ i ] . m \mathcal{I[i]}.m I[i].m:表示集合中第 i i i个个体的第 m m m个目标函数值
    f m m a x f_m^{max} fmmax:表示种群中第 m m m个目标函数的最大值
    f m m i n f_m^{min} fmmin:表示种群中第 m m m个目标函数的最小值

  5. 相同的 r a n k rank rank比较拥挤度的时候采用的是锦标赛选择算子。

    • 确定每次选择的个体数量N。(二元锦标赛选择即选择2个个体,即K = 2)
    • 从种群中随机选择K个个体(每个个体被选择的概率相同) ,根据每个个体的适应度值,选择其中适应度值最好的个体加入到下一代种群集合中。
    • 重复步骤(2)多次(重复次数为种群的大小),直到新的种群规模达到N。

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

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

相关文章

Java入门练习题及其答案第一弹

Java入门练习题及其答案第一弹 文章目录Java入门练习题及其答案第一弹素数打印乘法口诀表最大公约数水仙花数二进制中1的个数二进制奇偶数位素数打印 只能被1和自己整除 import java.util.Scanner;public static void main(String[] args) {Scanner scanner new Scanner(Sys…

UI自动化测试-第一个测试脚本

前提 我们在进行UI自动化测试时&#xff0c;一般采用javaselenium或者pythonselenium的方式。由于python比较简单&#xff0c;上手快&#xff0c;因此建议大家采用pythonselenium的方式来进行UI自动化。 1、安装pycharm PyCharm是一种Python IDE&#xff08;Integrated Deve…

【OpenCV-Python】教程:7-5 理解SVM

OpenCV Python SVM 学习 【目标】 直观理解 SVM 【理论】 线性可分 下图有两种类型的数据&#xff0c;红色和蓝色。在kNN中&#xff0c;对于一个测试数据&#xff0c;我们用来测量它与所有训练样本的距离&#xff0c;并取距离最小的一个。测量所有的距离需要大量的时间&am…

计算距离春节还有多长时间

你知道距离春节&#xff0c;还剩下多少时间吗&#xff1f; 或许你已经在默默心算了。 可是&#xff0c;如果我想要精确一点的结果&#xff0c;比如精确到多少分钟、多少秒呢&#xff1f; 要怎么计算呢&#xff1f; 这里可以使用Python进行计算。 首先&#xff0c;需要导入…

Opencv项目实战:18 人体姿态检测

目录 0、项目介绍 1、效果展示 2、项目搭建 3、项目代码讲解与介绍 Basics.py PoseModule.py Example.py 人体姿态图​编辑 4、项目资源 5、项目总结 0、项目介绍 mediapipe中有人体姿态检测的功能&#xff0c;今天我们就将实现最最基础的人体姿态估计项目&#xff0c;它…

【C++】深拷贝和浅拷贝

目录 浅拷贝 深拷贝 字符串的构造 例有两个类的深拷贝&#xff1a; 浅拷贝 在类中&#xff0c;若我们不写拷贝构造函数&#xff0c;则程序会提供一个默认的拷贝构造函数&#xff0c;该函数为浅拷贝。 //默认拷贝构造 ---浅拷贝--值复制 类名(const 类名& 形参名) {成…

【实时数仓】DWS层之商品主题计算、地区主题表(FlinkSQL)

文章目录一 DWS层-商品主题计算1 把JSON字符串数据流转换为统一数据对象的数据流&#xff08;1&#xff09;转换订单宽表流数据&#xff08;2&#xff09;转换支付宽表流数据2 把统一的数据结构流合并为一个流&#xff08;1&#xff09;代码&#xff08;2&#xff09;测试3 设定…

216. 组合总和 III

216. 组合总和 III 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输…

3.2 Static Terrestrial Laser Scanners 静态地基激光扫描仪

本章节介绍的静态地基激光扫描系统指的是那些在一个固定位置的位置上对周边场景地物特征进行扫描的设备。该类型设备的扫描测量机制是&#xff0c;通过激光测距仪进行斜距测量&#xff0c;与此同时通过水平和竖直两个方向上同步运动的角度编码器来记录角度变化值&#xff08;如…

编译原理——正规式、NFA构造DFA

一、DFA和NFA的区别 NFA&#xff1a;非确定有限自动机 DFA&#xff1a;确定有限自动机 NFA在同一状态&#xff0c;可以有多条出边&#xff0c;DFA在同一状态&#xff0c;只能有一条出边&#xff1b; NFA的初态可以具有多个&#xff0c;DFA的初态是唯一的&#xff1b; 比如这个…

数据结构入门——栈和队列详解

栈和队列详解1 栈1.1 栈的概念及结构1.2 栈的实现1.3 支持动态增长的栈1.3.1 结构声明1.3.2 栈的初始化和销毁1.3.3 入栈和出栈操作1.3.4 栈的判空和元素个数2 队列2.1 队列的概念及结构2.2 队列的实现2.3 链表实现队列2.3.1 结构声明2.3.2 队列的初始化和销毁2.3.3 队列入队和…

【工作流Activiti7】4、Activiti7 结束/终止流程

1. 结束/终止 正在运行的流程实例 思路&#xff1a;跟回退一样的思路一样&#xff0c;直接从当前节点跳到结束节点&#xff08;EndEvent&#xff09; /*** 结束任务* param taskId 当前任务ID*/ public void endTask(String taskId) {// 当前任务Task task taskService…

Tomcat学习

文章目录1、Tomcat是什么&#xff1f;2、Tomcat安装部署java环境部署tomcat目录结构介绍webapps目录bin目录tomcat启停方式3、Tomcat配置文件tomcat-users.xmlserver.xml结构组件详情配置文件注释4、Tomcat端口5、JVM调优6、Tomcat启动慢解决7、Tomcat面试题目1.Tomcat的默认端…

npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

一、问题描述 首次用vscode运行vue项目时&#xff0c;报错&#xff1a; npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 二、解决 我的解决过程&#xff1a;检查是否安装node.js环境 已安装node 这样一来&#xff0c;真不知道怎么回事了。环境也没有…

五、Arduino IDE开发esp8266环境搭建

1、安装驱动程序 (1)安装USB转串口驱动程序。 (2)根据板载的USB转串口驱动芯片选择合适驱动安装。USB转串口芯片负责和电脑之间进行数据通信。 (3)常见USB转串口驱动 CP210x驱动:CP210x USB 至 UART 桥 VCP 驱动器 - 芯科科技 CH340驱动 2、Arduino IDE环境搭建 要想使用Ar…

数据结构与算法java实战篇--高级排序

目录 一.希尔排序 二.划分 三.快速排序 1. 快速排序的算法 2.选择枢纽 一.希尔排序 希尔排序是基于插入排序的算法来实现的&#xff0c;不同的是希尔排序是采用n-增量来实现排序&#xff0c;如下是希尔排序的图解&#xff1a; 希尔排序会先以n个增量对元素进行划分&#xf…

原神私服 grasscutter搭建及食用教程 v3.3

本教程搭建过程食用vmware虚拟机服务端搭建过程及其简单。照着教程操作即可。本次对应的版本是3.3的版本&#xff0c;后期会持续更新。 一.资源下载准备&#xff1a; 1.vmwera16虚拟机下载安装自己百度吧&#xff0c;非常简单。一路next安装完后再输入一个百度来的秘钥即可。…

【kafka】学习笔记(二)

学习笔记五、Kafka Broker5.1、在zookeeper的服务端存储的Kafka相关信息5.2、Kafka Broker 总体工作流程5.3、Kafka Broker 节点服役和退役5.3.1、节点服役5.3.2、节点退役5.4、Kafka Broker 副本5.4.1、副本信息5.4.3、Leader 选举流程5.4.3、 Leader 和 Follower 故障处理细节…

【OpenCV-Python】教程:7-6 SVM识别手写字符

OpenCV Python SVM 识别手写字符 【目标】 用 SVM 识别手写字符 【代码】 在kNN中&#xff0c;直接用的是像素亮度值&#xff0c;这次&#xff0c;我们将使用 Histogram of Oriented Gradients (HOG) 作为特征向量 import cv2 import numpy as npSZ 20 bin_n 16 # Numbe…

Python pandas有几千个库函数,你用过几个?(5)

上一篇链接&#xff1a; Python pandas有几千个库函数&#xff0c;你用过几个&#xff1f;&#xff08;4&#xff09;_Hann Yang的博客-CSDN博客 12个pandas子模块又包含310个库函数&#xff08;含类、方法、子模块&#xff09;&#xff1a; import pandas as pd funcs [_ …