一、多目标优化的基本流程
·初始化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个及以上

&spm=1001.2101.3001.5002&articleId=134749475&d=1&t=3&u=ec9882b8d84c4ecebfbfda5ca041565e)

被折叠的 条评论
为什么被折叠?



