Exemplo n.º 1
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] = self.recOpers[i].do(offspring.Chroms[i]) # 重组
             offspring.Chroms[i] = self.mutOpers[i].do(offspring.Encodings[i], offspring.Chroms[i], offspring.Fields[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完成后续工作并返回结果
 def run(self, prophetPop=None):  # prophetPop为先知种群(即包含先验知识的种群)
     # ==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     self.initialization()  # 初始化算法类的一些动态参数
     # ===========================准备进化============================
     population.initChrom(NIND)  # 初始化种群染色体矩阵
     # 插入先验知识(注意:这里不会对先知种群prophetPop的合法性进行检查)
     if prophetPop is not None:
         population = (prophetPop + population)[:NIND]  # 插入先知种群
     self.call_aimFunc(population)  # 计算种群的目标函数值
     population.FitnV = ea.scaling(population.ObjV, population.CV,
                                   self.problem.maxormins)  # 计算适应度
     # ===========================开始进化============================
     while not self.terminated(population):
         # 进行差分进化操作
         r0 = ea.selecting(self.selFunc, population.FitnV, NIND)  # 得到基向量索引
         experimentPop = ea.Population(population.Encoding,
                                       population.Field, NIND)  # 存储试验个体
         experimentPop.Chrom = self.mutOper.do(population.Encoding,
                                               population.Chrom,
                                               population.Field, [r0])  # 变异
         experimentPop.Chrom = self.recOper.do(
             np.vstack([population.Chrom, experimentPop.Chrom]))  # 重组
         self.call_aimFunc(experimentPop)  # 计算目标函数值
         tempPop = population + experimentPop  # 临时合并,以调用otos进行一对一生存者选择
         tempPop.FitnV = ea.scaling(tempPop.ObjV, tempPop.CV,
                                    self.problem.maxormins)  # 计算适应度
         population = tempPop[ea.selecting(
             'otos', tempPop.FitnV,
             NIND)]  # 采用One-to-One Survivor选择,产生新一代种群
     return self.finishing(population)  # 调用finishing完成后续工作并返回结果
Exemplo n.º 3
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:
         # 选择
         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 = population + offspring # 父子合并
         population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV, population.CV) # 计算适应度
         # 得到新一代种群
         population = population[ea.selecting(self.selFunc, population.FitnV, NIND)]
     
     return self.finishing(population) # 调用finishing完成后续工作并返回结果
    def run(self, prophetPop=None):  # prophetPop为先知种群(即包含先验知识的种群)
        #==========================初始化配置===========================
        population = self.population
        NIND = population.sizes
        self.initialization()  # 初始化算法模板的一些动态参数
        #===========================准备进化============================
        population.initChrom(NIND)  # 初始化种群染色体矩阵
        self.call_aimFunc(population)  # 计算种群的目标函数值
        # 插入先验知识(注意:这里不会对先知种群prophetPop的合法性进行检查,故应确保prophetPop是一个种群类且拥有合法的Chrom、ObjV、Phen等属性)
        if prophetPop is not None:
            population = (prophetPop + population)[:NIND]  # 插入先知种群
        population.FitnV = ea.scaling(population.ObjV, population.CV,
                                      self.problem.maxormins)  # 计算适应度
        #===========================开始进化============================
        while self.terminated(population) == False:
            # 选择
            offspring = population[ea.selecting(self.selFunc, population.FitnV,
                                                NIND)]
            # 进行进化操作
            offspring.Chrom = self.recOper.do(offspring.Chrom)  # 重组
            offspring.Chrom = self.mutOper.do(offspring.Encoding,
                                              offspring.Chrom,
                                              offspring.Field)  # 变异
            self.call_aimFunc(offspring)  # 计算目标函数值
            population = population + offspring  # 父子合并
            population.FitnV = ea.scaling(population.ObjV, population.CV,
                                          self.problem.maxormins)  # 计算适应度
            # 得到新一代种群
            population = population[ea.selecting(
                'dup', population.FitnV, NIND)]  # 采用基于适应度排序的直接复制选择生成新一代种群

        return self.finishing(population)  # 调用finishing完成后续工作并返回结果
Exemplo n.º 5
0
 def run(self, prophetPop = None): # prophetPop为先知种群(即包含先验知识的种群)
     #==========================初始化配置===========================
     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) # 计算种群的目标函数值
     self.evalsNum = population.sizes # 记录评价次数
     # 插入先验知识(注意:这里不会对先知种群prophetPop的合法性进行检查,故应确保prophetPop是一个种群类且拥有合法的Chrom、ObjV、Phen等属性)
     if prophetPop is not None:
         population = (prophetPop + population)[:NIND] # 插入先知种群
     population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV, population.CV) # 计算适应度
     #===========================开始进化============================
     while self.terminated(population) == False:
         # 进行差分进化操作
         r0 = ea.selecting('ecs', population.FitnV, NIND)
         Xr0 = population.Chrom + self.k * (population.Chrom[r0, :] - population.Chrom) # 根据target-to-best的方法得到基向量矩阵
         experimentPop = population.copy() # 存储试验个体
         experimentPop.Chrom = self.mutOper.do(experimentPop.Encoding, experimentPop.Chrom, experimentPop.Field, [Xr0]) # 变异
         tempPop = population + experimentPop # 当代种群个体与变异个体进行合并(为的是后面用于重组)
         experimentPop.Chrom = self.recOper.do(tempPop.Chrom) # 重组
         # 求进化后个体的目标函数值
         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完成后续工作并返回结果
 def run(self, prophetPop = None): # prophetPop为先知种群(即包含先验知识的种群)
     #==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     if NIND < 2:
         raise RuntimeError('error: Population'' size is too small. (种群规模不能小于2。)')
     self.initialization() # 初始化算法模板的一些动态参数
     #===========================准备进化============================
     population.initChrom(NIND) # 初始化种群染色体矩阵
     self.call_aimFunc(population) # 计算种群的目标函数值
     # 插入先验知识(注意:这里不会对先知种群prophetPop的合法性进行检查,故应确保prophetPop是一个种群类且拥有合法的Chrom、ObjV、Phen等属性)
     if prophetPop is not None:
         population = (prophetPop + population)[:NIND] # 插入先知种群
     population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV, population.CV) # 计算适应度
     #===========================开始进化============================
     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] = self.recOpers[i].do(offspring.Chroms[i]) # 重组
             offspring.Chroms[i] = self.mutOpers[i].do(offspring.Encodings[i], offspring.Chroms[i], offspring.Fields[i]) # 变异
         self.call_aimFunc(offspring) # 计算目标函数值
         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完成后续工作并返回结果
 def run(self, prophetPop = None): # prophetPop为先知种群(即包含先验知识的种群)
     #==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     self.initialization() # 初始化算法模板的一些动态参数
     #===========================准备进化============================
     if population.Chrom is None:
         population.initChrom(NIND) # 初始化种群染色体矩阵
     self.call_aimFunc(population) # 计算种群的目标函数值
     # 插入先验知识(注意:这里不会对先知种群prophetPop的合法性进行检查,故应确保prophetPop是一个种群类且拥有合法的Chrom、ObjV、Phen等属性)
     if prophetPop is not None:
         population = (prophetPop + population)[:NIND] # 插入先知种群
     population.FitnV = ea.scaling(self.problem.maxormins * population.ObjV, population.CV) # 计算适应度
     #===========================开始进化============================
     while self.terminated(population) == False:
         # 进行差分进化操作
         r0 = ea.selecting(self.selFunc, population.FitnV, NIND) # 得到基向量索引
         experimentPop = population.copy() # 存储试验个体
         experimentPop.Chrom = self.mutOper.do(experimentPop.Encoding, experimentPop.Chrom, experimentPop.Field, [r0]) # 变异
         tempPop = population + experimentPop # 当代种群个体与变异个体进行合并(为的是后面用于重组)
         experimentPop.Chrom = self.recOper.do(tempPop.Chrom) # 重组
         self.call_aimFunc(experimentPop) # 计算目标函数值
         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完成后续工作并返回结果
