码迷,mamicode.com
首页 > 编程语言 > 详细

遗传算法解简单的函数极值问题

时间:2018-03-11 00:30:47      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:cos   列表   col   ima   mos   ade   sele   技术   表示   

  1 import numpy
  2 import matplotlib.pyplot as plt
  3 import random
  4 import operator
  5 
  6 x_label=[]
  7 y_label=[]#将每一步迭代的结果存储到列表中,便于画图
  8 class GA(object):
  9     def __init__(self,length,number,lower_boundary,upper_boundary,iter_number):
 10         self.length = length#确定染色体编码长度
 11         self.number = number#确定初始化种群数量
 12         self.lower_boundary = lower_boundary#定义域下界
 13         self.upper_boundary = upper_boundary#定义域上届
 14         self.population = self.initial_population(length,number)
 15         self.iteration(iter_number)
 16     def initial_population(self,length,number):#初始化种群
 17         return [self.initial_chromosome(length) for i in range(number)]
 18     def initial_chromosome(self,length):#编码
 19             """
 20             随机生成长度为length的染色体,每个基因的取值是0或1
 21             这里用一个bit表示一个基因
 22             """
 23             chromosome = 0
 24             for i in range(self.length):
 25                 chromosome |= (1 << i) * random.randint(0, 1)
 26                 # print(chromosome)
 27                 # print(num)
 28             return chromosome
 29     def decode(self,chromosome):#解码
 30         x = chromosome*(self.upper_boundary-self.lower_boundary)/(2**self.length-1)
 31         return x
 32     def fitness_function(self,chromosome):#适应度函数
 33         x = self.decode(chromosome)
 34         y = x + 10 * numpy.sin(5 * x) + 7 * numpy.cos(4 * x)
 35         return y
 36     def evolution(self, retain_rate=0.2, random_select_rate=0.5, mutation_rate=0.01):
 37         """
 38         对当前种群依次进行选择、交叉并生成新一代种群,然后对新一代种群进行变异
 39         """
 40         parents = self.selection(retain_rate, random_select_rate)
 41         self.crossover(parents)
 42         self.mutation(mutation_rate)
 43     def selection(self,retain_rate, random_select_rate):
 44         graded = [(self.fitness_function(chromosome), chromosome) for chromosome in self.population]
 45         sort = [x[1] for x in sorted(graded, reverse=True)]
 46         retain_length=int(len(sort)*retain_rate)
 47         #选出适应性强的个体,精英选择
 48         parents=sort[:retain_length]
 49         for chromosome in sort[retain_length:]:
 50             if random.random() < random_select_rate:
 51                 parents.append(chromosome)
 52         return parents
 53     def crossover(self,parents):#交叉
 54         children=[]
 55         #需要繁殖的子代数量
 56         target_number=len(self.population)-len(parents)
 57         #开始繁殖
 58         while len(children) < target_number:
 59             father = random.randint(0, len(parents) - 1)
 60             mother = random.randint(0, len(parents) - 1)
 61             if father != mother:
 62                 # 随机选取交叉点
 63                 cross_point = random.randint(0, self.length)
 64                 # 生成掩码,方便位操作
 65                 mark = 0
 66                 for i in range(cross_point):
 67                     mark |= (1 << i)
 68                 father = parents[father]
 69                 mother = parents[mother]
 70                 # 孩子将获得父亲在交叉点前的基因和母亲在交叉点后(包括交叉点)的基因
 71                 child = ((father & mark) | (mother & ~mark)) & ((1 << self.length) - 1)
 72                 children.append(child)
 73                 # 经过繁殖后,孩子和父母的数量与原始种群数量相等,在这里可以更新种群。
 74         self.population = parents + children
 75     def mutation(self,rate):
 76         for i in range(len(self.population)):
 77             if random.random() < rate:
 78                 j = random.randint(0, self.length - 1)#s随机产生变异位置
 79                 self.population[i] ^= 1 << j  #产生变异
 80     def result(self):
 81         ‘‘‘
 82         获得近优值
 83         ‘‘‘
 84         graded = [(self.fitness_function(chromosome), chromosome) for chromosome in self.population]
 85         graded = [x[1] for x in sorted(graded, reverse=True)]
 86         # print(‘近优的x值为:‘, self.decode(graded[0]),
 87         #       ‘近优的y值为:‘, self.fitness_function(graded[0]))
 88         #将每一步迭代的结果存储到列表中
 89         y_label.append(self.fitness_function(graded[0]))
 90         return self.decode(graded[0])
 91     def iteration(self,iter_number):
 92         for i in range(iter_number):
 93             self.evolution()
 94             self.result()
 95             x_label.append(i)
 96 g1=GA(17,300,0,9,30)#建立一个实例
 97 
 98 plt.plot(x_label,y_label)
 99 plt.show()
100 g1.result()

技术分享图片

 

遗传算法解简单的函数极值问题

标签:cos   列表   col   ima   mos   ade   sele   技术   表示   

原文地址:https://www.cnblogs.com/yangmingustb/p/8542096.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!