예제 #1
0
    def run(self):
        #==========================初始化配置===========================
        problem = self.problem
        population = self.population
        NIND = population.sizes
        MAXSIZE = self.MAXSIZE
        if MAXSIZE is None:  # 检查MAXSIZE,默认取2倍的种群规模
            MAXSIZE = 2 * NIND
        aimFuc = problem.aimFuc  # 获取目标函数地址
        #===========================准备进化============================
        self.timeSlot = time.time()  # 开始计时
        if population.Chrom is None:
            population.initChrom(NIND)  # 初始化种群染色体矩阵(内含解码,详见Population类的源码)
        population.ObjV, population.CV = aimFuc(population.Phen,
                                                population.CV)  # 计算种群的目标函数值
        population.FitnV, NDSet = updateNDSet(population, problem.maxormins,
                                              MAXSIZE)  # 计算适应度和得到全局非支配种群
        self.evalsNum = population.sizes  # 记录评价次数
        #===========================开始进化============================
        self.currentGen = 0
        while self.terminated(NDSet, population) == False:
            uniChrom = np.unique(NDSet.Chrom, axis=0)
            repRate = 1 - uniChrom.shape[0] / NDSet.sizes  # 计算NDSet中的重复率
            # 选择基个体去进化形成子代
            offspring = population[ea.selecting(self.selFunc, population.FitnV,
                                                NIND)]
            # 对育种种群进行进化操作
            offspring.Chrom = ea.recombin(self.recFunc, offspring.Chrom,
                                          self.pc)  #重组
            offspring.Chrom = ea.mutate(self.mutFunc, offspring.Encoding,
                                        offspring.Chrom, offspring.Field,
                                        self.pm)  # 变异
            if population.Encoding != 'B' and population.Encoding != 'G' and repRate > 0.1:
                offspring.Chrom = ea.mutate('mutgau', offspring.Encoding,
                                            offspring.Chrom, offspring.Field,
                                            self.pm, False,
                                            3)  # 高斯变异,对标准差放大3倍。
            offspring.Phen = offspring.decoding()  # 染色体解码
            offspring.ObjV, offspring.CV = aimFuc(offspring.Phen,
                                                  offspring.CV)  # 求进化后个体的目标函数值
            self.evalsNum += offspring.sizes  # 更新评价次数
            # 父代种群和育种种群合并
            population = population + offspring
            population.FitnV, NDSet = updateNDSet(population,
                                                  problem.maxormins, MAXSIZE,
                                                  NDSet)  # 计算合并种群的适应度及更新NDSet
            # 保留个体到下一代
            population = population[ea.selecting('dup', population.FitnV,
                                                 NIND)]  # 选择,保留NIND个个体
        NDSet = NDSet[np.where(np.all(NDSet.CV <= 0, 1))[0]]  # 最后要彻底排除非可行解
        self.passTime += time.time() - self.timeSlot  # 更新用时记录
        #=========================绘图及输出结果=========================
        if self.drawing != 0:
            ea.moeaplot(NDSet.ObjV, True)

        # 返回帕累托最优集以及执行时间
        return NDSet
예제 #2
0
 def run(self):
     #==========================初始化配置===========================
     problem = self.problem
     population = self.population
     NIND = population.sizes
     MAXSIZE = self.MAXSIZE
     if MAXSIZE is None:  # 检查MAXSIZE,默认取2倍的种群规模
         MAXSIZE = 2 * NIND
     self.initialization()  # 初始化算法模板的一些动态参数
     #===========================准备进化============================
     population.initChrom(NIND)  # 初始化种群染色体矩阵(内含解码,详见Population类的源码)
     self.problem.aimFunc(population)  # 计算种群的目标函数值
     NDSet = updateNDSet(population, problem.maxormins,
                         MAXSIZE)  # 计算适应度和得到全局非支配种群
     self.evalsNum = population.sizes  # 记录评价次数
     #===========================开始进化============================
     while self.terminated(population) == False:
         # 选择个体去进化形成子代
         offspring = population[ea.selecting(self.selFunc, population.FitnV,
                                             NIND)]
         # 进行进化操作,分别对各个种群染色体矩阵进行重组和变异
         for i in range(population.ChromNum):
             uniChrom = np.unique(NDSet.Chroms[i], axis=0)
             repRate = 1 - uniChrom.shape[0] / NDSet.sizes  # 计算NDSet中的重复率
             offspring.Chroms[i] = ea.recombin(self.recFuncs[i],
                                               offspring.Chroms[i],
                                               self.pcs[i])  #重组
             offspring.Chroms[i] = ea.mutate(self.mutFuncs[i],
                                             offspring.Encodings[i],
                                             offspring.Chroms[i],
                                             offspring.Fields[i],
                                             self.pms[i])  # 变异
             if population.Encodings[i] == 'RI' and repRate > 0.1:
                 offspring.Chroms[i] = ea.mutate('mutgau',
                                                 offspring.Encodings[i],
                                                 offspring.Chroms[i],
                                                 offspring.Fields[i],
                                                 self.pms[i], False,
                                                 3)  # 高斯变异,对标准差放大3倍。
         offspring.Phen = offspring.decoding()  # 染色体解码
         self.problem.aimFunc(offspring)  # 求进化后个体的目标函数值
         self.evalsNum += offspring.sizes  # 更新评价次数
         # 父代种群和育种种群合并
         population = population + offspring
         NDSet = updateNDSet(population, problem.maxormins, MAXSIZE,
                             NDSet)  # 计算合并种群的适应度及更新NDSet
         # 保留个体到下一代
         population = population[ea.selecting('dup', population.FitnV,
                                              NIND)]  # 选择,保留NIND个个体
     NDSet = NDSet[np.where(np.all(NDSet.CV <= 0, 1))[0]]  # 最后要彻底排除非可行解
     self.passTime += time.time() - self.timeSlot  # 更新用时记录
     #=========================绘图及输出结果=========================
     if self.drawing != 0:
         ea.moeaplot(NDSet.ObjV, 'Pareto Front', True)
     # 返回帕累托最优集
     return NDSet
    def run(self):
        #==========================初始化配置===========================
        population = self.population
        self.initialization()  # 初始化算法模板的一些动态参数
        #===========================准备进化============================
        uniformPoint, NIND = ea.crtup(self.problem.M,
                                      population.sizes)  # 生成在单位目标维度上均匀分布的参考点集
        population.initChrom(
            NIND
        )  # 初始化种群染色体矩阵(内含解码,详见Population类的源码),此时种群规模将调整为uniformPoint点集的大小,initChrom函数会把种群规模给重置
        self.problem.aimFunc(population)  # 计算种群的目标函数值
        self.evalsNum = population.sizes  # 记录评价次数
        #===========================开始进化============================
        while self.terminated(population) == False:
            # 选择个体参与进化
            offspring = population[ea.selecting(self.selFunc, population.FitnV,
                                                NIND)]
            # 进行进化操作,分别对各个种群染色体矩阵进行重组和变异
            for i in range(population.ChromNum):
                offspring.Chroms[i] = ea.recombin(self.recFuncs[i],
                                                  offspring.Chroms[i],
                                                  self.pcs[i])  #重组
                offspring.Chroms[i] = ea.mutate(self.mutFuncs[i],
                                                offspring.Encodings[i],
                                                offspring.Chroms[i],
                                                offspring.Fields[i],
                                                self.pms[i])  # 变异
            offspring.Phen = offspring.decoding()  # 解码
            self.problem.aimFunc(offspring)  # 求进化后个体的目标函数值
            self.evalsNum += offspring.sizes  # 更新评价次数
            # 重插入生成新一代种群
            population = self.reinsertion(population, offspring, NIND,
                                          uniformPoint)

        return self.finishing(population)  # 调用finishing完成后续工作并返回结果