Exemplo n.º 8
0
 def run(self, prophetPop=None):  # prophetPop为先知种群(即包含先验知识的种群)
     # ==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     self.initialization()  # 初始化算法类的一些动态参数
     # ===========================准备进化============================
     population.initChrom(NIND)  # 初始化种群染色体矩阵
     # 插入先验知识(注意:这里不会对先知种群prophetPop的合法性进行检查)
     if prophetPop is not None:
         population = (prophetPop + population)[:NIND]  # 插入先知种群
     self.call_aimFunc(population)  # 计算种群的目标函数值
     population.FitnV = ea.scaling(population.ObjV, population.CV,
                                   self.problem.maxormins)  # 计算适应度
     # ===========================开始进化============================
     while not self.terminated(population):
         # 选择
         offspring = population[ea.selecting(self.selFunc, population.FitnV,
                                             NIND)]
         # 进行进化操作,分别对各种编码的染色体进行重组和变异
         for i in range(population.ChromNum):
             offspring.Chroms[i] = self.recOpers[i].do(
                 offspring.Chroms[i])  # 重组
             offspring.Chroms[i] = self.mutOpers[i].do(
                 offspring.Encodings[i], offspring.Chroms[i],
                 offspring.Fields[i])  # 变异
         self.call_aimFunc(offspring)  # 计算目标函数值
         population = population + offspring  # 父子合并
         population.FitnV = ea.scaling(population.ObjV, population.CV,
                                       self.problem.maxormins)  # 计算适应度
         # 得到新一代种群
         population = population[ea.selecting(
             'dup', population.FitnV, NIND)]  # 采用基于适应度排序的直接复制选择生成新一代种群
     return self.finishing(population)  # 调用finishing完成后续工作并返回结果
 def run(self, prophetPop=None):  # prophetPop为先知种群(即包含先验知识的种群)
     # ==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     self.initialization()  # 初始化算法类的一些动态参数
     # ===========================准备进化============================
     population.initChrom(NIND)  # 初始化种群染色体矩阵
     # 插入先验知识(注意:这里不会对先知种群prophetPop的合法性进行检查)
     if prophetPop is not None:
         population = (prophetPop + population)[:NIND]  # 插入先知种群
     self.call_aimFunc(population)  # 计算种群的目标函数值
     population.FitnV = ea.scaling(population.ObjV, population.CV, self.problem.maxormins)  # 计算适应度
     Sigma3 = np.random.rand(population.sizes, population.Lind) * (
                 population.Field[1, :] - population.Field[0, :]) * 0.5  # 初始化高斯变异算子的Sigma3
     # ===========================开始进化============================
     while not self.terminated(population):
         # 选择
         choose_index = ea.selecting(self.selFunc, population.FitnV, self.NSel)
         offspring = population[choose_index]
         offspring_Sigma3 = Sigma3[choose_index]
         # 进行进化操作
         offspring.Chrom = self.recOper.do(offspring.Chrom)  # 重组
         offspring_Sigma3 = self.recOper.do(offspring_Sigma3)  # 对offspring_Sigma3进行重组
         for i in range(len(choose_index)):
             offspring.Chrom[i, :] = ea.mutgau(offspring.Encoding, offspring.Chrom[i, :].reshape(1, -1),
                                               offspring.Field, 1, offspring_Sigma3[i]).reshape(-1)  # 高斯变异
         self.call_aimFunc(offspring)  # 计算目标函数值
         population = population + offspring  # 父子合并
         Sigma3 = np.vstack([Sigma3, offspring_Sigma3])
         population.FitnV = ea.scaling(population.ObjV, population.CV, self.problem.maxormins)  # 计算适应度
         # 得到新一代种群
         choose_index = ea.selecting('dup', population.FitnV, NIND)  # 采用基于适应度排序的直接复制选择
         population = population[choose_index]
         Sigma3 = Sigma3[choose_index]
     return self.finishing(population)  # 调用finishing完成后续工作并返回结果
