遗传算法(matlab)
主要流程
编码
初始化种群
计算适应度值
选择
交叉变异
子代种群循环迭代
解码
输出
编码
二进制编码
编码
假设需要的精度为1,那么我们需要在
(
a
,
b
)
(a,b)
(a,b)之间选择需要的个体,即
2
n
−
1
⩽
b
−
a
⩽
2
n
2^{n-1}\leqslant b-a\leqslant2^n
2n−1⩽b−a⩽2n,则
n
=
l
o
g
2
(
b
−
a
)
+
1
n=log_2(b-a)+1
n=log2(b−a)+1
假设需要的精度为
e
p
s
eps
eps,那么需要的个体在
(
a
,
b
)
(a,b)
(a,b)之间的数据为
b
−
a
e
p
s
\frac{b-a}{eps}
epsb−a,即
2
n
−
1
⩽
b
−
a
e
p
s
⩽
2
n
2^{n-1}\leqslant\frac{b-a}{eps}\leqslant2^n
2n−1⩽epsb−a⩽2n,则
n
=
l
o
g
2
b
−
a
e
p
s
+
1
n=log_2{\frac{b-a}{eps}}+1
n=log2epsb−a+1
其中,自变量范围为
(
a
,
b
)
,
e
p
s
(a,b),eps
(a,b),eps为精度。
解码
x
0
=
x
×
e
p
s
,
r
e
a
l
=
a
+
x
0
=
a
+
(
b
−
a
)
x
2
n
−
1
x_0=x\times eps,real = a+x_0= a+\frac{(b-a)x}{2^{n-1}}
x0=x×eps,real=a+x0=a+2n−1(b−a)x
其中,
x
0
x_0
x0为
b
−
a
b-a
b−a中的某值。
浮点数编码
符号编码
适应度函数
适应度函数也称评价函数,是根据目标函数确定的用于区分群体中个体好坏的标准。
评价个体适应度的一般过程为:
1、对个体编码串进行解码处理后,可得到个体的表现型。
2、由个体的表现型可计算出对应个体的目标函数值。
3、根据最优化问题的类型,由目标函数值按一定的转换规则求出个体的适应度。
适应度函数的设计主要应满足以下要求:
1、单值、连续、非负、最大化。
2、合理、一致性。较难。
3、计算量小。
4、通用性强。
一般的,由目标函数 f ( x ) f(x) f(x)到适应度函数 f i t ( x ) fit(x) fit(x)的转换方法有:
例一
最大化问题:
f
i
t
(
x
)
=
{
f
(
x
)
,
f
(
x
)
>
0
0
,
o
t
h
e
r
fit(x)=\begin{cases} f(x) ,\quad f(x)>0 \\ 0 \,\,\quad, \quad other \end{cases}
fit(x)={f(x),f(x)>00,other
最小化问题:
f
i
t
(
x
)
=
{
−
f
(
x
)
,
f
(
x
)
<
0
0
,
o
t
h
e
r
fit(x)=\begin{cases} -f(x) ,\quad f(x)<0 \\ 0 \;\;\;\;\,\quad, \quad other \end{cases}
fit(x)={−f(x),f(x)<00,other
例二
最大化问题:
f
i
t
(
x
)
=
{
f
(
x
)
−
f
m
i
n
,
f
(
x
)
−
f
m
i
n
>
0
0
,
o
t
h
e
r
fit(x)=\begin{cases} f(x)-f_{min} \,\,,\quad f(x)-f_{min}>0 \\ 0 \quad\quad \quad \quad \quad, \quad other \end{cases}
fit(x)={f(x)−fmin,f(x)−fmin>00,other
最小化问题:
f
i
t
(
x
)
=
{
f
m
a
x
−
f
(
x
)
,
f
m
a
x
−
f
(
x
)
>
0
0
,
o
t
h
e
r
fit(x)=\begin{cases} f_{max}-f(x) \,\,,\quad f_{max}-f(x)>0 \\ 0 \quad\quad\quad\quad\quad, \quad other \end{cases}
fit(x)={fmax−f(x),fmax−f(x)>00,other
其中,
f
m
a
x
和
f
m
i
n
f_{max}和f_{min}
fmax和fmin是给定的一个值(目标函数估计值),目标函数可以大于或小于某值为好。
例三
最大化问题:
f
i
t
(
x
)
=
1
1
+
f
+
f
(
x
)
fit(x) = \frac{1}{1+f+f(x)}
fit(x)=1+f+f(x)1
最小化问题:
f
i
t
(
x
)
=
1
1
+
f
−
f
(
x
)
fit(x) = \frac{1}{1+f-f(x)}
fit(x)=1+f−f(x)1
其中,
f
f
f是给定的一个值(目标函数界限估计值)。
以上三种都是适应度越大越好。
适应度函数尺度变换
适应度函数总是非负的,而目标函数可能有正有负,故需要在目标函数与适应度函数之间进行变换。常用的尺度变换方法如下:(以后补充)
1、线性尺度变换
2、乘幂尺度变换
3、指数尺度变换
链接: 适应度函数构造.
选择算子
1.轮盘赌选择(Roulette Wheel Selection):是一种回放式随机采样方法。每个个体进入下一代的概率等于它的适应度值与整个种群中个体适应度值和的比例。选择误差较大。
2.随机竞争选择(Stochastic Tournament):每次按轮盘赌选择一对个体,然后让这两个个体进行竞争,适应度高的被选中,如此反复,直到选满为止。
3.最佳保留选择:首先按轮盘赌选择方法执行遗传算法的选择操作,然后将当前群体中适应度最高的个体结构完整地复制到下一代群体中。
4.无回放随机选择(也叫期望值选择Excepted Value Selection):根据每个个体在下一代群体中的生存期望来进行随机选择运算。方法如下:
(1) 计算群体中每个个体在下一代群体中的生存期望数目N。
(2) 若某一个体被选中参与交叉运算,则它在下一代中的生存期望数目减去0.5,若某一个体未 被选中参与交叉运算,则它在下一代中的生存期望数目减去1.0。
(3) 随着选择过程的进行,若某一个体的生存期望数目小于0时,则该个体就不再有机会被选中。
5.确定式选择:按照一种确定的方式来进行选择操作。具体操作过程如下:
(1) 计算群体中各个个体在下一代群体中的期望生存数目N。
(2) 用N的整数部分确定各个对应个体在下一代群体中的生存数目。
(3) 用N的小数部分对个体进行降序排列,顺序取前M个个体加入到下一代群体中。至此可完全确定出下一代群体中M个个体。
6.无回放余数随机选择:可确保适应度比平均适应度大的一些个体能够被遗传到下一代群体中,因而选择误差比较小。
7.均匀排序:对群体中的所有个体按期适应度大小进行排序,基于这个排序来分配各个个体被选中的概率。
8.最佳保存策略:当前群体中适应度最高的个体不参与交叉运算和变异运算,而是用它来代替掉本代群体中经过交叉、变异等操作后所产生的适应度最低的个体。
9.随机联赛选择:每次选取几个个体中适应度最高的一个个体遗传到下一代群体中。
10.排挤选择:新生成的子代将代替或排挤相似的旧父代个体,提高群体的多样性。
轮盘赌选择
又称比例选择方法.其基本思想是:各个个体被选中的概率与其适应度大小成正比.
基本流程:
1.计算每个个体的适应度
f
i
t
v
a
l
u
e
(
i
)
fitvalue(i)
fitvalue(i)
2.计算适应度比例,即每个个体的选择概率
p
=
f
i
t
v
a
l
u
e
(
i
)
∑
f
i
t
v
a
l
u
e
p = \frac{fitvalue(i)}{\sum fitvalue}
p=∑fitvaluefitvalue(i)
3.计算每个个体的累积概率
p
p
(
i
)
=
∑
p
(
i
)
pp(i) = \sum p(i)
pp(i)=∑p(i)
4.在
[
0
,
1
]
[0,1]
[0,1]区间内产生一个均匀分布的伪随机数
r
r
r
5.选择第一个大于
r
r
r的个体
6.重复4、5共
M
M
M次(
M
M
M为种群数)
交叉算子
适用于二进制编码个体或浮点数编码个体的交叉算子:
1.单点交叉(One-point Crossover):指在个体编码串中只随机设置一个交叉点,然后再该点相互交换两个配对个体的部分染色体。
2.两点交叉与多点交叉:
(1) 两点交叉(Two-point Crossover):在个体编码串中随机设置了两个交叉点,然后再进行部分基因交换。
(2) 多点交叉(Multi-point Crossover)
3.均匀交叉(也称一致交叉,Uniform Crossover):两个配对个体的每个基因座上的基因都以相同的交叉概率进行交换,从而形成两个新个体。
4.算术交叉(Arithmetic Crossover):由两个个体的线性组合而产生出两个新的个体。该操作对象一般是由浮点数编码表示的个体。
单点交叉
例
10000 01010(父)
\qquad\qquad\qquad
\qquad\qquad\qquad
10000 00110
10010 00110(母)
\qquad\qquad\qquad
\qquad\qquad\qquad
10010 01010
交换后五位即可
两点交叉
例
100 00 01010(父)
\qquad\qquad\qquad
\qquad\qquad\qquad
100 10 01010
100 10 00110(母)
\qquad\qquad\qquad
\qquad\qquad\qquad
100 00 00110
交换两个交叉点之间数据即可
变异算子
以下变异算子适用于二进制编码和浮点数编码的个体:
1.基本位变异(Simple Mutation):对个体编码串中以变异概率、随机指定的某一位或某几位仅因座上的值做变异运算。
2,均匀变异(Uniform Mutation):分别用符合某一范围内均匀分布的随机数,以某一较小的概率来替换个体编码串中各个基因座上的原有基因值。(特别适用于在算法的初级运行阶段)
3.边界变异(Boundary Mutation):随机的取基因座上的两个对应边界基因值之一去替代原有基因值。特别适用于最优点位于或接近于可行解的边界时的一类问题。
4.非均匀变异:对原有的基因值做一随机扰动,以扰动后的结果作为变异后的新基因值。对每个基因座都以相同的概率进行变异运算之后,相当于整个解向量在解空间中作了一次轻微的变动。
5.高斯近似变异:进行变异操作时用符号均值为P的平均值,方差为P**2的正态分布的一个随机数来替换原有的基因值。
matlab代码实现
由于随机数原因,可能需要多次运行,得到最佳结果。
小结
学习笔记,欢迎指正!
参考文章