函数极值遗传算法c语言,遗传算法解简单的函数极值问题

5

6 x_label=[]7 y_label=[]#将每一步迭代的结果存储到列表中,便于画图

8 classGA(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 inrange(number)]18 def initial_chromosome(self,length):#编码

19 """

20 随机生成长度为length的染色体,每个基因的取值是0或121 这里用一个bit表示一个基因22 """

23 chromosome =024 for i inrange(self.length):25 chromosome |= (1 << i) * random.randint(0, 1)26 #print(chromosome)

27 #print(num)

28 returnchromosome29 def decode(self,chromosome):#解码

30 x = chromosome*(self.upper_boundary-self.lower_boundary)/(2**self.length-1)31 returnx32 def fitness_function(self,chromosome):#适应度函数

33 x =self.decode(chromosome)34 y = x + 10 * numpy.sin(5 * x) + 7 * numpy.cos(4 *x)35 returny36 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 defselection(self,retain_rate, random_select_rate):44 graded = [(self.fitness_function(chromosome), chromosome) for chromosome inself.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 insort[retain_length:]:50 if random.random() <51 parents.append returnparents53 def crossover>

54 children=[]55 #需要繁殖的子代数量

56 target_number=len(self.population)-len(parents)57 #开始繁殖

58 while len(children) <59 father="random.randint(0," len mother="random.randint(0," if>

63 cross_point =random.randint(0, self.length)64 #生成掩码,方便位操作

65 mark =066 for i inrange(cross_point):67 mark |= (1 <

71 child = ((father & mark) | (mother & ~mark)) & ((1 << self.length) - 1)72 children.append(child)73 #经过繁殖后,孩子和父母的数量与原始种群数量相等,在这里可以更新种群。

74 self.population = parents +children75 defmutation(self,rate):76 for i inrange(len(self.population)):77 if random.random() <78 j="random.randint(0," self.length>

79 self.population[i] ^= 1 << j #产生变异

80 defresult(self):81 '''

82 获得近优值83 '''

84 graded = [(self.fitness_function(chromosome), chromosome) for chromosome inself.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 returnself.decode(graded[0])91 defiteration(self,iter_number):92 for i inrange(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()

cd0025d3892e391df6cf1e6135fa813d.png

78>59>51>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值