遗传算法的计算步骤
例1:设,求 .
(1)编码和产生初始体
首先第一步要确定编码的策略,也就是说如何把到2这个区间内的数用计算机语言表示出来.编码时要注意以下三个原则:
完备性:问题空间中所有点(潜在解)都能成为GA编码空间中的点(染体位串)的表现型;
健全性:GA编码空间中的染体位串必须对应问题空间中的某一潜在解;
非冗余性:染体和潜在解必须一一对应.
这里我们通过采用二进制的形式来解决编码问题,将某个变量值代表的个体表示为一个{0,1}二进制串.当然,串长取决于求解的精度.如果要设定求解精度到六位小数,由于区间长度为,则必须将闭区间 分为等分.因为 所以编码的二进制串至少需要22位.
将一个二进制串(b21b20b19…b1b0)转化为区间内对应的实数值很简单,只需采取以下两步:
1)将一个二进制串(b21b20b19…b1b0)代表的二进制数化为10进制数:
2) 对应的区间内的实数:
例如,一个二进制串a=<1000101110110101000111>表示实数0.637197.
=(1000101110110101000111)2=2288967
二进制串<0000000000000000000000>,<1111111111111111111111>,则分别表示区间的两个端点值-1和2.
利用这种方法完成了遗传算法的第一步——编码,这种二进制编码的方法完全符合上述的编码的三个原则.
首先我们来随机的产生一个个体数为4个的初始体如下:
pop(1)={
<1101011101001100011110>, %% a1
<1000011001010001000010>, %% a2
<0001100111010110000000>, %% a3
<0110101001101110010101>} %% a4
化成十进制的数分别为:
pop(1)={ 1.523032,0.574022 ,-0.697235 ,0.247238 }
接下来我们就要解决每个染体个体的适应值问题了.
(2)定义适应函数和适应值
二进制转换方法的口诀由于给定的目标函数在内的值有正有负,所以必须通过建立适应函数与目标函数的映射关系,保证映射后的适应值非负,而且目标函数的优化方向应对应于适应值增大的方向,也为以后计算各个体的入选概率打下基础.
对于本题中的最大化问题,定义适应函数,采用下述方法:
式中既可以是特定的输入值,也可以是当前所有代或最近K代中的最小值,这里为了便于计算,将采用了一个特定的输入值.
若取,则当时适应函数;当时适应函数.
由上述所随机产生的初始体,我们可以先计算出目标函数值分别如下
f [pop(1)]={ 1.226437 , 1.318543 , -1.380607 , 0.933350 }
然后通过适应函数计算出适应值分别如下
取,
g[pop(1)]= { 2.226437 , 2.318543 , 0 , 1.933350 }
(3)确定选择标准
这里用到了适应值的比例来作为选择的标准,得到的每个个体的适应值比例叫作入选概率.其计算公式如下:
对于给定的规模为n的体pop={},个体的适应值为,则其入选概率为
由上述给出的体,我们可以计算出各个个体的入选概率.
首先可得 ,
然后分别用四个个体的适应值去除以,得:
P(a1)=2.226437 / 6.478330 = 0.343675 %% a1
P(a2)=2.318543 / 6.478330 = 0.357892 %% a2
P(a3)= 0 / 6.478330 = 0 %% a3
P(a4)=1.933350 / 6.478330 = 0.298433 %% a4
(4)产生种
计算完了入选概率后,就将入选概率大的个体选入种,淘汰概率小的个体,并用入选概率最大的个体补入种,得到与原体大小同样的种.
由初始体的入选概率我们淘汰掉a3,再加入a2补足成与体同样大小的种得到newpop(1)如下:
newpop(1)={
<1101011101001100011110>, %% a1
<1000011001010001000010>, %% a2
<1000011001010001000010>, %% a2
<0110101001101110010101>} %% a4
(5)交叉
交叉也就是将一组染体上对应基因段的交换得到新的染体,然后得到新的染体组,组成新的体(Matlab程序参见附录9).
我们把之前得到的newpop(1)的四个个体两两组成一对,重复的不配对,进行交叉.(可以在任一位进行交叉)
<110101110 1001100011110>, <110101*********1000010>
交叉得:
<100001100 1010001000010>, <1000011001001100011110>
<10000110010100 01000010>, <1000011001010010010101>
交叉得:
<01101010011011 10010101>, <0110101001101101000010>
通过交叉得到了四个新个体,得到新的体jchpop (1)如下:
jchpop(1)={
<110101*********1000010>,
<1000011001001100011110>,
<1000011001010010010101>,
<0110101001101101000010>}
这里采用的是单点交叉的方法,当然还有多点交叉的方法,这里就不着重介绍了.
(6)变异
变异也就是通过一个小概率改变染体位串上的某个基因.现把刚得到的jchpop(1)中第3个个体中的第9位改变,就产生了变异,得到了新的体pop(2)如下:
pop(2)= {
<110101*********1000010>,
<1000011001001100011110>,
<1000011011010010010101>,
<0110101001101101000010> }
然后重复上述的选择、交叉、变异直到满足终止条件为止.
(7)终止条件
遗传算法的终止条件有两类常见条件:(1)采用设定最大(遗传)代数的方法,一般可设定为50代,此时就可能得出最优解.此种方法简单易行,但可能不是很精确(Matlab程序参见附录1);(2)根据个体的差异来判断,通过计算种中基因多样性测度,即所有基因位相似程度来进行控制.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论