大家好,又见面了,我是你们的朋友全栈君。
思想:
要对拥挤距离进行计算,则需要根据每个目标函数对种群中的所有个体按升序进行排序。第一个和最后一个个体的拥挤距离设为无穷大,第i个个体的拥挤距离则设为第i+1和第i个体的所有目标函数值之差的和。具体方法如下面伪代码:
代码语言:javascript
复制
def crowding_distance_assignment( I )
nLen = len( I ) #I中的个体数量
for i in I:
i.distance = 0 #初始化所有个体的拥挤距离
for objFun in M: #M为所有目标函数的列表
I = sort( I, objFun ) #按照目标函数objFun进行升序排序
I[0] = I[ len[I]-1 ] = ∞ #对第一个和最后一个个体的距离设为无穷大
for i in xrange( 1, len(I) - 2 ):
I[i].distance = I[i].distance + ( objFun( I[i+1] ) - objFun( I[i-1] ) )/(Max(objFun()) - Min(objFun()) )
伪代码中的objFun( i )是对个体i求其目标函数值。Max(objFun())为目标函数objFun()的最大值,Min(objFun())为目标函数objFun的最小值。其复杂度为O(MNlogN)。
NSGA2算法的主体循环部分:
(1)随机初始化开始种群P0。并对P0进行非支配排序,初始化每个个体的rank值。
(2). t = 0
(3).通过二进制锦标赛法从Pt选择个体,并进行交叉和变异操作,产生新一代种群Qt。
(4) 计算新种群的obj值,
(5).通过合并Pt 和 Qt 产生出组合种群Rt = Pt UQt 。
(6).对Rt进行非支配排序,并通过排挤和精英保留策略选出N个个体,组成新一代种群Pt+1。
(7).跳转到步骤3,并循环,直至满足结束条件。
步骤5伪代码:
代码语言:javascript
复制
while condition:
Rt = Pt + Qt
F = fast_nondominate_sort( Rt )
Pt+1 = [ ]
i = 0
while len(Pt+1) + len( F[i] ) < N:
crowding_distance_assignment( F[i] )
Pt+1 += F[i]
i += 1
Pt+1 += F[i][0:N-len(Pt+1)]
Qt+1 = make_new_generation( Pt+1 )
t = t+1
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144551.html原文链接:https://javaforall.cn