Exemplo n.º 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完成后续工作并返回结果
Exemplo n.º 11
0
 def run(self, prophetPop=None):  # prophetPop为先知种群(即包含先验知识的种群)
     # ==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     self.initialization()  # 初始化算法模板的一些动态参数
     # ===========================准备进化============================
     population.initChrom(NIND)  # 初始化种群染色体矩阵
     self.call_aimFunc(population)  # 计算种群的目标函数值
     # 插入先验知识(注意:这里不会对先知种群prophetPop的合法性进行检查,故应确保prophetPop是一个种群类且拥有合法的Chrom、ObjV、Phen等属性)
     if prophetPop is not None:
         population = (prophetPop + population)[:NIND]  # 插入先知种群
     population.FitnV = ea.scaling(population.ObjV, population.CV,
                                   self.problem.maxormins)  # 计算适应度
     # ===========================开始进化============================
     while self.terminated(population) == False:
         # 进行差分进化操作
         r0 = np.arange(NIND)
         r_best = ea.selecting('ecs', population.FitnV,
                               NIND)  # 执行'ecs'精英复制选择
         experimentPop = ea.Population(population.Encoding,
                                       population.Field, NIND)  # 存储试验个体
         experimentPop.Chrom = self.mutOper.do(
             population.Encoding, population.Chrom, population.Field,
             [r0, None, None, r_best, r0])  # 变异
         experimentPop.Chrom = self.recOper.do(
             np.vstack([population.Chrom, experimentPop.Chrom]))  # 重组
         self.call_aimFunc(experimentPop)  # 计算目标函数值
         tempPop = population + experimentPop  # 临时合并,以调用otos进行一对一生存者选择
         tempPop.FitnV = ea.scaling(tempPop.ObjV, tempPop.CV,
                                    self.problem.maxormins)  # 计算适应度
         population = tempPop[ea.selecting(
             'otos', tempPop.FitnV,
             NIND)]  # 采用One-to-One Survivor选择,产生新一代种群
     return self.finishing(population)  # 调用finishing完成后续工作并返回结果