예제 #4
0
 def run(self):
     #==========================初始化配置===========================
     population = self.population
     self.initialization() # 初始化算法模板的一些动态参数
     #===========================准备进化============================
     uniformPoint, NIND = ea.crtup(self.problem.M, population.sizes) # 生成在单位目标维度上均匀分布的参考点集
     if population.Chrom is None or population.sizes != NIND:
         population.initChrom(NIND) # 初始化种群染色体矩阵(内含解码,详见Population类的源码),此时种群规模将调整为uniformPoint点集的大小,initChrom函数会把种群规模给重置
     else:
         population.Phen = population.decoding() # 染色体解码
     self.problem.aimFunc(population) # 计算种群的目标函数值
     self.evalsNum = population.sizes # 记录评价次数
     #===========================开始进化============================
     while self.terminated(population) == False:
         # 进行差分进化操作
         r0 = ea.selecting(self.selFunc, population.FitnV, NIND) # 得到基向量索引
         offspring = population.copy() # 存储子代种群
         offspring.Chrom = ea.mutate(self.mutFunc, offspring.Encoding, offspring.Chrom, offspring.Field, r0, self.F, 1) # 差分变异
         tempPop = population + offspring # 当代种群个体与变异个体进行合并(为的是后面用于重组)
         offspring.Chrom = ea.recombin(self.recFunc, tempPop.Chrom, self.pc, True) # 重组
         # 求进化后个体的目标函数值
         offspring.Phen = offspring.decoding() # 染色体解码
         self.problem.aimFunc(offspring) # 计算目标函数值
         self.evalsNum += offspring.sizes # 更新评价次数
         # 重插入生成新一代种群
         population = self.reinsertion(population, offspring, NIND, uniformPoint)
         
     return self.finishing(population) # 调用finishing完成后续工作并返回结果
    def run(self):
        #==========================初始化配置===========================
        population = self.population
        NIND = population.sizes
        self.initialization()  # 初始化算法模板的一些动态参数
        #===========================准备进化============================
        population.initChrom()  # 初始化种群染色体矩阵(内含解码,详见Population类的源码)
        self.problem.aimFunc(population)  # 计算种群的目标函数值
        self.evalsNum = population.sizes  # 记录评价次数
        [levels,
         criLevel] = self.ndSort(self.problem.maxormins * population.ObjV,
                                 NIND, None, population.CV)  # 对NIND个个体进行非支配分层
        population.FitnV[:, 0] = 1 / levels  # 直接根据levels来计算初代个体的适应度
        #===========================开始进化============================
        while self.terminated(population) == False:
            # 选择个体参与进化
            offspring = population[ea.selecting(self.selFunc, population.FitnV,
                                                NIND)]
            # 进行进化操作,分别对各个种群染色体矩阵进行重组和变异
            for i in range(population.ChromNum):
                offspring.Chroms[i] = ea.recombin(self.recFuncs[i],
                                                  offspring.Chroms[i],
                                                  self.pcs[i])  #重组
                offspring.Chroms[i] = ea.mutate(self.mutFuncs[i],
                                                offspring.Encodings[i],
                                                offspring.Chroms[i],
                                                offspring.Fields[i],
                                                self.pms[i])  # 变异
            offspring.Phen = offspring.decoding()  # 解码
            self.problem.aimFunc(offspring)  # 求进化后个体的目标函数值
            self.evalsNum += offspring.sizes  # 更新评价次数
            # 重插入生成新一代种群
            population = self.reinsertion(population, offspring, NIND)

        return self.finishing(population)  # 调用finishing完成后续工作并返回结果
예제 #6
0
    def run(self):
        #==========================初始化配置===========================
        population = self.population
        NIND = population.sizes
        self.initialization()  # 初始化算法模板的一些动态参数
        #===========================准备进化============================
        if population.Chrom is None:
            population.initChrom()  # 初始化种群染色体矩阵(内含解码,详见Population类的源码)
        self.problem.aimFunc(population)  # 计算种群的目标函数值
        self.evalsNum = population.sizes  # 记录评价次数
        [levels,
         criLevel] = self.ndSort(self.problem.maxormins * population.ObjV,
                                 NIND, None, population.CV)  # 对NIND个个体进行非支配分层
        population.FitnV[:, 0] = 1 / levels  # 直接根据levels来计算初代个体的适应度
        #===========================开始进化============================
        while self.terminated(population) == False:
            # 进行差分进化操作
            r0 = ea.selecting(self.selFunc, population.FitnV, NIND)  # 得到基向量索引
            offspring = population.copy()  # 存储子代种群
            offspring.Chrom = ea.mutate(self.mutFunc, offspring.Encoding,
                                        offspring.Chrom, offspring.Field, r0,
                                        self.F, 1)  # 差分变异
            tempPop = population + offspring  # 当代种群个体与变异个体进行合并(为的是后面用于重组)
            offspring.Chrom = ea.recombin(self.recFunc, tempPop.Chrom, self.pc,
                                          True)  # 重组
            # 求进化后个体的目标函数值
            offspring.Phen = offspring.decoding()  # 染色体解码
            self.problem.aimFunc(offspring)
            self.evalsNum += offspring.sizes  # 更新评价次数
            # 重插入生成新一代种群
            population = self.reinsertion(population, offspring, NIND)

        return self.finishing(population)  # 调用finishing完成后续工作并返回结果
예제 #7
0
 def run(self):
     #==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     self.initialization() # 初始化算法模板的一些动态参数
     #===========================准备进化============================
     population.initChrom(NIND) # 初始化种群染色体矩阵(内含染色体解码,详见Population类的源码)
     self.problem.aimFunc(population) # 计算种群的目标函数值
     population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV, population.CV) # 计算适应度
     self.evalsNum = population.sizes # 记录评价次数
     #===========================开始进化============================
     while self.terminated(population) == False:
         bestIndi = population[np.argmax(population.FitnV, 0)] # 得到当代的最优个体
         # 选择
         offspring = population[ea.selecting(self.selFunc, population.FitnV, NIND - 1)]
         # 进行进化操作,分别对各种编码的染色体进行重组和变异
         for i in range(population.ChromNum):
             offspring.Chroms[i] = ea.recombin(self.recFuncs[i], offspring.Chroms[i], self.pcs[i]) # 重组
             offspring.Chroms[i] = ea.mutate(self.mutFuncs[i], offspring.Encodings[i], offspring.Chroms[i], offspring.Fields[i], self.pms[i]) # 变异
         # 求进化后个体的目标函数值
         offspring.Phen = offspring.decoding() # 染色体解码
         self.problem.aimFunc(offspring) # 计算目标函数值
         self.evalsNum += offspring.sizes # 更新评价次数
         population = bestIndi + offspring # 更新种群
         population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV, population.CV) # 计算适应度
     
     return self.finishing(population) # 调用finishing完成后续工作并返回结果
예제 #8
0
 def run(self):
     #==========================初始化配置===========================
     population = self.population
     self.initialization() # 初始化算法模板的一些动态参数
     #===========================准备进化============================
     uniformPoint, NIND = ea.crtup(self.problem.M, population.sizes) # 生成在单位目标维度上均匀分布的参考点集
     refPoint = uniformPoint.copy() # 初始化参考点为uniformPoint
     if population.Chrom is None or population.sizes != NIND:
         population.initChrom(NIND)   # 初始化种群染色体矩阵(内含解码,详见Population类的源码),此时种群规模将调整为uniformPoint点集的大小,initChrom函数会把种群规模给重置
     self.problem.aimFunc(population) # 计算种群的目标函数值
     self.evalsNum = population.sizes # 记录评价次数
     #===========================开始进化============================
     while self.terminated(population) == False:
         # 选择个体参与进化
         offspring = population[ea.selecting(self.selFunc, population.FitnV, NIND)]
         # 对选出的个体进行进化操作
         offspring.Chrom = ea.recombin(self.recFunc, offspring.Chrom, self.pc) # 重组
         offspring.Chrom = ea.mutate(self.mutFunc, offspring.Encoding, offspring.Chrom, offspring.Field, self.pm) # 变异
         offspring.Phen = offspring.decoding() # 解码
         self.problem.aimFunc(offspring) # 求进化后个体的目标函数值
         self.evalsNum += offspring.sizes # 更新评价次数
         # 重插入生成新一代种群
         population = self.reinsertion(population, offspring, refPoint)
         # 修改refPoint
         if (self.currentGen) % np.ceil(self.fr * self.MAXGEN) == 0:
             refPoint = uniformPoint * (np.max(population.ObjV, 0) - np.min(population.ObjV, 0))
             self.Gamma = None # 重置Gamma为None
         
     return self.finishing(population) # 调用finishing完成后续工作并返回结果
