geatpy icon indicating copy to clipboard operation
geatpy copied to clipboard

关于多种群进化案例中

Open zzzmmp opened this issue 2 years ago • 2 comments

所使用的soea_multi_SEGA_templet进化模板中,最后一个种群的变异率设置为1是否过大?里面使用了压缩变异算子,关于这个算子是否必须要用比较大的变异率?烦请老师解释一下具体原因。

zzzmmp avatar Dec 16 '21 13:12 zzzmmp

默认的变异概率是1 / self.problem.Dim,而不是1。

geatpy-dev avatar Dec 17 '21 15:12 geatpy-dev

def init(self, problem, population): ea.SoeaAlgorithm.init(self, problem, population) # 先调用父类构造方法 if type(population) != list: raise RuntimeError('传入的种群对象列表必须为list类型') self.name = 'multi-SEGA' self.PopNum = len(population) # 种群数目 self.selFunc = 'tour' # 锦标赛选择算子 self.migFr = 5 # 发生种群迁移的间隔代数 self.migOpers = ea.Migrate(MIGR=0.2, Structure=2, Select=1, Replacement=2) # 生成种群迁移算子对象 # 为不同的种群设置不同的重组、变异算子 self.recOpers = [] self.mutOpers = [] Pms = np.linspace(1 / self.problem.Dim, 1, self.PopNum) # 生成变异概率列表,为不同的种群分配不同的变异概率 Pcs = np.linspace(0.7, 1, self.PopNum) # 生成重组概率列表,为不同的种群分配不同的重组概率 for i in range(self.PopNum): # 遍历种群列表 pop = population[i] # 得到当前种群对象 if pop.Encoding == 'P': recOper = ea.Xovpmx(XOVR=Pcs[i]) # 生成部分匹配交叉算子对象 mutOper = ea.Mutinv(Pm=float(Pms[i])) # 生成逆转变异算子对象 else: recOper = ea.Xovdp(XOVR=Pcs[i]) # 生成两点交叉算子对象 if pop.Encoding == 'BG': mutOper = ea.Mutbin(Pm=float(Pms[i])) # 生成二进制变异算子对象 elif pop.Encoding == 'RI': mutOper = ea.Mutbga(Pm=float(Pms[i]), MutShrink=0.5, Gradient=20) # 生成breeder GA变异算子对象 else: raise RuntimeError('编码方式必须为''BG''、''RI''或''P''.') self.recOpers.append(recOper) self.mutOpers.append(mutOper)

老师您好,这个是多种群最后一个种群设置的变异率为1,请问是否设置过大和使用了压缩变异算子有关

zzzmmp avatar Dec 18 '21 01:12 zzzmmp