Exemplo n.º 12
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:
            # 选择
            offspring = population[ea.selecting(self.selFunc, population.FitnV,
                                                NIND)]
            # 进行进化操作
            offspring.Chrom = self.recOper.do(offspring.Chrom)  # 重组
            offspring.Chrom = self.mutOper.do(offspring.Encoding,
                                              offspring.Chrom,
                                              offspring.Field)  # 变异
            # 求进化后个体的目标函数值
            offspring.Phen = offspring.decoding()  # 染色体解码
            self.problem.aimFunc(offspring)  # 计算目标函数值
            self.evalsNum += offspring.sizes  # 更新评价次数
            population = population + offspring  # 父子合并
            population.FitnV = ea.scaling(self.problem.maxormins *
                                          population.ObjV,
                                          population.CV)  # 计算适应度
            # 得到新一代种群
            population = population[ea.selecting(
                'dup', population.FitnV, NIND)]  # 采用基于适应度排序的直接复制选择生成新一代种群

            # 获得此代最优秀的个体
            best_gen = np.nanargmin(self.obj_trace[:, 1])
            shortest_dis = self.obj_trace[best_gen]

            shortest_path = np.hstack(
                [self.var_trace[best_gen, :], self.var_trace[best_gen, 0]])
            shortest_path_point_x = np.array(
                self.problem.places[shortest_path.astype(int), 0])
            shortest_path_point_y = np.array(
                self.problem.places[shortest_path.astype(int), 1])
            # shortest_path_point_name = self.problem.places[best_gen, 2]
            shortest_path_point = np.vstack(
                (shortest_path_point_x, shortest_path_point_y))
            print(shortest_path_point)

            print(shortest_path_point_x.shape)
            # print("点:", shortest_path_point)

            print("obj_trace:" + str(best_gen) + " 最短距离:" + str(shortest_dis))
            print("最短路径:" + str(shortest_path), end="\n")

        return self.finishing(population)  # 调用finishing完成后续工作并返回结果