예제 #9
0
 def run(self):
     #==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     self.initialization() # 初始化算法模板的一些动态参数
     #===========================准备进化============================
     population.initChrom(NIND) # 初始化种群染色体矩阵(内含染色体解码,详见PsyPopulation类的源码)
     self.problem.aimFunc(population) # 计算种群的目标函数值
     population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV, population.CV) # 计算适应度
     self.evalsNum = population.sizes # 记录评价次数
     #===========================开始进化============================
     while self.terminated(population) == False:
         bestIdx = np.argmax(population.FitnV, axis = 0) # 得到当代的最优个体的索引, 设置axis=0可使得返回一个向量
         studPop = population[np.tile(bestIdx, (NIND//2))] # 复制最优个体NIND//2份,组成一个“种马种群”
         restPop = population[np.where(np.array(range(NIND)) != bestIdx)[0]] # 得到除去精英个体外其它个体组成的种群
         # 选择个体,以便后面与种马种群进行交配
         tempPop = restPop[ea.selecting(self.selFunc, restPop.FitnV, (NIND - studPop.sizes))]
         # 将种马种群与选择出来的个体进行合并
         population = studPop + tempPop
         # 进行进化操作,分别对各种编码的染色体进行重组和变异
         for i in range(population.ChromNum):
             population.Chroms[i] = ea.recombin(self.recFuncs[i], population.Chroms[i], self.pcs[i]) # 重组
             population.Chroms[i] = ea.mutate(self.mutFuncs[i], population.Encodings[i], population.Chroms[i], population.Fields[i], self.pms[i]) # 变异
         # 求进化后个体的目标函数值
         population.Phen = population.decoding() # 染色体解码
         self.problem.aimFunc(population)
         self.evalsNum += population.sizes # 更新评价次数
         population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV, population.CV) # 计算适应度
     
     return self.finishing(population) # 调用finishing完成后续工作并返回结果
예제 #10
0
 def run(self):
     #==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     self.initialization() # 初始化算法模板的一些动态参数
     #===========================准备进化============================
     if population.Chrom is None:
         population.initChrom(NIND) # 初始化种群染色体矩阵(内含染色体解码,详见Population类的源码)
     else:
         population.Phen = population.decoding() # 染色体解码
     self.problem.aimFunc(population) # 计算种群的目标函数值
     population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV, population.CV) # 计算适应度
     self.evalsNum = population.sizes # 记录评价次数
     #===========================开始进化============================
     while self.terminated(population) == False:
         # 进行差分进化操作
         r0 = ea.selecting('ecs', population.FitnV, NIND) # 得到基向量索引,采用ecs复制精英个体索引
         experimentPop = population.copy() # 存储试验个体
         experimentPop.Chrom = ea.mutate(self.mutFunc, experimentPop.Encoding, experimentPop.Chrom, experimentPop.Field, r0, self.F, 1) # 差分变异
         tempPop = population + experimentPop # 当代种群个体与变异个体进行合并(为的是后面用于重组)
         experimentPop.Chrom = ea.recombin(self.recFunc, tempPop.Chrom, self.pc, True) # 重组
         # 求进化后个体的目标函数值
         experimentPop.Phen = experimentPop.decoding() # 染色体解码
         self.problem.aimFunc(experimentPop) # 计算目标函数值
         self.evalsNum += experimentPop.sizes # 更新评价次数
         tempPop = population + experimentPop # 临时合并,以调用otos进行一对一生存者选择
         tempPop.FitnV = ea.scaling(self.problem.maxormins * tempPop.ObjV, tempPop.CV) # 计算适应度
         population = tempPop[ea.selecting('otos', tempPop.FitnV, NIND)] # 采用One-to-One Survivor选择,产生新一代种群
     
     return self.finishing(population) # 调用finishing完成后续工作并返回结果
예제 #11
0
 def run(self):
     #==========================初始化配置===========================
     population = self.population
     self.initialization() # 初始化算法模板的一些动态参数
     #===========================准备进化============================
     uniformPoint, NIND = ea.crtup(self.problem.M, population.sizes) # 生成在单位目标维度上均匀分布的参考点集
     refPoint = np.vstack([uniformPoint, np.random.rand(NIND, self.problem.M)]) # 初始化参考点(详见注释中的参考文献)
     if population.Chrom is None or population.sizes != NIND:
         population.initChrom(NIND)   # 初始化种群染色体矩阵(内含解码,详见Population类的源码),此时种群规模将调整为uniformPoint点集的大小,initChrom函数会把种群规模给重置
     else:
         population.Phen = population.decoding() # 染色体解码
     self.problem.aimFunc(population) # 计算种群的目标函数值
     self.evalsNum = population.sizes # 记录评价次数
     #===========================开始进化============================
     while self.terminated(population) == False:
         # 选择个体参与进化
         offspring = population[ea.selecting(self.selFunc, population.FitnV, NIND)]
         # 对选出的个体进行进化操作
         offspring.Chrom = ea.recombin(self.recFunc, offspring.Chrom, self.pc) # 重组
         offspring.Chrom = ea.mutate(self.mutFunc, offspring.Encoding, offspring.Chrom, offspring.Field, self.pm) # 变异
         offspring.Phen = offspring.decoding() # 解码
         self.problem.aimFunc(offspring) # 求进化后个体的目标函数值
         self.evalsNum += offspring.sizes # 更新评价次数
         # 重插入生成新一代种群
         population = self.reinsertion(population, offspring, refPoint)            
         # 修改refPoint
         refPoint[NIND:, :] = self.renewRefPoint(population.ObjV, refPoint[NIND:, :])
         if (self.currentGen) % np.ceil(self.fr * self.MAXGEN) == 0:
             refPoint[:NIND, :] = uniformPoint * (np.max(population.ObjV, 0) - np.min(population.ObjV, 0))
         
     # 后续处理,限制种群规模(因为此时种群规模有可能大于NIND)
     [levels, criLevel] = self.ndSort(self.problem.maxormins * population.ObjV, NIND, None, population.CV) # 对NIND个个体进行非支配分层
     population = population[ea.refselect(self.problem.maxormins * population.ObjV, levels, criLevel, NIND, uniformPoint)] # 根据参考点选择个体
     
     return self.finishing(population) # 调用finishing完成后续工作并返回结果
예제 #12
0
    def Evolution(self):
        start_time = time.time()
        Objv = self.get_Objv_i(self.chrom)
        best_ind = np.argmax(Objv * self.maxormins)

        for gen in range(self.MAXGEN):
            self.log.logger.info('==> This is No.%d GEN <==' % (gen))
            FitnV = ea.ranking(Objv * self.maxormins)
            Selch = self.chrom[ea.selecting('rws', FitnV, self.Nind - 1), :]
            Selch = ea.recombin('xovsp', Selch, self.xov_rate)
            Selch = ea.mutate('mutswap', 'RI', Selch, self.FieldDR)

            NewChrom = np.vstack((self.chrom[best_ind, :], Selch))
            Objv = self.get_Objv_i(NewChrom)
            best_ind = np.argmax(Objv * self.maxormins)

            self.obj_trace[gen, 0] = np.sum(Objv) / self.Nind  #记录当代种群的目标函数均值
            self.obj_trace[gen, 1] = Objv[best_ind]  #记录当代种群最有给他目标函数值
            self.var_trace[gen, :] = NewChrom[best_ind, :]  #记录当代种群最有个体的变量值
            self.log.logger.info(
                'GEN=%d,best_Objv=%.5f,best_chrom_i=%s\n' %
                (gen, Objv[best_ind], str(
                    NewChrom[best_ind, :])))  #记录每一代的最大适应度值和个体

        end_time = time.time()
        self.time = end_time - start_time
예제 #13
0
    def run(self):
        #==========================初始化配置===========================
        population = self.population
        NIND = population.sizes
        self.initialization()  # 初始化算法模板的一些动态参数
        #===========================准备进化============================
        if population.Chrom is None:
            population.initChrom()  # 初始化种群染色体矩阵(内含解码,详见Population类的源码)
        self.problem.aimFunc(population)  # 计算种群的目标函数值
        self.evalsNum = population.sizes  # 记录评价次数
        #===========================开始进化============================
        while self.terminated(population) == False:
            # 选择基个体
            offspring = population[ea.selecting(self.selFunc, population.FitnV,
                                                NIND)]
            # 对选出的个体进行进化操作
            offspring.Chrom = ea.recombin(self.recFunc, offspring.Chrom,
                                          self.pc)  #重组
            offspring.Chrom = ea.mutate(self.mutFunc, offspring.Encoding,
                                        offspring.Chrom, offspring.Field,
                                        self.pm)  # 变异
            offspring.Phen = offspring.decoding()  # 解码
            self.problem.aimFunc(offspring)  # 求进化后个体的目标函数值
            self.evalsNum += offspring.sizes  # 更新评价次数
            # 重插入生成新一代种群
            population = self.reinsertion(population, offspring, NIND)

        return self.finishing(population)  # 调用finishing完成后续工作并返回结果
예제 #14
0
    def run(self):
        #==========================初始化配置===========================
        population = self.population
        NIND = population.sizes
        self.initialization()  # 初始化算法模板的一些动态参数
        #===========================准备进化============================
        if population.Chrom is None:
            population.initChrom(NIND)  # 初始化种群染色体矩阵(内含染色体解码,详见Population类的源码)
        self.problem.aimFunc(population)  # 计算种群的目标函数值
        population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV,
                                      population.CV)  # 计算适应度
        self.evalsNum = population.sizes  # 记录评价次数
        #===========================开始进化============================
        while self.terminated(population) == False:
            # 选择
            population = population[ea.selecting(self.selFunc,
                                                 population.FitnV, NIND)]
            # 进行进化操作
            population.Chrom = ea.recombin(self.recFunc, population.Chrom,
                                           self.pc)  # 重组
            population.Chrom = ea.mutate(self.mutFunc, population.Encoding,
                                         population.Chrom, population.Field,
                                         self.pm)  # 变异
            # 求进化后个体的目标函数值
            population.Phen = population.decoding()  # 染色体解码
            self.problem.aimFunc(population)  # 计算目标函数值
            self.evalsNum += population.sizes  # 更新评价次数
            population.FitnV = ea.scaling(self.problem.maxormins *
                                          population.ObjV,
                                          population.CV)  # 计算适应度

        return self.finishing(population)  # 调用finishing完成后续工作并返回结果
