多目标进化算法——NSGA-II(python实现)

一、多目标优化的基本流程

        ·初始化N个个体(也就是N个解)

        ·计算适应值(也就是函数值,多目标也就是有多个函数值\适应值)

        ·利用旧的个体产生新的个体

                --各种策略:遗传算法、粒子群、模拟退火等等,只是这里是遗传算法GA

        ·通过对比选择得到新一轮的个体

                --Rank,非支配排序,得到一层一层的非支配解

                --对于同一个Rank内的排序,通过拥挤度来排序,拥挤度越大越好

        ·循环到你希望它循环的那个次数

二、代码实现

·Individual,定义了一个individual类,表示一个个体,包含了一些基本的属性和方法,用于表示解向量、目标函数、支配关系等

·fast_non_dominated_sort(P),对于种群P进行快速非支配排序

·crowding_distance_assignment(L),为一层Rank中的个体计算拥挤度距离

·KUP(x),目标函数

"""
多目标进化算法——NSGA-II(python实现)
--解决的是多目标的数学函数,有两个不同的输出结果
"""
from collections import defaultdict
import numpy as np
import random
import matplotlib.pyplot as plt
import math

#note:定义了一个individual类,表示一个个体,包含了一些基本的属性和方法,用于表示解向量、目标函数、支配关系等
class Individual(object):
    def __init__(self):
        # 初始化一个个体的实例,有下面几个属性:
        self.solution = None  # 实际赋值中是一个 nparray 类型,方便进行四则运算,用于存储解向量
        self.objective = defaultdict()  # 属性用于存储目标函数值 在多目标优化问题中
        # 通常有多个目标函数需要优化self.objective 就是一个包含多个目标函数值的字典

        self.n = 0  # 解p被几个解所支配,是一个数值(左下部分点的个数)
        self.rank = 0  # 解所在第几层
        self.S = []  # 解p支配哪些解,是一个解集合(右上部分点的内容)
        self.distance = 0  # 拥挤度距离

    def bound_process(self, bound_min, bound_max):
        """
        对解向量 solution 中的每个分量进行定义域判断,超过最大值,将其赋值为最大值;小于最小值,赋值为最小值
        :param bound_min: 定义域下限
        :param bound_max:定义域上限
        :return:
        """
        for i, item in enumerate(self.solution):
            if item > bound_max:
                self.solution[i] = bound_max
            elif item < bound_min:
                self.solution[i] = bound_min

    def calculate_objective(self, objective_fun):
        # 这个方法的目的是将解向量转化为目标函数的值 objective_fun 可能是一个返回多个目标函数值的函数。
        # 调用 calculate_objective(objective_fun) 计算个体的目标函数值,并将结果存储在 self.objective 中,以便进一步使用。
        self.objective = objective_fun(self.solution)

    # 重载小于号“<”,支配关系比较
    def __lt__(self, other):
        # 获取两个个体的目标函数值,分别存储在 v1 和 v2 中
        v1 = list(self.objective.values())
        v2 = list(other.objective.values())
        # 逐个比较对应位置的值
        for i in range(len(v1)):
            if v1[i] > v2[i]:
                return 0  # 但凡有一个位置是 v1大于v2的 直接返回0,如果相等的话比较下一个目标值
        return 1
    # 如果目标函数是3个及以上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值