Exemplo n.º 13
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
Exemplo n.º 14
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]
Exemplo n.º 15
0
 def run(self, prophetPop=None):  # prophetPop为先知种群(即包含先验知识的种群)
     #==========================初始化配置===========================
     problem = self.problem
     population = self.population
     NIND = population.sizes
     MAXSIZE = self.MAXSIZE
     if MAXSIZE is None:  # 检查MAXSIZE,默认取2倍的种群规模
         MAXSIZE = 2 * NIND
     self.initialization()  # 初始化算法模板的一些动态参数
     #===========================准备进化============================
     if population.Chrom is None:
         population.initChrom(NIND)  # 初始化种群染色体矩阵(内含解码,详见Population类的源码)
     else:
         population.Phen = population.decoding()  # 染色体解码
     self.problem.aimFunc(population)  # 计算种群的目标函数值
     NDSet = updateNDSet(population, problem.maxormins,
                         MAXSIZE)  # 计算适应度和得到全局非支配种群
     self.evalsNum = population.sizes  # 记录评价次数
     # 插入先验知识(注意:这里不会对先知种群prophetPop的合法性进行检查,故应确保prophetPop是一个种群类且拥有合法的Chrom、ObjV、Phen等属性)
     if prophetPop is not None:
         population = (prophetPop + population)[:NIND]  # 插入先知种群
     #===========================开始进化============================
     while self.terminated(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 = self.recOper.do(offspring.Chrom)  # 重组
         offspring.Chrom = self.mutOper.do(offspring.Encoding,
                                           offspring.Chrom,
                                           offspring.Field)  # 变异
         if population.Encoding == 'RI' and repRate > 0.1:
             offspring.Chrom = self.extraMutOper.do(
                 offspring.Encoding, offspring.Chrom,
                 offspring.Field)  # 执行额外的变异
         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,
                     Label='Pareto Front',
                     saveFlag=True,
                     gridFlag=True)
     # 返回帕累托最优集
     return NDSet
Exemplo n.º 16
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
Exemplo n.º 17
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
Exemplo n.º 18
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
Exemplo n.º 19
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完成后续工作并返回结果
Exemplo n.º 20
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 = self.recOper.do(offspring.Chrom) # 重组
         offspring.Chrom = self.mutOper.do(offspring.Encoding, offspring.Chrom, offspring.Field) # 变异
         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完成后续工作并返回结果
Exemplo n.º 21
0
 def run(self, prophetPop=None):  # prophetPop为先知种群(即包含先验知识的种群)
     # ==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     GGAP_NUM = int(np.ceil(NIND * self.GGAP))  # 计算每一代替换个体的个数
     self.initialization()  # 初始化算法类的一些动态参数
     # ===========================准备进化============================
     population.initChrom(NIND)  # 初始化种群染色体矩阵
     # 插入先验知识(注意:这里不会对先知种群prophetPop的合法性进行检查)
     if prophetPop is not None:
         population = (prophetPop + population)[:NIND]  # 插入先知种群
     self.call_aimFunc(population)  # 计算种群的目标函数值
     population.FitnV = ea.scaling(population.ObjV, population.CV,
                                   self.problem.maxormins)  # 计算适应度
     # ===========================开始进化============================
     while not self.terminated(population):
         # 选择
         offspring = population[ea.selecting(self.selFunc, population.FitnV,
                                             NIND)]
         # 进行进化操作
         offspring.Chrom = self.recOper.do(offspring.Chrom)  # 重组
         offspring.Chrom = self.mutOper.do(offspring.Encoding,
                                           offspring.Chrom,
                                           offspring.Field)  # 变异
         self.call_aimFunc(offspring)  # 计算目标函数值
         offspring.FitnV = ea.scaling(offspring.ObjV, offspring.CV,
                                      self.problem.maxormins)  # 计算适应度
         # 根据代沟把子代重插入到父代生成新一代种群
         population = self.reinsertion(population, offspring, GGAP_NUM)
         population.FitnV = ea.scaling(population.ObjV, population.CV,
                                       self.problem.maxormins)  # 计算适应度
     return self.finishing(population)  # 调用finishing完成后续工作并返回结果
