def ga(self, population, gaFilePath): population.creatPopulation() # 生成种群 points = [] painter = Painter() painter.paintNetworkTopology(population.baseRadius, population.locationOfBase, population.locationOfUser, population.basevisitedUE, gaFilePath) '''存储结果,用于绘图,文件操作''' f = open(gaFilePath, 'w') iterations = 1 # 当前迭代次数 while (iterations <= population.iterations): fitness = population.getAllFitnessIntegral() maxFitnessInCurrentPopulation = max(fitness) print("代数:" + str(iterations) + " 最好值:" + str(maxFitnessInCurrentPopulation)) f.write("iterations: " + str(iterations) + " fitness: " + str(maxFitnessInCurrentPopulation) + '\n') if iterations == 1: maxFitness = maxFitnessInCurrentPopulation else: maxFitness = maxFitness if maxFitness > maxFitnessInCurrentPopulation else maxFitnessInCurrentPopulation points.append([iterations, maxFitnessInCurrentPopulation]) tempIndividulalList = [] while (len(tempIndividulalList) < population.sizeOfPopulation): individualForCrossover = population.select() # 选择--锦标赛选择法 if len(individualForCrossover) != 2: print("select error! " + str(len(individualForCrossover))) exit(1) individualForMutate = population.crossover( individualForCrossover) # 交叉随机点位的交叉操作,交叉完毕之后判断是否满足约束 if (len(individualForMutate) == 2): population.mutate(individualForCrossover) for i in range(len(individualForCrossover)): tempIndividulalList.append(individualForCrossover[i]) tempFitness = [] for i in range(len(tempIndividulalList)): fit = tempIndividulalList[i].getFitnessOfMatching() tempFitness.append(fit) for i in range(population.sizeOfPopulation): if tempIndividulalList == None: print(str(i) + "个体是空!") exit(1) if (tempFitness[i] > fitness[i]): population.individualList[i] = copy.deepcopy( tempIndividulalList[i]) iterations += 1 fitness = population.getAllFitnessIntegral() index = Utils.getImportant(fitness) print( "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9090909090" ) print(population.individualList[index].getFitnessOfMatching()) print("asm_array: " + str(population.individualList[index].asm_array)) print("ansArray: " + str(population.individualList[index].ansArray)) print("VN: " + str(population.VN)) print("C: " + str(population.individualList[index].C)) print("P: " + str(population.individualList[index].P)) f.write("end" + '\n' + "C: " + str(population.individualList[index].C) + '\n' + "P: " + str(population.individualList[index].P)) return [ population.individualList[index].C, population.individualList[index].P, fitness[index], population.individualList[index].ansArray ]
def ga(population, fileName, maxFitnessFile, typeOfVQD): population.initializationOfVQD(typeOfVQD) population.creatPopulation() # 生成种群 print(str(fileName) + " VQD: " + str(population.VQD)) print("typeOfVQD: " + str(typeOfVQD)) # 存储结果,用于绘图 points = [] maxFitness = -100 minFitness = -100 f = open(fileName, 'w') f.write(fileName + '\n') m = open(maxFitnessFile, 'w') m.write(maxFitnessFile + '\n') painter = Painter() painter.paintNetworkTopology(population.baseRadius, population.locationOfBase, population.locationOfUser, population.basevisitedUE, maxFitnessFile) '''存储结果,用于绘图,文件操作''' iterations = 1 # 当前迭代次数 while (iterations <= population.iterations): fitness = population.getAllFitnessIntegral() maxFitness = max(maxFitness, max(fitness)) minFitness = min(minFitness, min(fitness)) print("代数:" + str(iterations) + " 最好值:" + str(maxFitness / population.VNTimes)) m.write("iterations " + str(iterations) + ": " + str(maxFitness / population.VNTimes) + '\n') f.write("iterations " + str(iterations + 1) + '\n') f.write(str(fitness) + '\n') points.append([iterations, maxFitness]) tempIndividulalList = [] while (len(tempIndividulalList) < population.sizeOfPopulation): individualForCrossover = population.select() # 选择--锦标赛选择法 if len(individualForCrossover) != 2: print("select error! " + str(len(individualForCrossover))) exit(1) individualForMutate = population.crossover( individualForCrossover) # 交叉随机点位的交叉操作,交叉完毕之后判断是否满足约束 if (len(individualForMutate) == 2): population.mutate(individualForCrossover) for i in range(len(individualForCrossover)): tempIndividulalList.append(individualForCrossover[i]) tempFitness = [] for i in range(len(tempIndividulalList)): fit = tempIndividulalList[i].getFitnessWithIntegral() tempFitness.append(fit) for i in range(population.sizeOfPopulation): if tempIndividulalList == None: print(str(i) + "个体是空!") exit(1) if (tempFitness[i] > fitness[i]): population.individualList[i] = copy.deepcopy( tempIndividulalList[i]) iterations += 1 m.write(str(points) + '\n') f.close() m.close() # 返回画图所需的数据 result = Result(fileName, minFitness, points, maxFitness) return result