29 lines
1.1 KiB
Python
29 lines
1.1 KiB
Python
|
import numpy as np
|
|||
|
import random
|
|||
|
|
|||
|
def select(individuals, sizepop):
|
|||
|
# 本函数对每一代种群中的染色体进行选择,以进行后面的交叉和变异
|
|||
|
# individuals input : 种群信息
|
|||
|
# sizepop input : 种群规模
|
|||
|
# opts input : 选择方法的选择
|
|||
|
# ret output : 经过选择后的种群
|
|||
|
# yuan=individuals;
|
|||
|
individuals['fitness'] = 1 / individuals.get('fitness')
|
|||
|
sumfitness = np.sum(individuals.get('fitness'))
|
|||
|
sumf = individuals.get('fitness') / sumfitness
|
|||
|
index = []
|
|||
|
for i in range(sizepop): # 转sizepop次轮盘
|
|||
|
pick = random.random()
|
|||
|
while pick == 0:
|
|||
|
pick = random.random()
|
|||
|
for j in range(sizepop):
|
|||
|
pick = pick - sumf[j]
|
|||
|
if pick < 0:
|
|||
|
index.append(j)
|
|||
|
break # 寻找落入的区间,此次转轮盘选中了染色体i,注意:在转sizepop次轮盘的过程中,有可能会重复选择某些染色体
|
|||
|
# index=unique(index);
|
|||
|
# individuals=yuan;
|
|||
|
individuals['chrom'] = individuals.get('chrom')[index, :]
|
|||
|
individuals['fitness'] = individuals.get('fitness')[index]
|
|||
|
ret = individuals
|
|||
|
return ret
|