Exemplo n.º 22
0
def multimin(AIM_M, AIM_F, NIND, NVAR, Base, MAXGEN, SUBPOP, GGAP, selectStyle,
             recombinStyle, recopt, pm, maxormin):
    """==========================初始化配置==========================="""
    # 获取目标函数和罚函数
    aimfuc = getattr(AIM_M, AIM_F)  # 获得目标函数
    BaseV = ga.crtbase(NVAR, Base)
    """=========================开始遗传算法进化======================="""
    Chrom = ga.crtbp(NIND, BaseV)  # 创建简单离散种群
    ObjV = aimfuc(Chrom)  # 计算种群目标函数值
    NDSet = np.zeros((0, Chrom.shape[1]))  # 定义帕累托最优解集合(初始为空集)
    NDSetObjV = np.zeros((0, ObjV.shape[1]))  # 定义帕累托最优解的目标函数值记录器
    start_time = time.time()  # 开始计时
    # 开始进化!!
    for gen in range(MAXGEN):
        # 求种群的非支配个体以及基于被支配数的适应度
        [FitnV, frontIdx] = ga.ndominfast(maxormin * ObjV)
        # 更新帕累托最优集以及种群非支配个体的适应度
        [FitnV, NDSet, NDSetObjV,
         repnum] = ga.upNDSet(Chrom, maxormin * ObjV, FitnV, NDSet,
                              maxormin * NDSetObjV, frontIdx)
        # 进行遗传操作!!
        SelCh = ga.selecting(selectStyle, Chrom, FitnV, GGAP, SUBPOP)  # 选择
        SelCh = ga.recombin(recombinStyle, SelCh, recopt, SUBPOP)  #交叉
        SelCh = ga.mut(SelCh, BaseV, pm)  # 变异
        ObjVSel = aimfuc(SelCh)  # 求育种个体的目标函数值
        # 求种群的非支配个体以及基于被支配数的适应度
        [FitnVSel, frontIdx] = ga.ndominfast(maxormin * ObjVSel)
        [Chrom, ObjV] = ga.reins(Chrom, SelCh, SUBPOP, 1, 1, FitnV, FitnVSel,
                                 ObjV, ObjVSel)  #重插入
    end_time = time.time()  # 结束计时
    # 返回进化记录器、变量记录器以及执行时间
    return [ObjV, NDSet, NDSetObjV, end_time - start_time]
Exemplo n.º 23
0
 def run(self, prophetPop=None):  # prophetPop为先知种群(即包含先验知识的种群)
     # ==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     self.initialization()  # 初始化算法类的一些动态参数
     # ===========================准备进化============================
     population.initChrom()  # 初始化种群染色体矩阵
     # 插入先验知识(注意:这里不会对先知种群prophetPop的合法性进行检查)
     if prophetPop is not None:
         population = (prophetPop + population)[:NIND]  # 插入先知种群
     self.call_aimFunc(population)  # 计算种群的目标函数值
     [levels, criLevel] = self.ndSort(population.ObjV, NIND, None, population.CV,
                                      self.problem.maxormins)  # 对NIND个个体进行非支配分层
     population.FitnV = (1 / levels).reshape(-1, 1)  # 直接根据levels来计算初代个体的适应度
     # ===========================开始进化============================
     while not self.terminated(population):
         # 进行差分进化操作
         r0 = ea.selecting(self.selFunc, population.FitnV, NIND)  # 得到基向量索引
         offspring = population.copy()  # 存储子代种群
         offspring.Chrom = self.mutOper.do(offspring.Encoding, offspring.Chrom, offspring.Field, [r0])  # 变异
         tempPop = population + offspring  # 当代种群个体与变异个体进行合并(为的是后面用于重组)
         offspring.Chrom = self.recOper.do(tempPop.Chrom)  # 重组
         self.call_aimFunc(offspring)  # 求进化后个体的目标函数值
         population = self.reinsertion(population, offspring, NIND)  # 重插入生成新一代种群
     return self.finishing(population)  # 调用finishing完成后续工作并返回结果
