参考文献:MATLAB遗传算法工具箱及应用
遗传算法是1962年由美国
Michigon大学的John
Holland教授提出的模拟自然界遗传机制和生物进化论而成的一种并行的随机搜索最优化方法。
关键词:个体,染色体,基因,适应性,群体,种群,交叉,变异。
遗传算法的基本操作:选择,交叉,变异。
1.选择(复制)是从一个旧种群中选择生命力强的个体产生新种群的过程。复制能从旧种群选择出优秀者,但不能创造新的染色体。
2.交叉通过两个染色体的交换组合,来产生新的优良品种。交叉的过程:任意选两个染色体,随机选择一点或多点交换点位置,交换双亲染色体交换点右边的部分。
3.变异以很小的概率随机地改变遗传基因的值。在染色体以二进制编码的系统中,它随机地将染色体的某一基因由1变为0,或由0变为1。(防止陷入局部解而终止过程)
遗传算法的特点:
1 遗传算法是对参数的编码进行操作,而非对参数本身;
2 并行性:同时使用多个搜索点的搜索信息。(单个搜索点提供的信息不多,搜索效率不高,甚至使搜索过程局限于局部最优解)
3 遗传算法直接以目标函数作为搜索信息。不需要导数值等辅助信息。也不要求函数连续,可微。
注意:
1.群体规模的选择:规模越大,多样性越高,陷入局部解的危险越小;太大的话计算量增加,效率降低。
2.对于一些多维、高精度要求的连续函数优化问题,使用二进制编码来表示个体时将会有一些不利之处
。二进制编码存在着连续函数离散化时的映射误差。个体长度较短时,可能达不到精度要求,而个体编码长度较长时,虽然能提高精度,但却使遗传算法的搜索空间急剧扩大。
遗传算法的具体例证
第一步:确定决策变量和约束条件
第二步:建立优化模型
第三步:确定编码方法
将变量转换成二进制串。串的长度取决于所要求的精度。如果变量x的区间是[a,b],要求的精度是小数点后4位,也就意味着每个变量应该被分成至少(b-a)*104个部分。用下面的公式确定二进制串的位数m:
2m-1<(b-a)*104<2m-1.
第四步:确定解码
X(实际值)=a+de(x)*(b-a)/(2m-1)
de(x)为二进制x的十进制数。
初始种群
U1=[000001010100101001101111011111110]
U2=[001110101110011000000010101001000]
U3=[111000111000001000010101001000110]
U4=[100110110100101101000000010111001]
U5=[000010111101100010001110001101000]
U6=[111110101011011000000010110011001]
U7=[110100010011111000100110011101101]
U8=[001011010100001100010110011001100]
U9=[111110001011101100011101000111101]
U10=[111101001110101010000010101101010]
第五步:确定个体评价方法。
第六步:设计遗传算子和确定遗传算法的运行参数。
轮盘赌算法:
生成一个 [0,1]间的随机数r;如果r大于染色体的累计概率,就选择该染色体。
依次转动轮盘10次。
得到新的种群:
U1(U4)=[100110110100101101000000010111001]
U2(U4)=[100110110100101101000000010111001]
U3(U8)=[
001011010100001100010110011001100]
U4(U9)=[
111110001011101100011101000111101]
U5(U4)=[
100110110100101101000000010111001]
U6(U7)=[
110100010011111000100110011101101]
U7(U2)=[
001110101110011000000010101001000]
U8(U4)=[
100110110100101101000000010111001]
U9(U1)=[
000001010100101001101111011111110]
U10(U2)=[
001110101110011000000010101001000]
交叉运算使用单点交叉算子。
随机选择一个染色体串的节点,然后交换两个父辈节点右端部分来产生子辈。
假设交叉概率为p=25%,即在平均水平上有25%的染色体进行了交叉。过程如下:
开始
当k=<10时继续
产生一个[0,1]间的随机数r
如果r<0.25,则
选择Uk为交叉的一个父辈;
结束
K=k+1;
结束
结束
假设随机数如下:
0.625721 0.266823 0.288644 0.295114 0.163274 0.567461 0.08594 0.392865 0.770714 0.548656
那么,就意味着染色体U5和U7被选中作为交叉的父辈。之后随机选择一个[1,32]间的证书作为交叉点。
变异运算使用基本位变异算子。
将变异概率设为p=0.01,就是说,希望在平均水平上,种群内所有的基因的1%要进行变异。在本例中,共有33*10=330个基因。因此,我们要生成一个位于[0,1]间的随机数洗了rk(k=1,..,330)。
至此,完成了遗传算法第一代的流程。