基因遗传演算法是个啥?求详解
基因遗传演算法主要理论就是优胜劣汰的进化论。
它的主要精神是透过每次迭代都能比上次更进步,逐步演化,表现出针对一个目标函数寻求最佳解的过程。但是因为是随机搜索,所以虽然基因演算法设置如交配、突变等来避免,却仍可能会陷入区域最佳解;也有可能最后得到的不是最佳解,只是在结束条件之前找到的最好的解。
基本的基因演算法流程:
1.初始化族群:假定这个族群中有4条染色体,每条染色体有5个基因。
基因 -从目标函数的角度来看,就是自变数。
例如:用基因演算法解目标函数 f(X,Y,Z)=2X+3Y-Z,
限制式为「X,Y,Z={1,0}」※,
求目标函数的最大值。
此题目对应到染色体的概念,就有3个基因,
三个基因分别代表X、Y、Z三个自变数的值。
染色体 -单一组解
例如:有很多符合目标函数限制式的(X,Y,Z),
其中一组是(x1,y1,z1)=(1,0,0),
函数值 f(x1,y1,z1)为2*1+3*0-0=2。
此例中,这组解当然不是最佳解,但它是这个题目的一个可行解。
*想像我们用直觉解题,拿张计算纸,把所有可行解都列出来,
然后比较所有我们想得到的可行解,最后可以得
到最佳的一组(X,Y,Z),因为它的f(X,Y,Z)为最大值。
族群 -多组解的集合
例如:族群中有四条染色体,这四条染色体就是四组可行解。
2.设定交配率和突变率:假定交配率a为0.6,突变率b为0.1。
交配率 -每个世代中,族群内有多少比率的染色体会互相交配。
突变率 -每个世代中,族群内的染色体有多少机率会突变。
3.迭代世代。
For iter=10 -假定做十次优胜劣汰。
3.1. 天择:在这个世代中,根据每条染色体的权重,随机选择母代来产生后代,
用以做下一个运算。
通常使用轮盘法来作天择,也就是说,
如果染色体甲的解是这个族群中最好的,
那么甲的权重就是最高的。反之则是最低的。
*轮盘法:假定这次族群为「[1,1,1],[0,1,1],[1,0,1],[1,0,0]」,
四条染色体的适应值分别是「4,2,1,2」,
适应值总和为4+2+1+2=9,
则四条染色体被选到的机会为「4/9,2/9,1/9,2/9」
=「0.4,0.2,0.1,0.2」。这个机会就是权重。
为了不让每次选择都选到同一条染色体,所以只是
「有比较高的机会」选择到「有更好适应值的染色体」,
而不是一定会选择这个好适应值的染色体。
3.2. 交配:母代产生后,依照交配率a,随机选择染色体来作交配。
比较交配前的子代1和交配后的子代2,在8条染色体中,
选择适应值最好的4条染色体留下来。
最简单的交配方式就是交换两条染色体的某个基因。
*例如,染色体S=[0,1,0],染色体Q=[1,1,1],交配位于首位的基因,
则可以得到新的两条染色体S =[1,1,0]、Q =[0,1,1]。
3.3. 突变:交配完后,依照突变率b,决定这一个世代要不要突变。
假设要突变,则若突变后子代3的适应值比突变前子代2好,就用子代3取代子代2。
最简单的突变方式就是随机选择某条染色体的某个基因,改变它。
*例如,随机选中染色体M=[1,0,1],随机突变中间的基因,
得到新染色体M =[1,1,1] 。
3.4. 更新:最后得到的族群中,所有染色体的适应值。
END For
4. 比较所有染色体的适应值,列出最好的那一个染色体为演算法最后的解。
※一般使用二元染色体,限制染色体的基因只会等于零或壹。
在此处只是方便解说,所以直接把限制式设成零和壹。
假设我们用二元染色体来解目标函数f(x)=x^2的最大值,限制式为0<=x<=7,x为整数。
用基因演算法求解,则需要产生log_2(8)=3个基因,
简单说来,就是用二进位表示一个有限整数值。
(也可以把基因想成电脑的位元数,我们用三个位元来表示一个有限的整数值。)
这样做的话,突变的方法就是直接把某个基因转成零或壹,
不用设定要更改多少值(例如加3、加100或减0.8)(基因演算法应该一般不会这样做);
计算适应值时,互相转换二进位与十进位。
基因三个,则可以表达:
111=2^2+2^1+2^0=4+2+1=7
110=2^2+2^1=4+2=6
101=2^2+2^0=4+1=5
100=4
001=1
000=0
011=3
010=2
它的主要精神是透过每次迭代都能比上次更进步,逐步演化,表现出针对一个目标函数寻求最佳解的过程。但是因为是随机搜索,所以虽然基因演算法设置如交配、突变等来避免,却仍可能会陷入区域最佳解;也有可能最后得到的不是最佳解,只是在结束条件之前找到的最好的解。
基本的基因演算法流程:
1.初始化族群:假定这个族群中有4条染色体,每条染色体有5个基因。
基因 -从目标函数的角度来看,就是自变数。
例如:用基因演算法解目标函数 f(X,Y,Z)=2X+3Y-Z,
限制式为「X,Y,Z={1,0}」※,
求目标函数的最大值。
此题目对应到染色体的概念,就有3个基因,
三个基因分别代表X、Y、Z三个自变数的值。
染色体 -单一组解
例如:有很多符合目标函数限制式的(X,Y,Z),
其中一组是(x1,y1,z1)=(1,0,0),
函数值 f(x1,y1,z1)为2*1+3*0-0=2。
此例中,这组解当然不是最佳解,但它是这个题目的一个可行解。
*想像我们用直觉解题,拿张计算纸,把所有可行解都列出来,
然后比较所有我们想得到的可行解,最后可以得
到最佳的一组(X,Y,Z),因为它的f(X,Y,Z)为最大值。
族群 -多组解的集合
例如:族群中有四条染色体,这四条染色体就是四组可行解。
2.设定交配率和突变率:假定交配率a为0.6,突变率b为0.1。
交配率 -每个世代中,族群内有多少比率的染色体会互相交配。
突变率 -每个世代中,族群内的染色体有多少机率会突变。
3.迭代世代。
For iter=10 -假定做十次优胜劣汰。
3.1. 天择:在这个世代中,根据每条染色体的权重,随机选择母代来产生后代,
用以做下一个运算。
通常使用轮盘法来作天择,也就是说,
如果染色体甲的解是这个族群中最好的,
那么甲的权重就是最高的。反之则是最低的。
*轮盘法:假定这次族群为「[1,1,1],[0,1,1],[1,0,1],[1,0,0]」,
四条染色体的适应值分别是「4,2,1,2」,
适应值总和为4+2+1+2=9,
则四条染色体被选到的机会为「4/9,2/9,1/9,2/9」
=「0.4,0.2,0.1,0.2」。这个机会就是权重。
为了不让每次选择都选到同一条染色体,所以只是
「有比较高的机会」选择到「有更好适应值的染色体」,
而不是一定会选择这个好适应值的染色体。
3.2. 交配:母代产生后,依照交配率a,随机选择染色体来作交配。
比较交配前的子代1和交配后的子代2,在8条染色体中,
选择适应值最好的4条染色体留下来。
最简单的交配方式就是交换两条染色体的某个基因。
*例如,染色体S=[0,1,0],染色体Q=[1,1,1],交配位于首位的基因,
则可以得到新的两条染色体S =[1,1,0]、Q =[0,1,1]。
3.3. 突变:交配完后,依照突变率b,决定这一个世代要不要突变。
假设要突变,则若突变后子代3的适应值比突变前子代2好,就用子代3取代子代2。
最简单的突变方式就是随机选择某条染色体的某个基因,改变它。
*例如,随机选中染色体M=[1,0,1],随机突变中间的基因,
得到新染色体M =[1,1,1] 。
3.4. 更新:最后得到的族群中,所有染色体的适应值。
END For
4. 比较所有染色体的适应值,列出最好的那一个染色体为演算法最后的解。
※一般使用二元染色体,限制染色体的基因只会等于零或壹。
在此处只是方便解说,所以直接把限制式设成零和壹。
假设我们用二元染色体来解目标函数f(x)=x^2的最大值,限制式为0<=x<=7,x为整数。
用基因演算法求解,则需要产生log_2(8)=3个基因,
简单说来,就是用二进位表示一个有限整数值。
(也可以把基因想成电脑的位元数,我们用三个位元来表示一个有限的整数值。)
这样做的话,突变的方法就是直接把某个基因转成零或壹,
不用设定要更改多少值(例如加3、加100或减0.8)(基因演算法应该一般不会这样做);
计算适应值时,互相转换二进位与十进位。
基因三个,则可以表达:
111=2^2+2^1+2^0=4+2+1=7
110=2^2+2^1=4+2=6
101=2^2+2^0=4+1=5
100=4
001=1
000=0
011=3
010=2