def initChrom(self, NIND=None): """ 描述: 初始化种群染色体矩阵,NIND为所需要的个体数,并返回一个新的种群对象。 NIND可缺省,不缺省时,种群在初始化染色体矩阵前会把种群规模调整为NIND。 """ if NIND is not None: self.sizes = NIND # 重新设置种群规模 self.Chrom = ea.crtpc(self.Encoding, self.sizes, self.Field) # 生成染色体矩阵 self.ObjV = None self.FitnV = np.ones((self.sizes, 1)) self.CV = np.zeros((self.sizes, 1)) self.Phen = self.decoding() # 解码
def initChrom(self, NIND=None): """ 描述: 初始化种群染色体矩阵,NIND为所需要的个体数。 NIND可缺省,不缺省时,种群在初始化染色体矩阵前会把种群规模调整为NIND。 """ if NIND is not None: self.sizes = NIND # 重新设置种群规模 self.Chrom = ea.crtpc(self.Encoding, self.sizes, self.Field) # 生成染色体矩阵 self.Lind = self.Chrom.shape[1] # 计算染色体的长度 self.ObjV = None self.FitnV = None self.CV = None
def initChrom(self, NIND=None): """ 描述: 初始化种群染色体矩阵,NIND为所需要的个体数。 NIND可缺省,不缺省时,种群在初始化染色体矩阵前会把种群规模调整为NIND。 """ if NIND is not None: self.sizes = NIND # 重新设置种群规模 # 遍历各染色体矩阵进行初始化 for i in range(self.ChromNum): self.Chroms[i] = ea.crtpc(self.Encodings[i], self.sizes, self.Fields[i]) # 生成染色体矩阵 self.ObjV = None self.FitnV = np.ones((self.sizes, 1)) self.CV = np.zeros((self.sizes, 1)) self.Phen = self.decoding() # 解码
def initChrom(self, NIND=None): """ 描述: 初始化种群染色体矩阵,NIND为所需要的个体数。 NIND可缺省,不缺省时,种群在初始化染色体矩阵前会把种群规模调整为NIND。 """ if NIND is not None: self.sizes = NIND # 重新设置种群规模 # 遍历各染色体矩阵进行初始化 for i in range(self.ChromNum): self.Chroms[i] = ea.crtpc(self.Encodings[i], self.sizes, self.Fields[i]) # 生成染色体矩阵 self.Linds.append(self.Chroms[i].shape[1]) # 计算染色体的长度 self.ObjV = None self.FitnV = np.ones((self.sizes, 1)) # 默认适应度全为1 self.CV = None
def initChrom(self, NIND=None): """ 描述: 初始化种群染色体矩阵。 输入参数: NIND : int - (可选参数)用于修改种群规模。 当其不缺省时,种群在初始化染色体矩阵前会把种群规模调整为NIND。 输出参数: 无输出参数。 """ if NIND is not None: self.sizes = NIND # 重新设置种群规模 self.Chrom = ea.crtpc(self.Encoding, self.sizes, self.Field) # 生成染色体矩阵 self.Lind = self.Chrom.shape[1] # 计算染色体的长度 self.ObjV = None self.FitnV = None self.CV = None
NIND = 100 # 种群个体数目 Encoding = 'BG' MAXGEN = 70 # 最大遗传代数 maxormins = [-1] # 列表元素为1则表示对应的目标函数是最小化,元素为-1则表示对应的目标函数是最大化 selectStyle = 'rws' # 采用轮盘赌选择 recStyle = 'xovdp' # 采用两点交叉 mutStyle = 'mutbin' # 采用二进制染色体的变异算子 Lind = 64 # 计算染色体长度 pc = 0.9 # 交叉概率 pm = 1 / Lind # 变异概率 obj_trace = np.zeros((MAXGEN, 2)) # 定义目标函数值记录器 var_trace = np.zeros((MAXGEN, Lind)) # 染色体记录器,记录历代最优个体的染色体 """=========================开始遗传算法进化========================""" start_time = time.time() # 开始计时 Chrom = ea.crtpc(Encoding, NIND, FieldD) # 生成种群染色体矩阵 help(ea.ranking) for gen in range(MAXGEN): Phen = ea.bs2real(Chrom, FieldD) # 对种群进行解码(二进制转十进制) ObjV, CV = aim(Phen) # 求种群个体的目标函数值 FitnV = ea.ranking(maxormins * ObjV, CV) # 根据目标函数大小分配适应度值 # 记录 best_ind = np.argmax(FitnV) # 计算当代最优个体的序号 obj_trace[gen, 0] = np.sum(ObjV) / ObjV.shape[0] # 记录当代种群的目标函数均值 obj_trace[gen, 1] = ObjV[best_ind] # 记录当代种群最优个体目标函数值 var_trace[gen, :] = Chrom[best_ind, :] # 记录当代种群最优个体的染色体 SelCh = Chrom[ea.selecting(selectStyle, FitnV, NIND - 1), :] # 选择
NIND = 700 # 种群个体数目 MAXGEN = 70 # 最大遗传代数 GGAP = 0.9 # 代沟:说明子代与父代的重复率为0.1 PM = 1 #整条染色体的变异概率(每一位的变异概率=pm/染色体长度) selectStyle = 'sus' #采用随机抽样选择 recStyle = 'xovdp' #采用两点交叉 mutStyle = 'mutbin' #采用二进制染色体的变异算子 """=========================开始遗传算法进化========================""" FieldD = ga.crtfld(encoding, varTypes, ranges, borders, precisions, codes, scales) # 调用函数创建区域描述器 Lind = int(np.sum(FieldD[0, :])) # 计算编码后的染色体长度 Chrom = ga.crtpc(encoding, NIND, FieldD) # 根据区域描述器生成二进制种群 variable = ga.bs2real(Chrom, FieldD) #对初始种群进行解码 ObjV = aim(variable) # 计算初始种群个体的目标函数值 pop_trace = (np.zeros((MAXGEN, 2)) * np.nan) # 定义进化记录器,初始值为nan ind_trace = (np.zeros( (MAXGEN, Lind)) * np.nan) # 定义种群最优个体记录器,记录每一代最优个体的染色体,初始值为nan # 开始进化!! for gen in range(MAXGEN): FitnV = ga.ranking(-ObjV) # 根据目标函数大小分配适应度值(由于遵循目标最小化约定,因此最大化问题要对目标函数值乘上-1) SelCh = Chrom[ga.selecting(selectStyle, FitnV, NIND - 1)] # 选择,采用'sus'随机抽样选择 SelCh = ga.recombin(recStyle, SelCh, GGAP) # 重组(采用单点交叉方式,交叉概率为0.7) SelCh = ga.mutate(mutStyle, encoding, SelCh, PM) # 二进制种群变异 variable = ga.bs2real(Chrom, FieldD) # 对育种种群进行解码(二进制转十进制) ObjVSel = aim(variable) # 求育种个体的目标函数值 # 记录
def main(): """============================变量设置============================""" x1 = [50, 100] # 第一个决策变量范围 x2 = [50, 100] # 第二个决策变量范围 x3 = [50, 100] x4 = [50, 100] x5 = [50, 100] x6 = [50, 100] x7 = [50, 100] x8 = [50, 100] x9 = [50, 100] x10 = [50, 100] b1 = [1, 1] # 第一个决策变量边界,1表示包含范围的边界,0表示不包含 b2 = [1, 1] # 第二个决策变量边界,1表示包含范围的边界,0表示不包含 b3 = [1, 1] b4 = [1, 1] b5 = [1, 1] b6 = [1, 1] b7 = [1, 1] b8 = [1, 1] b9 = [1, 1] b10 = [1, 1] ranges = np.vstack([x1, x2, x3, x4, x5, x6, x7, x8, x9, x10]).T # 生成自变量的范围矩阵,使得第一行为所有决策变量的下界,第二行为上界 borders = np.vstack([b1, b2, b3, b4, b5, b6, b7, b8, b9, b10]).T # 生成自变量的边界矩阵 varTypes = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) # 决策变量的类型,0表示连续,1表示离散 """==========================染色体编码设置=========================""" Encoding = 'BG' # 'BG'表示采用二进制/格雷编码 codes = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 决策变量的编码方式,设置两个0表示两个决策变量均使用二进制编码 precisions = [4, 4, 4, 4, 4, 4, 4, 4, 4, 4] # 决策变量的编码精度,表示二进制编码串解码后能表示的决策变量的精度可达到小数点后6位 scales = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 0表示采用算术刻度,1表示采用对数刻度 FieldD = ea.crtfld(Encoding, varTypes, ranges, borders, precisions, codes, scales) # 调用函数创建译码矩阵 """=========================遗传算法参数设置========================""" NIND = 30 # 种群个体数目 MAXGEN = 30 # 最大遗传代数 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.bs2real(Chrom, FieldD) # 对初始种群进行解码 ObjV = minfun(variable) # 计算初始种群个体的目标函数值 FitnV = ea.ranking(maxormins * ObjV) # 根据目标函数大小分配适应度值 best_ind = np.argmax(FitnV) # 计算当代最优个体的序号 # 开始进化 for gen in range(MAXGEN): print(gen) 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, :], SelCh]) Phen = ea.bs2real(Chrom, FieldD) # 对种群进行解码(二进制转十进制) print(Phen) ObjV = minfun(Phen) # 求种群个体的目标函数值 FitnV = ea.ranking(maxormins * ObjV) # 根据目标函数大小分配适应度值 # 记录 best_ind = np.argmax(FitnV) # 计算当代最优个体的序号 obj_trace[gen, 0] = np.sum(ObjV) / ObjV.shape[0] # 记录当代种群的目标函数均值 obj_trace[gen, 1] = ObjV[best_ind] # 记录当代种群最优个体目标函数值 var_trace[gen, :] = Chrom[best_ind, :] # 记录当代种群最优个体的染色体 print(best_ind) # 进化完成 end_time = time.time() # 结束计时 ea.trcplot(obj_trace, [['种群个体平均目标函数值', '种群最优个体目标函数值']]) # 绘制图像 """============================输出结果============================""" best_gen = np.argmin(obj_trace[:, [1]]) print('最优解的目标函数值:', obj_trace[best_gen, 1]) variable = ea.bs2real(var_trace[[best_gen], :], FieldD) # 解码得到表现型(即对应的决策变量值) print('最优解的决策变量值为:') print(variable) print('用时:', end_time - start_time, '秒')
FieldD = ea.crtfld(Encoding, varTypess, ranges, borders, precisions, codes, scales) NIND = 20 MAXGEN = 100 maxorins = np.array([1]) selectStyle = 'sus' recStyle = 'xovdp' mutStyle = 'mutbin' Lind = int(np.sum(FieldD[0, :])) pc = 0.9 pm = 1 / Lind obj_trace = np.zeros((MAXGEN, 2)) var_trace = np.zeros((MAXGEN, Lind)) start_time = time.time() Chrom = ea.crtpc(Encoding, NIND, FieldD) variable = ea.bs2real(Chrom, FieldD) ObjV = aim(variable) best_ind = np.argmin(ObjV) for gen in range(MAXGEN): FitnV = ea.ranking(maxorins * ObjV) 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, :], SelCh]) Phen = ea.bs2real(Chrom, FieldD) ObjV = aim(Phen) best_ind = np.argmin(ObjV) obj_trace[gen, 0] = np.sum(ObjV) / ObjV.shape[0] obj_trace[gen, 1] = ObjV[best_ind]
import numpy as np from geatpy import crtpc from geatpy import bs2ri # help(crtpc) Nind = 4 # 种群规模 Encoding = 'RI' # 实整数编码 FieldDR = np.array([ [-3.1, -2, 0, 3], # 下界 [4.2, 2, 1, 5], # 上界 [0, 0, 1, 1] ]) # 0-连续 1-离散 Chrom = crtpc(Encoding, Nind, FieldDR) print(Chrom) # 使用二进制编码染色体 Nind = 4 Encoding = 'BG' 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)