在文章《优化设计之遗传算法》中介绍了遗传算法的基本概念和程序编制流程,本文将通过一个具体的程序算例来详细介绍遗传算法的程序编写方法和计算流程。
通过上文可以知道,通过遗传算法进行优化设计共分为五个主要的步骤:产生初始种群、进行个体评价、选择染色体、交叉染色体、变异染色体。下面介绍具体的实现方法,程序使用Python语言编写。
示例:使用遗传算法求解如下所示函数的全局最大值。
1、产生初始种群
本例采用二进制编码方法,由于变量的取值范围为0到7,因此每个变量采用一个3位二进制编码,一个染色体为6位二进制,示例染色体:011101.种群的个体数设置为4个,采用随机数的方法产生初始种群。
2、个体评价和选择
使用优化目标函数进行个体评价,并计算个体的适应度系数。对个体的适应度系数累加生成个体的适应度区间。使用随机数对个体进行选择,生成0到1之间的随机数,随机数位于哪个个体的适应度区间就选择哪个个体,适应度越大的个体被选中的概率越大。
3、染色体交叉
由于染色体的选择是随机的,直接按选出的顺序对1、2号染色体,3、4号染色体进行配对。使用随机数决定染色体交叉的位置,对染色体进行交叉变换。
4、染色体变异
同样使用随机数决定染色体变异的位置,由于采用的是二进制的编码方法,直接将变异的位取反即可(0变成1,1变成0)。
以上步骤全部执行完成后,就完成了一次迭代过程。执行指定的迭代次数后,输出适应度最高的个体及其对应的目标函数值即为最终的优化结果。下图所示为一次完整的迭代过程:
完整的程序代码如下所示:
import randomimport numpydef ga(): #初始种群 P=numpy.zeros((31,4)) P=P.astype(int) #变量 X1=numpy.zeros((30,4)) X1=X1.astype(int) X2=numpy.zeros((30,4)) X2=X2.astype(int) #适应度 F=numpy.zeros((30,4)) #适应度系数 Fi=numpy.zeros((30,4)) #适应度概率区间 R=numpy.zeros(4) #选择结果 X=numpy.zeros(4) X=X.astype(int) #交叉结果 J=numpy.zeros(4) J=J.astype(int) #迭代结果 RX1=numpy.zeros(30) RX1=RX1.astype(int) RX2=numpy.zeros(30) RX2=RX2.astype(int) RF=numpy.zeros(30) #生成初始种群 for i in range(4): P[0][i]=random.randrange(0,64,1) for n in range(30): #解码求解适应度 for i in range(4): X1[n][i]=P[n][i]>>3 X2[n][i]=P[n][i]&0b000111 F[n][i]=X1[n][i]*X1[n][i]+X2[n][i]*X2[n][i] #保存最优解 if RF[n] RX1[n]=X1[n][i] RX2[n]=X2[n][i] RF[n]=F[n][i] #计算适应度系数 for i in range(4): Fi[n][i]=F[n][i]/F[n].sum() #计算适应度区间 R[0]=Fi[n][0] for i in range (1,4): R[i]=R[i-1]+Fi[n][i] #选择 for i in range(4): t=random.random() if t<=R[0]: X[i]=P[n][0] elif t<=R[1]: X[i]=P[n][1] elif t<=R[2]: X[i]=P[n][2] else: X[i]=P[n][3] #交叉 for i in range(0,4,2): Jn=random.randrange(1,6,1) J[i]=(X[i]&(pow(2,Jn)-1))+(X[i+1]&(64-pow(2,Jn))) J[i+1]=(X[i]&(64-pow(2,Jn)))+(X[i+1]&(pow(2,Jn)-1)) #变异 for i in range(4): Pn=random.randrange(0,6,1) P[n+1][i]=J[i]^(1< vlist=RF.tolist() print(RX1) print(RX2) print(RF) print("max value:",max(vlist)) print("x1:",RX1[vlist.index(max(vlist))]) print("x2:",RX2[vlist.index(max(vlist))])
程序将进化代数设置为30,下图所示为进化过程中x1、x2及f(x)的全部迭代数值及最终获得的最优解。从程序的运算过程可以看出,第7次迭代就已经找到了最优解。
点击下方关键词查看更多相关文章,或点击下方搜索更多公众号文章。
?来个“分享、点赞、在看”?