$n:(5(f1y! G2 T j
% t2 F0 N# p$ x. y! W$ j- o1 o,ppython实现的遗传算法的实例(一) ) ) ) ) ) ) ) ) ) ) ) ) )。
) h # fa # n : p ' AC ' ^ 4g % [ 8i 6至% l # ] $ bs2u ' [ 7b 3360 ] u ]
一、遗传算法介绍
遗传算法通过模拟自然界生物进化的历史来解决问题。 自然中的一个种群经过几代人的自然选择后,剩下的种群一定会适应环境。 把一个问题的所有解都看作一个种群,经历了几次自然选择后,剩下的解中有问题的最优解。 当然,只能说有最佳解的概率很高。 这里,用遗传算法求出一个函数的最大值。 4 ); z: O3 }3 A/b0 a% X/bY
对f(x )=10*sin ) 5x )7*cos ) 4x )、0=x=101和参数x进行编码
假设基因片段的长度为10,则10位二进制位所能表示的范围为0至1023。 基因和自变量的转换公式为x=b2d(individual ) * 10/1023。 构建早期种群pop。 每个个体的基因初始值为[0、1、0、1、0、1、0、1、0、0、1]2,计算目标函数值
根据自变量和基因的变换关系式,求出与每个个体的基因对应的自变量,将自变量代入函数f(x ),求出每个个体的目标函数值。 3、适应度函数
适应度函数是用于评价个体适应环境的能力,是进行自然选择的依据。 本问题的适应度函数使目标函数值中的负值直接为0。 我们求最大值,所以目标函数值为负的个体不适应环境,繁殖后代的能力为0。 适应度函数的作用体现在自然选择上。 4、自然选择
省略自然选择的思想,在操作中使用轮盘赌算法。 其具体步骤:
假设种群中合计计算了5个个体的适应度函数的个体适应度列表为fitvalue=[1、3、0、2、4],totalvalue=10,在圆盘上描绘fitvalue时,值的大小表示圆盘上的面积。 旋转轮盘时,各个模块的面积越大,被选中的概率越高。 的方法。 将fitvalue转换为[ 1,4,4,6,10 ],fitvalue总值=[ 0.1,0.4,0.4,0.6,1.0 ]。 然后生成5个0-1之间的随机数,按照从小到大的顺序对随机数进行排序。 如果是这样,自然选择的结果是种群变得更符合条件。 5、繁殖
个体a、b的基因
a=[ 1,0,0,0,1,1,1,0,0 ]
4杰夫; [8 ]: y
b=[ 0,0,0,1,1,0,1,1,1,1 ]
#0H5CL4U,k8 u
这两个个体发生基因交换的概率是pc=0.6。 发生基因交换时,会产生表示基因交换位置的随机数point,假设point=4,则为:
7 ZX: K2 ~2 Y. v9 d
a=[ 1,0,0,0,0,1,1,1,0,0 ] 3l3z ' q.e/mo6v ' @ : m! LL
b=[ 0,0,0,1,1,0,1,1,1,1 ]
更换后,(RJ3 G3 ~) ) O0 b% T. n; q: _; V/^
a=[ 1,0,0,0,1,0,1,1,1,1 ] 1m! p ) x5d; b- w/_; K
b=[ 0,0,0,1,0,1,1,1,0,0 ] 6,突变
横穿各个个体后,基因的各位发生突变(0为1,1为0 )的概率为0.001。 突变增加了解空间二,代码def b2d(b ) b ) : #,二进制为十进制x[0, 10 ]变换为t=0forjinrange (len ) ) b )的j ) t=t * 10/1023 return tpopsize=50 #种群大小(用遗传算法求函数最大值) #f(x )=10 ) chrom #基因突变的概率results=[ ] bestindividual=[ ] bestfit=0fit value=[ ] tempop=[ ] ] pop=[ 0,1,0,1,0,0
alfitvalue(objvalue); #计算个体的适应值 [bestindividual, bestfit] = best(pop, fitvalue) #选出最好的个体和最好的函数值 results.append([bestfit,b2d(bestindividual)]) #每次繁殖,将最好的结果记录下来 selection(pop, fitvalue) #自然选择,淘汰掉一部分适应性低的个体 crossover(pop, pc) #交叉繁殖 mutation(pop, pc) #基因突变 results.sort() print(results[-1]) #打印函数最大值和对应的def calfitvalue(objvalue):#转化为适应值,目标函数值越大越好,负值淘汰。 fitvalue = [] temp = 0.0 Cmin = 0; for i in range(len(objvalue)): if(objvalue+ Cmin > 0): temp = Cmin + objvalueelse: temp = 0.0 fitvalue.append(temp) return fitvalueimport mathdef decodechrom(pop): #将种群的二进制基因转化为十进制(0,1023) temp = []; for i in range(len(pop)): t = 0; for j in range(10): t += pop[j] * (math.pow(2, j)) temp.append(t) return tempdef calobjvalue(pop): #计算目标函数值 temp1 = []; objvalue = []; temp1 = decodechrom(pop) for i in range(len(temp1)): x = temp1* 10 / 1023 #(0,1023)转化为 (0,10) objvalue.append(10 * math.sin(5 * x) + 7 * math.cos(4 * x)) return objvalue #目标函数值objvalue[m] 与个体基因 pop[m] 对应 def best(pop, fitvalue): #找出适应函数值中最大值,和对应的个体 px = len(pop) bestindividual = [] bestfit = fitvalue[0] for i in range(1,px): if(fitvalue> bestfit): bestfit = fitvaluebestindividual = popreturn [bestindividual, bestfit]import randomdef sum(fitvalue): total = 0 for i in range(len(fitvalue)): total += fitvaluereturn totaldef cumsum(fitvalue): for i in range(len(fitvalue)): t = 0; j = 0; while(j <= i): t += fitvalue[j] j = j + 1 fitvalue= t;def selection(pop, fitvalue): #自然选择(轮盘赌算法) newfitvalue = [] totalfit = sum(fitvalue) for i in range(len(fitvalue)): newfitvalue.append(fitvalue/ totalfit) cumsum(newfitvalue) ms = []; poplen = len(pop) for i in range(poplen): ms.append(random.random()) #random float list ms ms.sort() fitin = 0 newin = 0 newpop = pop while newin < poplen: if(ms[newin] < newfitvalue[fitin]): newpop[newin] = pop[fitin] newin = newin + 1 else: fitin = fitin + 1 pop = newpopimport randomdef crossover(pop, pc): #个体间交叉,实现基因交换 poplen = len(pop) for i in range(poplen - 1): if(random.random() < pc): cpoint = random.randint(0,len(pop[0])) temp1 = [] temp2 = [] temp1.extend(pop[0 : cpoint]) temp1.extend(pop[i+1][cpoint : len(pop)]) temp2.extend(pop[i+1][0 : cpoint]) temp2.extend(pop[cpoint : len(pop)]) pop= temp1 pop[i+1] = temp2import randomdef mutation(pop, pm): #基因突变 px = len(pop) py = len(pop[0]) for i in range(px): if(random.random() < pm): mpoint = random.randint(0,py-1) if(pop[mpoint] == 1): pop[mpoint] = 0 else: pop[mpoint] = 1! ]( J9 j7 k( a: v7 K, Q# o- a/ f( Y8 / t* s
' P# c+ |( I" g( Q