예제 #15
0
 def run(self):
     #==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     NVAR = self.problem.Dim  # 得到决策变量的个数
     self.obj_trace = (np.zeros(
         (self.MAXGEN, 2)) * np.nan)  # 定义目标函数值记录器,初始值为nan
     self.var_trace = (np.zeros(
         (self.MAXGEN, NVAR)) * np.nan)  # 定义变量记录器,记录决策变量值,初始值为nan
     self.forgetCount = 0  # “遗忘策略”计数器,用于记录连续出现最优个体不是可行个体的代数
     #===========================准备进化============================
     self.timeSlot = time.time()  # 开始计时
     if population.Chrom is None:
         population.initChrom(NIND)  # 初始化种群染色体矩阵(内含染色体解码,详见Population类的源码)
     population.ObjV, population.CV = self.problem.aimFuc(
         population.Phen, population.CV)  # 计算种群的目标函数值
     population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV,
                                   population.CV)  # 计算适应度
     self.evalsNum = population.sizes  # 记录评价次数
     #===========================开始进化============================
     self.currentGen = 0
     while self.terminated(population) == False:
         bestIdx = np.argmax(population.FitnV,
                             axis=0)  # 得到当代的最优个体的索引, 设置axis=0可使得返回一个向量
         studPop = population[np.tile(
             bestIdx, (NIND // 2))]  # 复制最优个体NIND//2份,组成一个“种马种群”
         restPop = population[np.where(
             np.array(range(NIND)) != bestIdx)[0]]  # 得到除去精英个体外其它个体组成的种群
         # 选择个体,以便后面与种马种群进行交配
         tempPop = restPop[ea.selecting(self.selFunc, restPop.FitnV,
                                        (NIND - studPop.sizes))]
         # 将种马种群与选择出来的个体进行合并
         population = studPop + tempPop
         # 进行进化操作
         population.Chrom = ea.recombin(self.recFunc, population.Chrom,
                                        self.pc)  # 重组
         population.Chrom = ea.mutate(self.mutFunc, population.Encoding,
                                      population.Chrom, population.Field,
                                      self.pm)  # 变异
         # 求进化后个体的目标函数值
         population.Phen = population.decoding()  # 染色体解码
         population.ObjV, population.CV = self.problem.aimFuc(
             population.Phen, population.CV)
         self.evalsNum += population.sizes  # 更新评价次数
         population.FitnV = ea.scaling(self.problem.maxormins *
                                       population.ObjV,
                                       population.CV)  # 计算适应度
     # 处理进化记录器
     delIdx = np.where(np.isnan(self.obj_trace))[0]
     self.obj_trace = np.delete(self.obj_trace, delIdx, 0)
     self.var_trace = np.delete(self.var_trace, delIdx, 0)
     if self.obj_trace.shape[0] == 0:
         raise RuntimeError(
             'error: No feasible solution. (有效进化代数为0,没找到可行解。)')
     self.passTime += time.time() - self.timeSlot  # 更新用时记录
     # 绘图
     if self.drawing != 0:
         ea.trcplot(self.obj_trace, [['种群个体平均目标函数值', '种群最优个体目标函数值']])
     # 返回最后一代种群、进化记录器、变量记录器以及执行时间
     return [population, self.obj_trace, self.var_trace]
 def run(self):
     #==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     self.initialization() # 初始化算法模板的一些动态参数
     #===========================准备进化============================
     if population.Chrom is None:
         population.initChrom(NIND) # 初始化种群染色体矩阵(内含染色体解码,详见Population类的源码)
     self.problem.aimFunc(population) # 计算种群的目标函数值
     population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV, population.CV) # 计算适应度
     self.evalsNum = population.sizes # 记录评价次数
     Sigma = 0.5 * (population.Field[1,:] - population.Field[0,:]) / 3 # 初始化高斯变异的Sigma
     #===========================开始进化============================
     while self.terminated(population) == False:
         # 进行进化操作
         experimentPop = population.copy() # 存储试验种群
         experimentPop.Chrom = ea.mutate('mutgau', experimentPop.Encoding, experimentPop.Chrom, experimentPop.Field, experimentPop.Lind, Sigma) # 变异(这里变异概率设为染色体长度)
         # 求进化后个体的目标函数值
         experimentPop.Phen = experimentPop.decoding() # 染色体解码
         self.problem.aimFunc(experimentPop) # 计算目标函数值
         self.evalsNum += population.sizes # 更新评价次数
         tempPop = population + experimentPop # 临时合并,以调用otos进行一对一生存者选择
         tempPop.FitnV = ea.scaling(self.problem.maxormins * tempPop.ObjV, tempPop.CV) # 计算适应度
         chooseIdx = ea.selecting('otos', tempPop.FitnV, NIND) # 采用One-to-One Survivor选择
         population = tempPop[chooseIdx] # 产生新一代种群
         # 利用1/5规则调整变异压缩概率(实质上是通过变异压缩概率来调整高斯变异的标准差,详见mutgau帮助文档)
         successfulRate = len(np.where(chooseIdx >= NIND)[0]) / (2 * NIND)
         if successfulRate < 1/5:
             Sigma *= 0.817
         elif successfulRate > 1/5:
             Sigma /= 0.817
     
     return self.finishing(population) # 调用finishing完成后续工作并返回结果
예제 #17
0
    def Evolution(self):  #
        start_time = time.time()

        # 初始化种群
        self.get_FieldDR()
        Init_chrom = self.get_init_chrom()

        # 开始进化
        self.log.logger.info('==> This is Init GEN <==')
        Init_Objv = self.get_Objv_i(Init_chrom)
        best_ind = np.argmax(Init_Objv * self.maxormins)  #记录最优个体的索引值

        self.chrom_all = Init_chrom
        self.Objv_all = Init_Objv

        for gen in range(self.MAXGEN):
            self.log.logger.info('==> This is No.%d GEN <==' % (gen))

            if gen == 0:  #第一代和后面有所不同
                chrom = Init_chrom
                Objv = Init_Objv

            else:
                chrom = NewChrom
                Objv = NewObjv

            FitnV = ea.ranking(Objv * self.maxormins)
            Selch = chrom[ea.selecting('rws', FitnV, self.Nind -
                                       1), :]  #轮盘赌选择 Nind-1 代,与上一代的最优个体再进行拼接
            Selch = ea.recombin('xovsp', Selch, self.xov_rate)  #重组,即交叉
            Selch = ea.mutate('mutswap', 'RI', Selch, self.FieldDR)  #变异
            Objv_Selch = self.get_Objv_i(Selch)

            NewChrom = np.vstack(
                (chrom[best_ind, :], Selch))  #将上一代的最优个体与现在的种群拼接
            NewObjv = np.vstack((Objv[best_ind, :], Objv_Selch))
            best_ind = np.argmax(NewObjv * self.maxormins)

            self.chrom_all = np.vstack((self.chrom_all, NewChrom))
            self.Objv_all = np.vstack((self.Objv_all, NewObjv))

            self.obj_trace[gen,
                           0] = np.sum(NewObjv) / self.Nind  # 记录当代种群的目标函数均值
            self.obj_trace[gen, 1] = NewObjv[best_ind]  # 记录当代种群最有给他目标函数值
            self.var_trace[gen, :] = NewChrom[best_ind, :]  # 记录当代种群最优个体的变量值
            self.log.logger.info(
                'GEN=%d,best_Objv=%.5f,best_chrom_i=%s\n' %
                (gen, NewObjv[best_ind], str(
                    NewChrom[best_ind, :])))  # 记录每一代的最大适应度值和个体

        self.Save_chroms(self.chrom_all)
        self.Save_objvs(self.Objv_all)

        end_time = time.time()
        self.time = end_time - start_time
        self.log.logger.info('The time of Evoluation is %.5f s. ' % self.time)
예제 #18
0
 def run(self):
     #==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     NVAR = self.problem.Dim  # 得到决策变量的个数
     self.obj_trace = (np.zeros(
         (self.MAXGEN, 2)) * np.nan)  # 定义目标函数值记录器,初始值为nan
     self.var_trace = (np.zeros(
         (self.MAXGEN, NVAR)) * np.nan)  # 定义变量记录器,记录决策变量值,初始值为nan
     self.forgetCount = 0  # “遗忘策略”计数器,用于记录连续出现最优个体不是可行个体的代数
     #===========================准备进化============================
     self.timeSlot = time.time()  # 开始计时
     if population.Chrom is None:
         population.initChrom(NIND)  # 初始化种群染色体矩阵(内含染色体解码,详见Population类的源码)
     population.ObjV, population.CV = self.problem.aimFuc(
         population.Phen, population.CV)  # 计算种群的目标函数值
     population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV,
                                   population.CV)  # 计算适应度
     self.evalsNum = population.sizes  # 记录评价次数
     #===========================开始进化============================
     self.currentGen = 0
     while self.terminated(population) == False:
         population.shuffle()  # 打乱个体顺序
         # 进行差分进化操作
         mutPop = population.copy()
         mutPop.Chrom = ea.mutate(self.mutFunc, mutPop.Encoding,
                                  mutPop.Chrom, mutPop.Field, self.F,
                                  1)  # 差分变异
         tempPop = population + mutPop  # 当代种群个体与变异个体进行合并(为的是后面用于重组)
         experimentPop = population.copy()  # 试验种群
         experimentPop.Chrom = ea.recombin(self.recFunc, tempPop.Chrom,
                                           self.pc, True)  # 重组
         # 求进化后个体的目标函数值
         experimentPop.Phen = experimentPop.decoding()  # 染色体解码
         experimentPop.ObjV, experimentPop.CV = self.problem.aimFuc(
             experimentPop.Phen, experimentPop.CV)
         self.evalsNum += experimentPop.sizes  # 更新评价次数
         tempPop = population + experimentPop  # 临时合并,以调用otos进行一对一生存者选择
         tempPop.FitnV = ea.scaling(self.problem.maxormins * tempPop.ObjV,
                                    tempPop.CV)  # 计算适应度
         population = tempPop[ea.selecting(
             'otos', tempPop.FitnV,
             NIND)]  # 采用One-to-One Survivor选择,产生新一代种群
     # 处理进化记录器
     delIdx = np.where(np.isnan(self.obj_trace))[0]
     self.obj_trace = np.delete(self.obj_trace, delIdx, 0)
     self.var_trace = np.delete(self.var_trace, delIdx, 0)
     if self.obj_trace.shape[0] == 0:
         raise RuntimeError(
             'error: No feasible solution. (有效进化代数为0,没找到可行解。)')
     self.passTime += time.time() - self.timeSlot  # 更新用时记录
     # 绘图
     if self.drawing != 0:
         ea.trcplot(self.obj_trace, [['种群个体平均目标函数值', '种群最优个体目标函数值']])
     # 返回最后一代种群、进化记录器、变量记录器以及执行时间
     return [population, self.obj_trace, self.var_trace]
예제 #19
0
 def run(self):
     #==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     NVAR = self.problem.Dim  # 得到决策变量的个数
     self.obj_trace = (np.zeros(
         (self.MAXGEN, 2)) * np.nan)  # 定义目标函数值记录器,初始值为nan
     self.var_trace = (np.zeros(
         (self.MAXGEN, NVAR)) * np.nan)  # 定义变量记录器,记录决策变量值,初始值为nan
     self.forgetCount = 0  # “遗忘策略”计数器,用于记录连续出现最优个体不是可行个体的代数
     #===========================准备进化============================
     self.timeSlot = time.time()  # 开始计时
     if population.Chrom is None:
         population.initChrom(NIND)  # 初始化种群染色体矩阵(内含染色体解码,详见Population类的源码)
     population.ObjV, population.CV = self.problem.aimFuc(
         population.Phen, population.CV)  # 计算种群的目标函数值
     population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV,
                                   population.CV)  # 计算适应度
     self.evalsNum = population.sizes  # 记录评价次数
     #===========================开始进化============================
     self.currentGen = 0
     while self.terminated(population) == False:
         # 选择
         offspring = population[ea.selecting(self.selFunc, population.FitnV,
                                             NIND)]
         # 进行进化操作
         offspring.Chrom = ea.recombin(self.recFunc, offspring.Chrom,
                                       self.pc)  # 重组
         offspring.Chrom = ea.mutate(self.mutFunc, offspring.Encoding,
                                     offspring.Chrom, offspring.Field,
                                     self.pm)  # 变异
         # 求进化后个体的目标函数值
         offspring.Phen = offspring.decoding()  # 染色体解码
         offspring.ObjV, offspring.CV = self.problem.aimFuc(
             offspring.Phen, offspring.CV)
         self.evalsNum += offspring.sizes  # 更新评价次数
         population = population + offspring  # 父子合并
         population.FitnV = ea.scaling(self.problem.maxormins *
                                       population.ObjV,
                                       population.CV)  # 计算适应度
         # 得到新一代种群
         population = population[ea.selecting(self.selFunc,
                                              population.FitnV, NIND)]
     # 处理进化记录器
     delIdx = np.where(np.isnan(self.obj_trace))[0]
     self.obj_trace = np.delete(self.obj_trace, delIdx, 0)
     self.var_trace = np.delete(self.var_trace, delIdx, 0)
     if self.obj_trace.shape[0] == 0:
         raise RuntimeError(
             'error: No feasible solution. (有效进化代数为0,没找到可行解。)')
     self.passTime += time.time() - self.timeSlot  # 更新用时记录
     # 绘图
     if self.drawing != 0:
         ea.trcplot(self.obj_trace, [['种群个体平均目标函数值', '种群最优个体目标函数值']])
     # 返回最后一代种群、进化记录器、变量记录器以及执行时间
     return [population, self.obj_trace, self.var_trace]