Exemplo n.º 24
0
 def run(self, prophetPop=None):  # prophetPop为先知种群(即包含先验知识的种群)
     # ==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     self.initialization()  # 初始化算法模板的一些动态参数
     # ===========================准备进化============================
     population.initChrom(NIND)  # 初始化种群染色体矩阵
     self.call_aimFunc(population)  # 计算种群的目标函数值
     # 插入先验知识(注意:这里不会对先知种群prophetPop的合法性进行检查,故应确保prophetPop是一个种群类且拥有合法的Chrom、ObjV、Phen等属性)
     if prophetPop is not None:
         population = (prophetPop + population)[:NIND]  # 插入先知种群
     population.FitnV = ea.scaling(population.ObjV, population.CV,
                                   self.problem.maxormins)  # 计算适应度
     # ===========================开始进化============================
     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] = self.recOpers[i].do(
                 offspring.Chroms[i])  # 重组
             offspring.Chroms[i] = self.mutOpers[i].do(
                 offspring.Encodings[i], offspring.Chroms[i],
                 offspring.Fields[i])  # 变异
         self.call_aimFunc(offspring)  # 计算目标函数值
         population = bestIndi + offspring  # 更新种群
         population.FitnV = ea.scaling(population.ObjV, population.CV,
                                       self.problem.maxormins)  # 计算适应度
     return self.finishing(population)  # 调用finishing完成后续工作并返回结果
