def decoding(self): """ 描述: 种群染色体解码。 """ if self.Encoding == 'BG': # 此时Field实际上为FieldD Phen = ea.bs2ri(self.Chrom, self.Field) # 把二进制转化为实整数 elif self.Encoding == 'RI' or self.Encoding == 'P': Phen = self.Chrom.copy() else: raise RuntimeError( 'error in Population.decoding: Encoding must be ' 'BG' ' or ' 'RI' ' or ' 'P' '. (编码设置有误,Encoding必须为' 'BG' ', ' 'RI' ' 或 ' 'P' '。)') return Phen
def decoding(self): """ 描述: 种群染色体解码。 """ Phen = np.ones((self.sizes, 0)) # 初始化一个空的矩阵 # 遍历各染色体矩阵进行解码 for i in range(self.ChromNum): if self.Encodings[i] == 'BG': # 此时Field实际上为FieldD tempPhen = ea.bs2ri(self.Chroms[i], self.Fields[i]) # 把二进制转化为实整数 elif self.Encodings[i] == 'RI' or self.Encodings[i] == 'P': tempPhen = self.Chroms[i].copy() else: raise RuntimeError( 'error in PsyPopulation.decoding: Encoding must be ' 'BG' ' or ' 'RI' ' or ' 'P' '. (编码设置有误,Encoding必须为' 'BG' ', ' 'RI' ' 或 ' 'P' '。)') Phen = np.hstack([Phen, tempPhen]) return Phen
# 种群个体数目 MAXGEN = 200 # 最大遗传代数 maxormins = [-1] # 列表元素为1则表示对应的目标函数是最小化,元素为-1则表示对应的目标函数是最大化 selectStyle = 'rws' # 采用轮盘赌选择 recStyle = 'xovdp' # 采用两点交叉 mutStyle = 'mutbin' # 采用二进制染色体的变异算子 pc = 0.7 # 交叉概率 pm = 1 # 整条染色体的变异概率(每一位的变异概率=pm/染色体长度) Lind = int(np.sum(FieldD[0, :])) # 计算染色体长度 obj_trace = np.zeros((MAXGEN, 2)) # 定义目标函数值记录器 var_trace = np.zeros((MAXGEN, Lind)) # 染色体记录器,记录历代最优个体的染色体 """=========================开始遗传算法进化========================""" start_time = time.time() # 开始计时 Chrom = ea.crtpc(Encoding, NIND, FieldD) # 生成种群染色体矩阵 variable = ea.bs2ri(Chrom, FieldD) # 对初始种群进行解码 CV = np.zeros( (NIND, 1)) # 初始化一个CV矩阵(此时因为未确定个体是否满足约束条件,因此初始化元素为0,暂认为所有个体是可行解个体) ObjV, CV = aimfunc(variable, CV) # 计算初始种群个体的目标函数值 FitnV = ea.ranking(maxormins * ObjV, CV) # 根据目标函数大小分配适应度值 best_ind = np.argmax(FitnV) # 计算当代最优个体的序号 # 开始进化 for gen in range(MAXGEN): SelCh = Chrom[ea.selecting(selectStyle, FitnV, NIND - 1), :] # 选择 SelCh = ea.recombin(recStyle, SelCh, pc) # 重组 SelCh = ea.mutate(mutStyle, Encoding, SelCh, pm) # 变异 # 把父代精英个体与子代的染色体进行合并,得到新一代种群 Chrom = np.vstack([Chrom[best_ind, :].astype(int), SelCh]) Phen = ea.bs2ri(Chrom, FieldD) # 对种群进行解码(二进制转十进制) ObjV, CV = aimfunc(Phen, CV) # 求种群个体的目标函数值 FitnV = ea.ranking(maxormins * ObjV, CV) # 根据目标函数大小分配适应度值
FieldD = np.array([ [3, 2], # 各决策变量编码后所占二进制位数--与决策变量范围以及精度相关,染色体长度为求和所得 [0, 0], # 下界 [7, 3], # 上界 [1, 1], # 编码方式 0--二进制 1--格雷码 [0, 0], # 是否采用对数刻度 0--算术刻度 1--对数刻度 [1, 1], # 范围是否包含下界 0--不含 1--包含 [1, 1], # 范围是否包含上界 0--不含 1--包含 [0, 0] ]) # 0--连续 1--离散 Chrom = crtpc(Encoding, Nind, FieldD) print(Chrom) # 解码,将二进制编码的矩阵转化为实数 help(bs2ri) Phen = bs2ri(Chrom, FieldD) print('表现型矩阵 = \n', Phen) def aim(Phen): x = Phen[:, [0]] y = Phen[:, [1]] CV = np.abs(x + y - 3) f = x + y return f, CV ObjV, CV = aim(Phen) print('目标函数矩阵:\n', ObjV) print('CV矩阵:\n', CV)