예제 #20
0
    def run(self):
        #==========================初始化配置===========================
        self.ax = None  # 存储上一桢动画
        population = self.population
        NIND = population.sizes
        #===========================准备进化============================
        self.timeSlot = time.time()  # 开始计时
        if population.Chrom is None:
            population.initChrom(NIND)  # 初始化种群染色体矩阵(内含解码,详见Population类的源码)
        population.ObjV, population.CV = self.problem.aimFuc(
            population.Phen, population.CV)  # 计算种群的目标函数值
        #传入的参数是Phen,也就是表现型矩阵值和约束矩阵(可行性矩阵)
        self.evalsNum = population.sizes  # 记录评价次数
        population.FitnV = self.calFitnV(population, NIND)  # 计算适应度
        #===========================开始进化============================
        self.currentGen = 0
        while self.terminated(population) == False:
            # 选择基个体
            offspring = population[ea.selecting(self.selFunc, population.FitnV,
                                                NIND)]
            # 对基个体进行进化操作
            offspring.Chrom = ea.recombin(self.recFunc, offspring.Chrom,
                                          self.pc)  #重组
            offspring.Chrom = ea.mutate(self.mutFunc, offspring.Encoding,
                                        offspring.Chrom, offspring.Field,
                                        self.pm)  # 变异
            offspring.Phen = offspring.decoding()  # 解码
            offspring.ObjV, offspring.CV = self.problem.aimFuc(
                offspring.Phen, offspring.CV)  # 求进化后个体的目标函数值
            self.evalsNum += offspring.sizes  # 更新评价次数
            # 合并
            population = population + offspring
            # 计算合并种群的适应度
            population.FitnV = self.calFitnV(population, NIND)
            # 选择个体保留到下一次进化
            population = population[ea.selecting(
                'dup', population.FitnV,
                NIND)]  # 调用低级选择算子dup进行基于适应度排序的选择,保留NIND个个体
        # 得到非支配种群,新的父代产生
        [levels,
         criLevel] = self.ndSort(self.problem.maxormins * population.ObjV,
                                 NIND, 1, population.CV)  # 非支配分层
        #划分一层,提取出rank0
        NDSet = population[np.where(levels == 1)[0]]  # 只保留种群中的非支配个体,形成一个非支配种群
        NDSet = NDSet[np.where(np.all(NDSet.CV <= 0, 1))[0]]  # 最后要彻底排除非可行解
        self.passTime += time.time() - self.timeSlot  # 更新用时记录
        #=========================绘图及输出结果=========================
        if self.drawing != 0:
            ea.moeaplot(NDSet.ObjV, True)

        # 返回帕累托最优集
        return NDSet
