1 遗传算法基本介绍:https://blog.csdn.net/See_Star/article/details/102589266
一. 遗传编码
常用的遗传编码算法有霍兰德二进制码、格雷码(Gray Code)、实数编码和字符编码等。
1 二进制编码(Binary encoding)
二进制编码是将原问题的结构变换为染色体的位串结构。在二进制编码中,首先要确定二进制字符串的长度l,该长度与变量的定义域和所求问题的计算精度有关。
- 例. 假设变量x的定义域为
[
5
,
10
]
[5,10]
[5,10],要求的计算精度为
1
0
−
5
10^{-5}
10−5,则需要将
[
5
,
10
]
[5,10]
[5,10]至少分为
6
×
1
0
5
6×10^5
6×105个等长小区间,每个小区间用一个二进制串表示。于是,串长至少等于20。原因是:
524288
=
219
<
600000
<
220
=
1048576
524288=219<600000<220=1048576
524288=219<600000<220=1048576
这样,对应于区间 [ 5 , 10 ] [5,10] [5,10]内满足精度要求的每个值x,都可用一个20位编码的二进制串 < b 19 , b 18 , … , b 0 > <b19,b18,…,b0> <b19,b18,…,b0>来表示。
二进制编码存在的主要缺点是汉明(Hamming)悬崖。 例如,7和8的二进制数分别为0111和1000,当算法从7改进到8时,就必须改变所有的位。
2 格雷编码(Gray encoding)
格雷编码是对二进制编码进行变换后所得到的一种编码方法。这种编码方法要求两个连续整数的编码之间只能有一个码位不同,其余码位都是完全相同的。它有效地解决了汉明悬崖问题,其基本原理如下:
设有二进制串
b
1
,
b
2
,
…
,
b
n
b_1,b_2,…,b_n
b1,b2,…,bn,对应的格雷串为
a
1
,
a
2
,
…
,
a
n
a_1,a_2,…,a_n
a1,a2,…,an,则从二进制编码到格雷编码的变换为:
a
i
=
{
b
i
i
=
1
b
i
−
1
⊕
b
i
i
>
1
a_i= \begin{cases} b_i &i=1 \\ b_{i-1}{\oplus}b_i &i>1 \end{cases}
ai={bibi−1⊕bii=1i>1
其中,⊕表示模2加法(等同于异或运算)。而从一个格雷串到二进制串的变换为:
b
i
=
∑
j
=
1
i
a
i
(
m
o
d
2
)
b_i=\sum_{j=1}^ia_i(mod2)
bi=j=1∑iai(mod2)
- 例 十进制数7和8的二进制编码分别为0111和1000,而其格雷编码分别为0100和1100。
3 实数编码(Real encoding)
实数编码是将每个个体的染色体都用某一范围的一个实数(浮点数)来表示,其编码长度等于该问题变量的个数。这种编码方法是将问题的解空间映射到实数空间上,然后在实数空间上进行遗传操作。由于实数编码使用的是变量的真实值,因此这种编码方法也叫做真值编码方法。实数编码适应于那种多维、高精度要求的连续函数优化问题。
二. 适应度函数
适应度函数是一个用于对个体的适应性进行度量的函数。通常,一个个体的适应度值越大,它被遗传到下一代种群中的概率也就越大。
1 常用的适应度函数
在遗传算法中,有许多计算适应度的方法,其中最常用的适应度函数有以下两种:
-
① 原始适应度函数
它是直接将待求解问题的目标函数f(x)定义为遗传算法的适应度函数。例如,在求解极值问题时,f(x)即为x的原始适应度函数。
采用原始适应度函数的优点是能够直接反映出待求解问题的最初求解目标,其缺点是有可能出现适应度值为负的情况。 -
② 标准适应度函数
在遗传算法中,一般要求适应度函数非负,并其适应度值越大越好。这就往往需要对原始适应函数进行某种变换,将其转换为标准的度量方式,以满足进化操作的要求,这样所得到的适应度函数被称为标准适应度函数 f N o r m a l ( x ) f_{Normal(x)} fNormal(x)。例如下面的极小化和极大化问题:- 极小化问题
对极小化问题,其标准适应度函数可定义为:
f n o m a l ( x ) = { f m a x ( x ) − f ( x ) 当 f ( x ) < f m a x ( x ) 0 否 则 f_{nomal}(x)= \begin{cases} f_{max}(x)-f(x) &当f(x)<f_{max}(x)\\ 0 &否则 \end{cases} fnomal(x)={fmax(x)−f(x)0当f(x)<fmax(x)否则其中, f m a x ( x ) f_{max} (x) fmax(x)是原始适应函数f(x)的一个上界。如果 f m a x ( x ) f_{max} (x) fmax(x) 未知,则可用当前代或到目前为止各演化代中的 f ( x ) f(x) f(x)的最大值来代替。可见, f m a x ( x ) f_{max} (x) fmax(x)是会随着进化代数的增加而不断变化的。 - 极大化问题
对极大化问题,其标准适应度函数可定义为:
f n o m a l ( x ) = { f ( x ) − f m i n ( x ) 当 f ( x ) > f m i n ( x ) 0 否 则 f_{nomal}(x)= \begin{cases} f(x)-f_{min}(x) &当f(x)>f_{min}(x)\\ 0 &否则 \end{cases} fnomal(x)={f(x)−fmin(x)0当f(x)>fmin(x)否则其中, f m i n ( x ) f_{min}(x) fmin(x)是原始适应函数 f ( x ) f(x) f(x)的一个下界。如果 f m i n ( x ) f_{min}(x) fmin(x)未知,则可用当前代或到目前为止各演化代中的 f ( x ) f(x) f(x)的最小值来代替。
- 极小化问题
2 适应度函数的加速变换
在某些情况下,需要对适应度函数进行加速速度。适应度函数的加速变换有两种基本方法(暂时没搞懂)。
三. 基本遗传操作
1 选择操作
选择(Selection)操作是指根据选择概率按某种策略从当前种群中挑选出一定数目的个体,使它们能够有更多的机会被遗传到下一代中。常用的选择策略可分为比例选择、排序选择和竞技选择三种类型。
比例选择方法(Proportional Model)的基本思想是:各个个体被选中的概率与其适应度大小成正比。常用的比例选择策略包括:轮盘赌选择、繁殖池选择。
其中最常用的为轮盘赌选择法,其又被称为转盘赌选择法或轮盘选择法。在这种方法中,个体被选中的概率取决于该个体的相对适应度。而相对适应度的定义为:
P
(
x
i
)
=
f
(
x
i
)
∑
j
=
1
N
f
(
x
j
)
P(x_i)=\frac {f(x_i)} { \sum_{j=1}^N f(x_j)}
P(xi)=∑j=1Nf(xj)f(xi)其中,
P
(
x
i
)
P(x_i)
P(xi)是个体
x
i
x_i
xi的相对适应度,即个体
x
i
x_i
xi被选中的概率;
f
(
x
i
)
f(x_i)
f(xi)是个体xi的原始适应度。轮盘赌选择算法的基本思想是:根据每个个体的选择概率
P
(
x
i
)
P(x_i)
P(xi)将一个圆盘分成
N
N
N个扇区,其中第
i
i
i个扇区的中心角为:
2
π
f
(
x
i
)
∑
j
=
1
N
f
i
(
x
j
)
=
2
π
p
(
x
i
)
2\pi \frac {f(x_i)} { \sum_{j=1}^N f_i(x_j)}=2\pi p(x_i)
2π∑j=1Nfi(xj)f(xi)=2πp(xi)再设立一个移动指针,将圆盘的转动等价为指针的移动。选择时,假想转动圆盘,若静止时指针指向第
i
i
i个扇区,则选择个体
i
i
i。其物理意义如图所示:
从统计角度看,个体的适应度值越大,其对应的扇区的面积越大,被选中的可能性也越大。这种方法有点类似于发放奖品使用的轮盘,并带有某种赌博的意思,因此亦被称为轮盘赌选择。
2 交叉操作
交叉(Crossover)操作是指按照某种方式对选择的父代个体的染色体的部分基因进行交配重组,从而形成新的个体。交配重组是自然界中生物遗传进化的一个主要环节,也是遗传算法中产生新的个体的最主要方法。根据个体编码方法的不同,遗传算法中的交叉操作可分为二进制交叉和实值交叉两种类型。
① 二进制交叉
二进制交叉(Binary Valued Crossover)是指二进制编码情况下所采用的交叉操作,它主要包括单点交叉、两点交叉、多点交叉和均匀交叉等方法。
-
单点交叉
单点交叉也称简单交叉,它是先在两个父代个体的编码串中随机设定一个交叉点,然后对这两个父代个体交叉点前面或后面部分的基因进行交换,并生成子代中的两个新的个体。假设两个父代的个体串分别是:
X = x 1 x 2 … x k x k + 1 … x n X=x_1 x_2 … x_k x_{k+1}… x_n X=x1x2…xkxk+1…xn
Y = y 1 y 2 … y k y k + 1 … y n Y=y_1 y_2 … y_k y_{k+1}…y_n Y=y1y2…ykyk+1…yn随机选择第k位为交叉点,若采用对交叉点后面的基因进行交换的方法,但点交叉是将X中的xk+1到xn部分与Y中的yk+1到yn部分进行交叉,交叉后生成的两个新的个体是:
X ’ = x 1 x 2 … x k y k + 1 … y n X’= x_1 x_2 … x_k y_{k+1} … y_n X’=x1x2…xkyk+1…yn
Y ’ = y 1 y 2 … y k x k + 1 … x n Y’= y_1 y_2 … y_k x_{k+1} … x_n Y’=y1y2…ykxk+1…xn
其中, x k + 1 x_{k+1} xk+1与 y k + 1 y_{k+1} yk+1位置交叉。例 设有两个父代的个体串A= 0 0 1 1 0 1 和B= 1 1 0 0 1 0 ,若随机交叉点为3和5,则交叉后的两个新的个体是:
A’= 0 0 1 0 1 1
B’= 1 1 0 1 0 0 -
多点交叉
多点交是指先随机生成多个交叉点,然后再按这些交叉点分段地进行部分基因交换,生成子代中的两个新的个体。假设交叉点个数为m,则可将个体串划分为m+1个分段,其划分方法是:当m为偶数时,对全部交叉点依次进行两两配对,构成m/2个交叉段。
当m为奇数时,对前(m-1)个交叉点依次进行两两配对,构成(m-1)/2个交叉段,而第m个交叉点则按单点交叉方法构成一个交叉段。下面以m=3为例进行讨论。假设两个父代的个体串分别是
X = x 1 x 2 … x i … x j … x k … x n X=x_1 x_2 … x_i … x_j … x_k … x_n X=x1x2…xi…xj…xk…xn]
Y = y 1 y 2 … y i … y j … y k … y n Y=y_1 y_2 … y_i … y_j … y_k … y_n Y=y1y2…yi…yj…yk…yn随机设定第i、j、k位为三个交叉点(其中i<j<k<n),则将构成两个交叉段。交叉后生成的两个新的个体是:
X ’ = x 1 x 2 … x i y i + 1 … y j x j + 1 … x k y k + 1 … y n X’= x_1 x_2 … x_i y_{i+1} … y_j x_{j+1} … x_k y_{k+1} … y_n X’=x1x2…xiyi+1…yjxj+1…xkyk+1…yn
Y ’ = y 1 y 2 … y i x i + 1 … x j y j + 1 … y k x k + 1 … x n Y’= y_1 y_2 … y_i x_{i+1} … x_j y_j{+1} … y_k x_{k+1} … x_n Y’=y1y2…yixi+1…xjyj+1…ykxk+1…xn例 设有两个父代的个体串A= 0 0 1 1 0 1 和B= 1 1 0 0 1 0 ,若随机交叉点为1、3和5,则交叉后的两个新的个体是:
A’= 0 1 0 1 0 0
B’= 1 0 1 0 1 1 -
均匀交叉
均匀交叉(Uniform Crossover)是先随机生成一个与父串具有相同长度,并被称为交叉模版(或交叉掩码)的二进制串,然后再利用该模版对两个父串进行交叉,即将模版中1对应的位进行交换,而0对应的位不交换,依此生成子代中的两个新的个体。事实上,这种方法对父串中的每一位都是以相同的概率随机进行交叉的。例 设有两个父代的个体串A=001101和B=110010,若随机生成的模版T=010011,则交叉后的两个新的个体是A’=011010和B’=100101。即
A : 0 0 1 1 0 1
B : 1 1 0 0 1 0
T : 0 1 0 0 1 1
A’:0 1 1 1 1 0
B’:1 0 0 0 0 1
② 实值交叉
实值交叉是在实数编码情况下所采用的交叉操作,主要包括离散交叉和算术交叉,下面主要讨论离散交叉(部分离散交叉和整体离散交叉) 。
部分离散交叉是先在两个父代个体的编码向量中随机选择一部分分量,然后对这部分分量进行交换,生成子代中的两个新的个体。
整体交叉则是对两个父代个体的编码向量中的所有分量,都以1/2的概率进行交换,从而生成子代中的两个新的个体。
以部分离散交叉为例,假设两个父代个体的n维实向量分别是:
X
=
x
1
x
2
…
x
i
…
x
k
…
x
n
X=x_1x_2… x_i…x_k…x_n
X=x1x2…xi…xk…xn
Y
=
y
1
y
2
…
y
i
…
y
k
…
y
n
Y=y_1y_2…y_i…y_k…y_n
Y=y1y2…yi…yk…yn
若随机选择对第k个分量以后的所有分量进行交换,则生成的两个新的个体向量是:
X
’
=
x
1
x
2
…
x
k
y
k
+
1
…
y
n
X’= x_1 x_2 … x_k y_{k+1} … y_n
X’=x1x2…xkyk+1…yn
Y
’
=
y
1
y
2
…
y
k
x
k
+
1
…
x
n
Y’= y_1 y_2 … y_k x_{k+1} … x_n
Y’=y1y2…ykxk+1…xn
例 设有两个父代个体向量A=20 16 19 32 18 26和B=36 25 38 12 21 30,若随机选择对第3个分量以后的所有分量进行交叉,则交叉后两个新的个体向量是:
A’= 20 16 19 12 21 30
B’= 36 25 38 32 18 26
3 变异操作
变异(Mutation)是指对选中个体的染色体中的某些基因进行变动,以形成新的个体。变异也是生物遗传和自然进化中的一种基本现象,它可增强种群的多样性。遗传算法中的变异操作增加了算法的局部随机搜索能力,从而可以维持种群的多样性。根据个体编码方式的不同,变异操作可分为二进制变异和实值变异两种类型。
① 二进制变异
当个体的染色体采用二进制编码表示时,其变异操作应采用二进制变异方法。该变异方法是先随机地产生一个变异位,然后将该变异位置上的基因值由“0”变为“1”,或由“1”变为“0”,产生一个新的个体。
例 设变异前的个体为A=0 0 1 1 0 1,若随机产生的变异位置是2,则该个体的第2位由“0”变为“1”。
变异后的新的个体是A’= 0 1 1 1 0 1 。
② 实值变异
当个体的染色体采用实数编码表示时,其变异操作应采用实值变异方法。该方法是用另外一个在规定范围内的随机实数去替换原变异位置上的基因值,产生一个新的个体。最常用的实值变异操作有:
-
基于位置的变异方法
该方法是先随机地产生两个变异位置,然后将第二个变异位置上的基因移动到第一个变异位置的前面。例 设选中的个体向量C=20 16 19 12 21 30,若随机产生的两个变异位置分别时2和4,则变异后的新的个体向量是:
C’= 20 12 16 19 21 30 -
基于次序的变异
该方法是先随机地产生两个变异位置,然后交换这两个变异位置上的基因。例 设选中的个体向量D=20 12 16 19 21 30,若随机产生的两个变异位置分别时2和4,则变异后的新的个体向量是:
D’= 20 19 16 12 21 30
四 应用简例
用遗传算法求函数 f ( x ) = x 2 f(x)=x^2 f(x)=x2的最大值,其中 x x x为 [ 0 , 31 ] [0,31] [0,31]间的整数。
解:这个问题本身比较简单,其最大值很显然是在x=31处。但作为一个例子,它有着较好的示范性和可理解性。
按照遗传算法,其求解过程如下:
(1) 编码
由于x的定义域是区间[0,31]上的整数,由5位二进制数即可全部表示。因此,可采用二进制编码方法,其编码串的长度为5。
例如,用二进制串00000来表示x=0, 11111来表示x=31等。其中的0和1为基因值。
(2) 生成初始种群
若假设给定的种群规模N=4,则可用4个随机生成的长度为5的二进制串作为初始种群。再假设随机生成的初始种群(即第0代种群)为:
S
01
=
01101
S_{01}=0 1 1 0 1
S01=01101
S
02
=
11001
S_{02}=1 1 0 0 1
S02=11001
S
03
=
01000
S_{03}=0 1 0 0 0
S03=01000
S
04
=
10010
S_{04}=1 0 0 1 0
S04=10010
(3) 计算适应度
要计算个体的适应度,首先应该定义适应度函数。由于本例是求f(x)的最大值,因此可直接用
f
(
x
)
f(x)
f(x)来作为适应度函数。即:
f
(
s
)
=
f
(
x
)
f(s)=f(x)
f(s)=f(x)
其中的二进制串s对应着变量x的值。根据此函数,初始种群中各个个体的适应值及其所占比例如表所示。
计算累计百分比可以方便下面使用轮盘赌方式进行个体的选择。
可以看出,在4个个体中S02的适应值最大,是当前最佳个体。
(4) 选择
假设采用轮盘赌方式选择个体,且依次生成的4个随机数(相当于轮盘上指针所指的数)为0.85、0.32、0.12和0.46,经选择后得到的新的种群为:
S’01=10010
S’02=11001
S’03=01101
S’04=11001
其中,染色体11001在种群中出现了2次,而原染色体01000则因适应值太小而被淘汰 。
(5) 交叉
假设交叉概率Pi为50%,则种群中只有1/2的染色体参与交叉。若规定种群中的染色体按顺序两两配对交叉,且有
S
’
01
S’_{01}
S’01与
S
’
02
S’_{02}
S’02交叉,
S
’
03
S’_{03}
S’03与
S
’
04
S’_{04}
S’04不交叉,则交叉情况如表所示。
可见,经交叉后得到的新的种群为:
S
’
’
01
=
10001
S’’_{01}=10001
S’’01=10001
S
’
’
02
=
11010
S’’_{02}=11010
S’’02=11010
S
’
’
03
=
01101
S’’_{03}=01101
S’’03=01101
S
’
’
04
=
11001
S’’_{04}=11001
S’’04=11001
(6) 变异
变异概率Pm一般都很小,假设本次循环中没有发生变异,则变异前的种群即为进化后所得到的第1代种群。即:
S
11
=
10001
S_{11}=10001
S11=10001
S
12
=
11010
S_{12}=11010
S12=11010
S
13
=
01101
S_{13}=01101
S13=01101
S
14
=
11001
S_{14}=11001
S14=11001
(7) 重复操作
对第1代种群,同样重复上述(4)-(6)的操作。其选择情况如表所示。
其中若假设按轮盘赌选择时依次生成的4个随机数为0.14、0.51、0.24 和 0.82,经选择后得到的新的种群为:
S
’
11
=
10001
S’_{11}=10001
S’11=10001
S
’
12
=
11010
S’_{12}=11010
S’12=11010
S
’
13
=
11010
S’_{13}=11010
S’13=11010
S
’
14
=
11001
S’_{14}=11001
S’14=11001
可见,染色体11010被选择了2次,而原染色体01101则因适应值太小而被淘汰。
对第1代种群,其交叉情况如表所示。
可见,经杂交后得到的新的种群为:
S
’
’
11
=
10010
S’’_{11}=10010
S’’11=10010
S
’
’
12
=
11001
S’’_{12}=11001
S’’12=11001
S
’
’
13
=
11001
S’’_{13}=11001
S’’13=11001
S
’
’
14
=
11010
S’’_{14}=11010
S’’14=11010
可以看出,第3位基因均为0,已经不可能通过交配达到最优解。这种过早陷入局部最优解的现象称为早熟。为解决这一问题,需要采用变异操作。
对第1代种群,其变异情况如表所示。
它是通过对S’’14的第3位的变异来实现的。变异后所得到的第2代种群为:
S
21
=
10010
S_{21}=10010
S21=10010
S
22
=
11001
S_{22}=11001
S22=11001
S
23
=
11001
S_{23}=11001
S23=11001
S
24
=
11110
S_{24}=11110
S24=11110
接着,再对第2代种群同样重复上述(4)-(6)的操作:
其中若假设按轮盘赌选择时依次生成的4个随机数为0.42、0.15、0.59和0.91,经选择后得到的新的种群为:
S
’
21
=
11001
S’_{21}=11001
S’21=11001
S
’
22
=
10010
S’_{22}=10010
S’22=10010
S
’
23
=
11001
S’_{23}=11001
S’23=11001
S
’
24
=
11110
S’_{24}=11110
S’24=11110
对第2代种群,其交叉情况如表所示。
这时,函数的最大值已经出现,其对应的染色体为11111,经解码后可知问题的最优解是在点x=31处。求解过程结束。