Exemplo n.º 25
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完成后续工作并返回结果
Exemplo n.º 26
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] = self.recOpers[i].do(offspring.Chroms[i]) # 重组
             offspring.Chroms[i] = self.mutOpers[i].do(offspring.Encodings[i], offspring.Chroms[i], offspring.Fields[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完成后续工作并返回结果
Exemplo n.º 27
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:
            # 选择
            population = population[ea.selecting(self.selFunc,
                                                 population.FitnV, NIND)]
            # 进行进化操作,分别对各种编码的染色体进行重组和变异
            for i in range(population.ChromNum):
                population.Chroms[i] = self.recOpers[i].do(
                    population.Chroms[i])  # 重组
                population.Chroms[i] = self.mutOpers[i].do(
                    population.Encodings[i], population.Chroms[i],
                    population.Fields[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完成后续工作并返回结果
Exemplo n.º 28
0
    def reinsertion(self, population, offspring, NUM, globalNDSet):
        """
        描述:
            重插入个体产生新一代种群(采用父子合并选择的策略)。
            NUM为所需要保留到下一代的个体数目,globalNDSet为全局非支配解存档。
        """

        # 父子两代合并
        population = population + offspring
        globalNDSet = population + globalNDSet  # 将population与全局存档合并
        # 非支配排序分层
        [levels,
         criLevel] = self.ndSort(globalNDSet.ObjV, None, None, globalNDSet.CV,
                                 self.problem.maxormins)
        # 更新全局存档
        globalNDSet = globalNDSet[np.where(levels == 1)[0]]
        if globalNDSet.CV is not None:  # CV不为None说明有设置约束条件
            globalNDSet = globalNDSet[np.where(np.all(globalNDSet.CV <= 0,
                                                      1))[0]]  # 排除非可行解
        if globalNDSet.sizes > self.MAXSIZE:
            dis = ea.crowdis(globalNDSet.ObjV,
                             np.ones(globalNDSet.sizes))  # 计算拥挤距离
            globalNDSet = globalNDSet[np.argsort(
                -dis)[:self.MAXSIZE]]  # 根据拥挤距离选择符合个数限制的解保留在存档中
        # 选择个体保留到下一代
        levels = levels[:population.sizes]  # 得到与population个体对应的levels
        dis = ea.crowdis(population.ObjV, levels)  # 计算拥挤距离
        population.FitnV[:, 0] = np.argsort(np.lexsort(np.array([dis,
                                                                 -levels])),
                                            kind='mergesort')  # 计算适应度
        chooseFlag = ea.selecting('dup', population.FitnV,
                                  NUM)  # 调用低级选择算子dup进行基于适应度排序的选择,保留NUM个个体
        return population[chooseFlag], globalNDSet
Exemplo n.º 29
0
 def run(self, prophetPop = None): # prophetPop为先知种群(即包含先验知识的种群)
     #==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     self.initialization() # 初始化算法模板的一些动态参数
     #===========================准备进化============================
     if population.Chrom is None:
         population.initChrom() # 初始化种群染色体矩阵
     self.call_aimFunc(population) # 计算种群的目标函数值
     # 插入先验知识(注意:这里不会对先知种群prophetPop的合法性进行检查,故应确保prophetPop是一个种群类且拥有合法的Chrom、ObjV、Phen等属性)
     if prophetPop is not None:
         population = (prophetPop + population)[:NIND] # 插入先知种群
     [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)]
         # 对选出的个体进行进化操作
         offspring.Chrom = self.recOper.do(offspring.Chrom) # 重组
         offspring.Chrom = self.mutOper.do(offspring.Encoding, offspring.Chrom, offspring.Field) # 变异
         self.call_aimFunc(offspring) # 求进化后个体的目标函数值
         population = self.reinsertion(population, offspring, NIND) # 重插入生成新一代种群
     
     return self.finishing(population) # 调用finishing完成后续工作并返回结果
Exemplo n.º 30
0
 def run(self, prophetPop=None):  # prophetPop为先知种群(即包含先验知识的种群)
     # ==========================初始化配置===========================
     population = self.population
     NIND = population.sizes
     GGAP_NUM = int(np.ceil(NIND * self.GGAP))  # 计算每一代替换个体的个数
     self.initialization()  # 初始化算法模板的一些动态参数
     # ===========================准备进化============================
     population.initChrom(NIND)  # 初始化种群染色体矩阵
     self.call_aimFunc(population)  # 计算种群的目标函数值
     # 插入先验知识(注意:这里不会对先知种群prophetPop的合法性进行检查,故应确保prophetPop是一个种群类且拥有合法的Chrom、ObjV、Phen等属性)
     if prophetPop is not None:
         population = (prophetPop + population)[:NIND]  # 插入先知种群
     population.FitnV = ea.scaling(population.ObjV, population.CV,
                                   self.problem.maxormins)  # 计算适应度
     # ===========================开始进化============================
     while self.terminated(population) == False:
         # 选择
         offspring = population[ea.selecting(self.selFunc, population.FitnV,
                                             NIND)]
         # 进行进化操作,分别对各种编码的染色体进行重组和变异
         for i in range(offspring.ChromNum):
             offspring.Chroms[i] = self.recOpers[i].do(
                 offspring.Chroms[i])  # 重组
             offspring.Chroms[i] = self.mutOpers[i].do(
                 offspring.Encodings[i], offspring.Chroms[i],
                 offspring.Fields[i])  # 变异
         self.call_aimFunc(offspring)  # 计算目标函数值
         offspring.FitnV = ea.scaling(offspring.ObjV, offspring.CV,
                                      self.problem.maxormins)  # 计算适应度
         # 根据代沟把子代重插入到父代生成新一代种群
         population = self.reinsertion(population, offspring, GGAP_NUM)
         population.FitnV = ea.scaling(population.ObjV, population.CV,
                                       self.problem.maxormins)  # 计算适应度
     return self.finishing(population)  # 调用finishing完成后续工作并返回结果