예제 #21
0
    def run(self):
        #==========================初始化配置===========================
        population = self.population
        self.timeSlot = time.time()  # 开始计时
        uniformPoint, NIND = ea.crtup(self.problem.M,
                                      population.sizes)  # 生成在单位目标维度上均匀分布的参考点集
        if population.Chrom is None or population.sizes != NIND:
            population.initChrom(
                NIND
            )  # 初始化种群染色体矩阵(内含解码,详见Population类的源码),此时种群规模将调整为uniformPoint点集的大小,initChrom函数会把种群规模给重置
        population.ObjV, population.CV = self.problem.aimFuc(
            population.Phen, population.CV)  # 计算种群的目标函数值
        self.evalsNum = population.sizes  # 记录评价次数
        #===========================开始进化============================
        self.currentGen = 0
        while self.terminated(population) == False:
            population.shuffle()  # 打乱个体顺序
            # 进行差分进化操作
            mutPop = population.copy()
            mutPop.Chrom = ea.mutate(self.mutFunc, mutPop.Encoding,
                                     mutPop.Chrom, mutPop.Field, self.F,
                                     1)  # 差分变异
            tempPop = population + mutPop  # 当代种群个体与变异个体进行合并(为的是后面用于重组)
            experimentPop = population.copy()  # 试验种群
            experimentPop.Chrom = ea.recombin(self.recFunc, tempPop.Chrom,
                                              self.pc, True)  # 重组
            # 求进化后个体的目标函数值
            experimentPop.Phen = experimentPop.decoding()  # 染色体解码
            experimentPop.ObjV, experimentPop.CV = self.problem.aimFuc(
                experimentPop.Phen, experimentPop.CV)
            self.evalsNum += experimentPop.sizes  # 更新评价次数
            # 合并
            population = population + experimentPop
            population.FitnV = self.calFitnV(population, NIND,
                                             uniformPoint)  # 计算合并种群的适应度
            population = population[ea.selecting('dup', population.FitnV,
                                                 NIND)]  # 选择操作,保留NIND个个体
        # 得到非支配种群
        [levels,
         criLevel] = self.ndSort(self.problem.maxormins * population.ObjV,
                                 NIND, 1, population.CV)  # 非支配分层
        NDSet = population[np.where(levels == 1)[0]]  # 只保留种群中的非支配个体,形成一个非支配种群
        NDSet = NDSet[np.where(np.all(NDSet.CV <= 0, 1))[0]]  # 最后要彻底排除非可行解
        self.passTime += time.time() - self.timeSlot  # 更新用时记录
        # 绘图
        if self.drawing != 0:
            ea.moeaplot(NDSet.ObjV, True)

        # 返回帕累托最优集
        return NDSet
예제 #22
0
    def run(self):
        #==========================初始化配置===========================
        population = self.population
        self.timeSlot = time.time()  # 开始计时
        uniformPoint, NIND = ea.crtup(self.problem.M,
                                      population.sizes)  # 生成在单位目标维度上均匀分布的参考点集
        if population.Chrom is None or population.sizes != NIND:
            population.initChrom(
                NIND
            )  # 初始化种群染色体矩阵(内含解码,详见Population类的源码),此时种群规模将调整为uniformPoint点集的大小,initChrom函数会把种群规模给重置
        population.ObjV, population.CV = self.problem.aimFuc(
            population.Phen, population.CV)  # 计算种群的目标函数值
        self.evalsNum = population.sizes  # 记录评价次数
        #===========================开始进化============================
        self.currentGen = 0
        while self.terminated(population) == False:
            # 选择个体参与进化
            offspring = population[ea.selecting(self.selFunc, population.FitnV,
                                                NIND)]
            # 对基个体进行进化操作
            offspring.Chrom = ea.recombin(self.recFunc, offspring.Chrom,
                                          self.pc)  #重组
            offspring.Chrom = ea.mutate(self.mutFunc, offspring.Encoding,
                                        offspring.Chrom, offspring.Field,
                                        self.pm)  # 变异
            offspring.Phen = offspring.decoding()  # 解码
            offspring.ObjV, offspring.CV = self.problem.aimFuc(
                offspring.Phen, offspring.CV)  # 求进化后个体的目标函数值
            self.evalsNum += offspring.sizes  # 更新评价次数
            # 合并
            population = population + offspring
            population.FitnV = self.calFitnV(population, NIND,
                                             uniformPoint)  # 计算合并种群的适应度
            population = population[ea.selecting('dup', population.FitnV,
                                                 NIND)]  # 选择操作,保留NIND个个体
        # 得到非支配种群
        [levels,
         criLevel] = self.ndSort(self.problem.maxormins * population.ObjV,
                                 NIND, 1, population.CV)  # 非支配分层
        NDSet = population[np.where(levels == 1)[0]]  # 只保留种群中的非支配个体,形成一个非支配种群
        NDSet = NDSet[np.where(np.all(NDSet.CV <= 0, 1))[0]]  # 最后要彻底排除非可行解
        self.passTime += time.time() - self.timeSlot  # 更新用时记录
        # 绘图
        if self.drawing != 0:
            ea.moeaplot(NDSet.ObjV, True)

        # 返回帕累托最优集
        return NDSet
