原理
与单目标(遗传算法)最大的不同就是进行选择操作之前进行快速非支配排序,这一步也是为了选择操作而来的,选择哪些、怎么选是通过非快速支配排序来的。这就不像单目标,挑好的选就行了
支配: 在多目标优化问题中,如果个体p至少有一个目标比个体q好,而且个体p中的所有目标都不比个体q差,那么称个体p支配个体q。
序值: 如果p支配q,那么p的序值比q低。如果p和q互不支配,那么p和q有相同的序值。
拥挤距离:用来计算某前端中的某个体与该前端中其他个体之间的距离,用以表征个体间的拥挤程度。希望pareto解出来之后,点与点之间距离是相近的,不要太多的聚集在某个地方。用某个点与前后两个点之间的xy的距离和表示。算法会选择拥挤距离大的去领头。
快速非支配排序:快速非支配排序就是将解集分解为不同次序的Pareto前沿的过程。将一组解分成n个集合:rank1,rank2…rankn,每个集合中所有的解都互不支配,但ranki中的任意解支配rankj中的任意解(i<j).
代码
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib; matplotlib.use('TkAgg')
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
pop_size =400
max_gen = 200
#系数
cost_weight=np.array([0.077,0.077,0.077,0.089,0.089,0.089,0.087,0.087,0.087,0.089,0.101,0.099])
harm_weight=np.array([0.082,0.082,0.082,0.079,0.079,0.079,0.069,0.069,0.069,0.079,0.1,0.1])
fault_fre_weight=np.array([0.085,0.085,0.085,0.08,0.08,0.08,0.087,0.087,0.087,0.079,0.079,0.086])
#==========定义两个目标函数=============
# 定义函数1
def function1(solution):
value = np.dot(cost_weight,(1/(solution**2)))
return value
# 定义函数2 可靠性
def function2(solution):
solution = abs(solution)
value = np.dot(1/(harm_weight*(1-fault_fre_weight)),solution)
return value
#误差x的范围
accuracy_min=np.array([-9.7,-9.8,-10.2,-6.2,-6.8,-5.5,-6.6,-5.3,-4.8,-0.0247,-0.026,-0.0254])#12个
accuracy_max=np.array([20.3,20.2,19.8,13.8,13.2,14.5,13.4,14.7,15.2,0.0553,0.0540,0.0546])
# solution=[0 for i in range(12)]
#生成解集 相当于x 单位um
def create_x(pop_size