예제 #23
0
    def run(self):
        #==========================初始化配置===========================
        population = self.population
        NIND = population.sizes
        if NIND < 2:
            raise RuntimeError('error: Population'
                               ' size is too small. (种群规模不能小于2。)')
        self.initialization()  # 初始化算法模板的一些动态参数
        #===========================准备进化============================
        population.initChrom(NIND)  # 初始化种群染色体矩阵(内含染色体解码,详见PsyPopulation类的源码)
        self.problem.aimFunc(population)  # 计算种群的目标函数值
        population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV,
                                      population.CV)  # 计算适应度
        self.evalsNum = population.sizes  # 记录评价次数
        #===========================开始进化============================
        while self.terminated(population) == False:
            # 选择
            chooseIdx = ea.selecting(self.selFunc, population.FitnV, 2)
            offspring = population[chooseIdx]
            # 进行进化操作,分别对各种编码的染色体进行重组和变异
            for i in range(population.ChromNum):
                offspring.Chroms[i] = ea.recombin(self.recFuncs[i],
                                                  offspring.Chroms[i],
                                                  self.pcs[i])  # 重组
                offspring.Chroms[i] = ea.mutate(self.mutFuncs[i],
                                                offspring.Encodings[i],
                                                offspring.Chroms[i],
                                                offspring.Fields[i],
                                                self.pms[i])  # 变异
            # 求进化后个体的目标函数值
            offspring.Phen = offspring.decoding()  # 染色体解码
            self.problem.aimFunc(offspring)  # 计算目标函数值
            self.evalsNum += offspring.sizes  # 更新评价次数
            tempPop = population + offspring  # 父子合并
            tempPop.FitnV = ea.scaling(self.problem.maxormins * tempPop.ObjV,
                                       tempPop.CV)  # 计算适应度
            # 得到新一代种群
            tempPop = tempPop[ea.selecting('otos', tempPop.FitnV,
                                           2)]  # 采用One-to-One Survivor选择
            population[chooseIdx] = tempPop
            population.FitnV = ea.scaling(self.problem.maxormins *
                                          population.ObjV,
                                          population.CV)  # 计算适应度

        return self.finishing(population)  # 调用finishing完成后续工作并返回结果
예제 #24
0
 def run(self):
     #==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     self.initialization()  # 初始化算法模板的一些动态参数
     #===========================准备进化============================
     population.initChrom()  # 初始化种群染色体矩阵(内含解码,详见Population类的源码)
     self.problem.aimFunc(population)  # 计算种群的目标函数值
     self.evalsNum = population.sizes  # 记录评价次数
     [levels,
      criLevel] = self.ndSort(self.problem.maxormins * population.ObjV,
                              NIND, None, population.CV)  # 对NIND个个体进行非支配分层
     population.FitnV[:, 0] = 1 / levels  # 直接根据levels来计算初代个体的适应度
     globalNDSet = population[np.where(
         levels == 1)[0]]  # 创建全局存档,该全局存档贯穿进化始终,随着进化不断更新
     globalNDSet = globalNDSet[np.where(np.all(globalNDSet.CV <= 0,
                                               1))[0]]  # 排除非可行解
     #===========================开始进化============================
     while self.terminated(population) == False:
         # 选择个体参与进化
         offspring = population[ea.selecting(self.selFunc, population.FitnV,
                                             NIND)]
         # 进行进化操作,分别对各个种群染色体矩阵进行重组和变异
         for i in range(population.ChromNum):
             offspring.Chroms[i] = ea.recombin(self.recFuncs[i],
                                               offspring.Chroms[i],
                                               self.pcs[i])  #重组
             offspring.Chroms[i] = ea.mutate(self.mutFuncs[i],
                                             offspring.Encodings[i],
                                             offspring.Chroms[i],
                                             offspring.Fields[i],
                                             self.pms[i])  # 变异
         offspring.Phen = offspring.decoding()  # 解码
         self.problem.aimFunc(offspring)  # 求进化后个体的目标函数值
         self.evalsNum += offspring.sizes  # 更新评价次数
         # 重插入生成新一代种群,同时更新全局存档
         population, globalNDSet = self.reinsertion(population, offspring,
                                                    NIND, globalNDSet)
     self.passTime += time.time() - self.timeSlot  # 更新用时记录
     #=========================绘图及输出结果=========================
     if self.drawing != 0:
         ea.moeaplot(globalNDSet.ObjV, 'Pareto Front', True)
     # 返回帕累托最优集
     return globalNDSet
예제 #25
0
    def run(self):
        #==========================初始化配置===========================
        population = self.population
        NIND = population.sizes
        GGAP_NUM = int(np.ceil(NIND * self.GGAP))  # 计算每一代替换个体的个数
        self.initialization()  # 初始化算法模板的一些动态参数
        #===========================准备进化============================
        population.initChrom(NIND)  # 初始化种群染色体矩阵(内含染色体解码,详见PsyPopulation类的源码)
        self.problem.aimFunc(population)  # 计算种群的目标函数值
        population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV,
                                      population.CV)  # 计算适应度
        self.evalsNum = population.sizes  # 记录评价次数
        #===========================开始进化============================
        while self.terminated(population) == False:
            # 选择
            offspring = population[ea.selecting(self.selFunc, population.FitnV,
                                                NIND)]
            # 进行进化操作,分别对各种编码的染色体进行重组和变异
            for i in range(offspring.ChromNum):
                offspring.Chroms[i] = ea.recombin(self.recFuncs[i],
                                                  offspring.Chroms[i],
                                                  self.pcs[i])  # 重组
                offspring.Chroms[i] = ea.mutate(self.mutFuncs[i],
                                                offspring.Encodings[i],
                                                offspring.Chroms[i],
                                                offspring.Fields[i],
                                                self.pms[i])  # 变异
            # 求进化后个体的目标函数值
            offspring.Phen = offspring.decoding()  # 染色体解码
            self.problem.aimFunc(offspring)  # 计算目标函数值
            self.evalsNum += offspring.sizes  # 更新评价次数
            offspring.FitnV = ea.scaling(self.problem.maxormins *
                                         offspring.ObjV, offspring.CV)  # 计算适应度
            # 根据代沟把子代重插入到父代生成新一代种群
            population = self.reinsertion(population, offspring, GGAP_NUM)
            population.FitnV = ea.scaling(self.problem.maxormins *
                                          population.ObjV,
                                          population.CV)  # 计算适应度

        return self.finishing(population)  # 调用finishing完成后续工作并返回结果
예제 #26
0
    def run(self):
        #==========================初始化配置===========================
        population = self.population
        NIND = population.sizes
        self.initialization()  # 初始化算法模板的一些动态参数
        #===========================准备进化============================
        if population.Chrom is None:
            population.initChrom(NIND)  # 初始化种群染色体矩阵(内含染色体解码,详见Population类的源码)
        self.problem.aimFunc(population)  # 计算种群的目标函数值
        population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV,
                                      population.CV)  # 计算适应度
        self.evalsNum = population.sizes  # 记录评价次数
        #===========================开始进化============================
        while self.terminated(population) == False:
            print('gen', self.currentGen)
            bestIndi = population[np.argmax(population.FitnV, 0)]  # 得到当代的最优个体
            # 选择
            offspring = population[ea.selecting(
                self.selFunc, population.FitnV,
                NIND - 1)]  #同样选取与父代数量相等个体-1,因为前面还有一个最佳父代
            # 进行进化操作
            offspring.Chrom = ea.recombin(self.recFunc, offspring.Chrom,
                                          self.pc)  # 重组
            offspring.Chrom = ea.mutate(self.mutFunc, offspring.Encoding,
                                        offspring.Chrom, offspring.Field,
                                        self.pm)  # 变异
            # 求进化后个体的目标函数值
            offspring.Phen = offspring.decoding()  # 染色体解码
            self.problem.aimFunc(offspring)  # 计算目标函数值

            self.evalsNum += offspring.sizes  # 更新评价次数
            population = bestIndi + offspring  # 更新种群
            population.FitnV = ea.scaling(self.problem.maxormins *
                                          population.ObjV,
                                          population.CV)  # 计算适应度

        return self.finishing(population)  # 调用finishing完成后续工作并返回结果
예제 #27
0
    def run(self):
        # ==========================初始化配置===========================
        population = self.population      # population是传入的初始化种群
        NIND = population.sizes           # NIND表示的是种群数目
        NVAR = self.problem.Dim           # 得到决策变量的个数
        self.obj_trace = (np.zeros((self.MAXGEN, 2)) * np.nan)       # 定义目标函数值记录器,初始值为nan
        # 目标函数记录器(2列)
        self.var_trace = (np.zeros((self.MAXGEN, NVAR)) * np.nan)    # 定义变量记录器,记录决策变量值,初始值为nan
        # id_trace用于记录每一代训练得出的最佳子种群的ARRAY
        self.forgetCount = 0    # “遗忘策略”计数器,用于记录连续出现最优个体不是可行个体的代数/"遗忘策略"
        id_1 = self.id_1_start()
        #id_1 = np.random.randint(0, NVAR, (NIND, NVAR))              # 对index记录的矩阵进行初始化
        # ===========================准备进化============================
        self.timeSlot = time.time()                                  # 开始计时
        if population.Chrom is None:
            new_fixed_dict = self.change_bug()
            population.Chrom, population.Phen, population.FitnV, population.CV, population.ObjV = self.start_fx()
            population.ObjV, population.CV = self.problem.aim_chuli(population.Phen, id_1, new_fixed_dict)
            feasible = np.where(np.all(population.CV <= 0, 1))[0]
            while True:
                if len(feasible) > 0:
                    break
                else:
                    # population.Chrom, population.Phen, population.FitnV, population.CV, population.ObjV = self.start_fx()
                    # id_1 = self.id_1_start()
                    new_fixed_dict = self.change_bug()
                    population.ObjV, population.CV = self.problem.aim_chuli(population.Phen, id_1, new_fixed_dict)
                    feasible = np.where(np.all(population.CV <= 0, 1))[0]

        # id_1是保留shape的形状
        # 计算种群的目标函数,输入的是CV和Phen表现矩阵
        population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV, population.CV)  # 计算适应度
        # 自动计算适应度
        #print('种群初始化-2时的适应度:', population.FitnV)
        self.evalsNum = population.sizes     # 记录评价次数
        # 记录评价次数
        # ===========================开始进化============================
        self.currentGen = 0
        # 开始进化,设置currentGen为0
        while self.terminated(population, id_1) == False:
            # 若需要继续进化,那么有

            bestIdx = np.argmax(population.FitnV, axis=0)  # 得到当代的最优个体的索引, 设置axis=0可使得返回一个向量
            best_id = np.tile(id_1[bestIdx], (NIND // 2, 1))
            studPop = population[np.tile(bestIdx, NIND // 2)]  # 复制最优个体NIND//2份,组成一个“种马种群”
            restPop = population[np.where(np.array(range(NIND)) != bestIdx)[0]]
            # 得到除去精英个体外其它个体组成的种群
            # 选择个体,以便后面与种马种群进行交配
            restid = id_1[np.where(np.array(range(NIND)) != bestIdx)[0]]
            id_temp = restid[ea.selecting(self.selFunc, restPop.FitnV, (NIND - studPop.sizes))]
            tempPop = restPop[ea.selecting(self.selFunc, restPop.FitnV, (NIND - studPop.sizes))]
            # 将种马种群与选择出来的个体进行合并
            population = studPop + tempPop
            id_1 = np.vstack((best_id, id_temp))
            # 进行进化操作
            # population.Chrom = ea.recombin(self.recFunc, population.Chrom, self.pc)                  # 重组
            population.Chrom, id_1 = self.problem.intersect(population.Chrom, id_1, self.pc)  # 重组
            population.Chrom = ea.mutate(self.mutFunc, population.Encoding, population.Chrom, population.Field, self.pm)
            # 求进化后个体的目标函数值//变异
            # print('进化中的Chorm矩阵:', population.Chrom)
            # print('进化中的Phen矩阵:', population.Phen)
            population.Phen = population.decoding()  # 染色体解码
            # population.ObjV, population.CV = self.problem.aimFuc(population.Phen, population.CV)
            population.ObjV, population.CV = self.problem.aim_chuli(population.Phen, id_1, new_fixed_dict)  # 计算种群的目标函数值
            # population.ObjV, population.CV = self.problem.aim_chuli(population.Chrom, id_1)
            self.evalsNum += population.sizes
            population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV, population.CV)  # 计算适应度
        # 处理进化记录器
        # 计算适应度
        # 处理进化记录器
        delIdx = np.where(np.isnan(self.obj_trace))[0]
        self.obj_trace = np.delete(self.obj_trace, delIdx, 0)
        self.var_trace = np.delete(self.var_trace, delIdx, 0)
        # 对id的trace进行记录
        self.id_trace = np.delete(self.id_trace, delIdx, 0)

       # self.var_trace = np.delete(self.var_trace, delIdx, 0)                       #记录trace
        if self.obj_trace.shape[0] == 0:
            raise RuntimeError('error: No feasible solution. (有效进化代数为0,没找到可行解。)')
        self.passTime += time.time() - self.timeSlot # 更新用时记录
        # 绘图
        if self.drawing != 0:
            ea.trcplot(self.obj_trace, [['种群个体平均目标函数值', '种群最优个体目标函数值']])
        # 返回最后一代种群、进化记录器、变量记录器以及执行时间

        return [population, self.obj_trace, self.var_trace, self.id_trace, new_fixed_dict]
예제 #28
0
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), :]  # 选择
    SelCh = ea.recombin(recStyle, SelCh, pc)  # 重组
    SelCh = ea.mutate(mutStyle, Encoding, SelCh, pm)  # 变异
    # 把父代精英个体与子代的染色体进行合并,得到新一代种群
    Chrom = np.vstack([var_trace[gen, :], SelCh])

    print('第', gen, '代', '用时:', time.time() - start_time, '秒')
# 进化完成
l = [
    '头词频', '词频', '词长', 'TFIDF', 'IDF', '出现在标题', '首次出现词位置', '最后出现词位置', '位置跨度',
    '词方差', '词平均', '词偏度', '词峰度', '词差方差', '词差平均', '最大词差', '最小词差', '最大句中位置',
    '最小句中位置', '平均句中位置', '最长句长', '最短句长', '平均句长', '首次句位置', '最后句位置', '句跨度',
    '出现在第一句', '出现在最后一句', '句子出现频率', '句方差', '句平均', '句偏度', '句峰度', '句差方差', '句差平均',
    '最大句差', '最小句差', '包含英文', '相似度', '度中心性', '接近中心性', '介数中心性', '特征向量中心性',
    '共现矩阵偏度', 'n', 't', 's', 'f', 'v', 'a', 'b', 'z', 'q', 'd', 'h', 'k', 'x',
    'g', 'i', 'j', 'l', 'y', 'un', '包含数字'
]
end_time = time.time()  # 结束计时
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)  # 求育种个体的目标函数值
    # 记录
    best_ind = np.argmax(ObjV)  # 计算当代最优个体的序号
    pop_trace[gen, 0] = ObjV[best_ind]  # 记录当代种群最优个体目标函数值
    pop_trace[gen, 1] = np.sum(ObjV) / ObjV.shape[0]  # 记录当代种群的目标函数均值
    ind_trace[gen, :] = Chrom[best_ind, :]  # 记录当代种群最优个体的变量值
# 进化完成
end_time = time.time()  # 结束计时
"""============================输出结果及绘图================================"""
print('目标函数最大值:', np.max(pop_trace[:, 0]))  # 输出目标函数最大值
variable = ga.bs2real(ind_trace, FieldD)  # 解码得到表现型
print('最大值点:', variable[0][0])
print('用时:', end_time - start_time)
plt.plot(variable, aim(variable), 'bo')
예제 #30
0
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, '秒')