数学建模社区-数学中国
标题:
华为杯研赛数学建模之遗传算法
[打印本页]
作者:
1047521767
时间:
2021-10-13 18:18
标题:
华为杯研赛数学建模之遗传算法
遗传算法简介
: M p1 D- w# E, Z# }4 V4 o9 h+ H% h
维基百科上的概念如下
! w+ L8 m1 T- f% Z. Z4 K1 U
遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最优化的搜索算法,是进化算法的一种。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。
' I( ]" |5 a6 I7 P# u: T
& J& m, j. C: `' v
遗传算法通常实现方式为一种计算机模拟。对于一个最优化问题,一定数量的候选解(称为个体)可抽象表示为染色体,使种群向更好的解进化。传统上,解用二进制表示(即0和1的串),但也可以用其他表示方法。进化从完全随机个体的种群开始,之后一代一代发生。在每一代中评价整个种群的适应度,从当前种群中随机地选择多个个体(基于它们的适应度),通过自然选择和突变产生新的生命种群,该种群在算法的下一次迭代中成为当前种群。
) C; K6 Y+ f1 j( E$ p+ i2 t2 H
; t$ [+ `3 T! g" C5 a' `9 g
这看起来是不是很抽象?没关系,我们举一个例子
+ o8 Z& m. u+ i* F, Z
比如你家住的那一块地方有一群老鼠,有一些跑得快而且也聪明,有一些傻得大白天在你面前跳舞,然后理所当然就被你捕获然后进行土葬。故那群跑得快而且也聪明自然活下来的概率比傻的大的多,我们称老鼠是否活下来为适应度,适应度高的更容易在你手上活下来,而低的更容易被你土葬。活下来的老鼠们,它们中大多都是适应度高的,它们进行交配繁殖,老鼠子类大多都是继承了老鼠父母的特点,当然也存在一定几率变异,变异数除以总体老鼠为变异率,变异率一般都不是很大的常数。但总体来说,由于淘汰机制,故所产生的鼠类比起它们的父类,平均来说更为聪明。通过一代代的优化,使得老鼠越来越聪明,而你越来越抓不到老鼠。这就是遗传算法的核心。
" U8 [0 I8 c: F: B7 l0 l6 q- x* M
( r" x2 X# s, f7 F5 n
遗传算法的步骤
6 Z* H0 A7 Y1 x i6 Z* ~% n( [' c
1.编码
9 U) l/ |# f3 I% P& @: S
编码有多种,如二进制编码,浮点数编码,格雷码等。最常见的是二进制编码和浮点数编码。
" O) A) M1 Z. `% h) L
1 t( ?7 D) ?# t
二进制编码
0 S" h$ P+ X. R+ k% M0 @
二进制编码方法是使用二值符号集{0,1},它所构成的个体基因型是一个二进制编码符号串。二进制编码符号串的长度与问题所要求的求解精度有关。
* o( d$ Z8 S; g
优点:
0 b1 l5 }. P d+ V) N( Y% ?
9 }$ G9 v0 e& x. t( h6 h6 m6 H
简单。无论是编码还是解码操作都非常方便和快捷。
( K/ w! U+ E' _( i
方便交叉和变异。
: h; R8 @- b$ [& U4 o7 B
符合最小字符集编码原则。
9 p5 x! R1 q% Y& q1 U0 z
缺点:
. K$ Z& D# t/ P7 K0 ]- ~3 ]
9 S0 ~8 w. Q7 ^" X0 J) M2 I
不适合连续函数的优化问题,局部搜索能力差。
1 k2 @) T' u- h# S
连续的数值之间有时候存在距离大的问题。例如63和64对应的二进制分别是0111111和1000000。(连续数值对应的二进制数7位全都不同)
& V8 d! x1 x% P9 \
对于高精度的问题,变异后可能会出现远离最优解的情况,表现型不稳定。
" H1 H# i6 e. c ^* `- L3 r6 I0 @6 u. i
案例:
: r5 y- g8 R( d+ z4 R
假设有f(x),x∈[0,1023],采用定长二进制编码,串0010101111就代表了175,编码精度为1.
+ @% c2 d- n$ M2 c# y
# y M) L7 _) e) |# b4 h4 A7 S8 q
浮点数编码
8 J' @( r3 a f5 @ V2 ]
定义:
! Q& e$ ?' s* q* m% L
个体基因值用某范围内的一个实数来表示。编码长度等于决策变量的个数。
R* I9 [8 a; u% y ?
优点:
. l7 ], J8 z' w* O! c6 O7 B/ b
7 u. [4 }1 B3 \ P( ?2 t6 }0 j. F
精度高,适用于连续变量问题。避免了海明悬崖问题。
/ \. i; [' \ Z( Z
适用于表示范围比较大的数值,适合空间较大的一串算搜索
# T( c* U6 a4 ?# W+ U# F( A* Z: h- c& a
降低了计算复杂性,提升效率
9 O# \! A; H% Y/ Y6 Q4 y/ E
便于遗传算法与经典优化方法的混合使用
6 ~, i' z+ G: O& d0 Q7 a" V
便于设计针对问题的专门知识的知识型遗传算子
3 K$ h4 B" p7 r5 y5 \9 B: {$ V
便于处理复杂的决策变量约束条件,适合于组合优化问题
9 k: `: G$ v3 f, W5 N4 [/ [
案例:
5 I3 J# [) a1 K
假设某优化问题有五个变量,每个变量的变化范围都不同。其中X={5.30,5.20,4.70,3.40,4.80}就是一个基因型,对应的表现型是x={5.30,5.20,4.70,3.40,4.80}。
# Q* d# x2 j" d0 e% g
% D; f( w: T: H' w1 I
2.解码
: s* [; R* V2 M6 L
以二进制为例。
# L/ k* G- w3 F4 S0 J8 Z
解码的目的就是将不直观的二进制数据串还原成十进制。
6 X$ ]! n$ }% N
, W( ^ p+ i) D* Z0 G% l
3.交配(交叉)
5 F: O0 h4 n- e2 {
以二进制为例。
) V! G w! o. S! |% k3 k) W
“交配运算”是使用单点或多点进行交叉的算子。首先用随机数产生一个或多个交配点位置,然后两个个体在交配点位置互换部分基因码,形成两个子个体。例如,两条染色体S1=01001011,S2=10010101。交换其后4位基因,得S1’=01000101,S2’=10011011可以被看做原染色体S1和S2的子代染色体。
^( k- q# m9 f0 ?3 i
3 y5 g5 |( H% C1 v, P2 [
4.变异
1 b% V0 b( _4 Q @/ ?
突变
4 U4 w/ \" y) p
突变是指基因突变。例如对于S1=010110011,第三位0突变成1,那么我们得到S1‘=011110011。
9 ?( I" e- j8 P0 m+ v
倒位
7 e- e6 a4 d( E
倒位是指一个染色体某区段正常排列顺序发生180°的颠倒,造成染色体内的DNA序列重新排列。例如对于S1=1010100010110110101001进行倒位时得到S1‘=010101101000110101001。
* l, A& Q' [+ P& R) x3 T
其他
: f9 c; }5 W5 D$ u' [
不一一举例,大家自行查阅理解。
4 x- b/ F; e- X# A" j5 H
/ K) C% ~0 v. S# Z6 V; v3 d
6.适应度评估
w) A5 y4 b( F% { `8 ], G1 w
遗传算法依照与个体适应度成正比的几率决定当前种群中各个个体遗传到下一代群体的机会。个体适应度大的个体更容易被遗传到下一代。通常情况下,求目标函数最大值的问题可以直接把目标函数作为检测个体适应度大小的函数
! ^) C9 |. B1 Q% S
0 ^3 u3 N2 f* B/ f6 e( x
7.选择
) M, I3 [) F' l; \; v
选择运算时根据个体适应度大小决定其下代遗传的可能性。设种群中个体总数为N,个体i的适应度为fi,则个体i被选取的几率为:
+ X% C7 j. A) O
5 _' ~6 o- `- O& J
: I# d9 I7 z# O
遗传算法伪代码
" n, g# H# W* O/ @* t) N0 L( |
BEGIN
3 c/ O, r: o1 H; X3 g) o# O
t = 0; %遗传代数
% f& B( p' N& H. `- r& f3 E
初始化P(t); %初始化种群或者染色体
" M: a0 L% s1 T+ ~
计算P(t)的适应值;
" _- U# o/ ]" e, w) l2 K+ l
while(不满足停止准则) do
9 g, O+ O9 [9 Q/ E
begin
4 X: a* L' C1 a2 S0 Z
t = t+1;
4 R3 c% W# S8 f8 O7 _7 I6 x
从P(t-1)中选择P(t); %选择
2 ]6 }# l& z+ G9 }
重组P(t); %交叉或变异
6 T7 Y: ], S3 E1 U
计算P(t)的适应值;
" ~$ z1 D6 c" Z
end
0 M' a+ C, s2 f* h) N- T8 F
end
# B0 I, [# B7 |) z
END
y- o: s, j. p, ]' Z/ \
遗传算法工具箱
+ P9 O7 r3 F# a/ ]& K* F
如果前面没看懂,没关系!!!为了省略艰深难懂的遗传算法,MATLAB软件做成了专门的遗传算法工具箱GA Toolbox,方便用户调用。(但有时候遗传工具并不是万能的,很多的情况下更需要具体问题具体分析)
+ c1 @* o0 i2 `4 ~9 T( h0 q
我们在MATLAB中帮助文档查看ga函数的定义
# `- \. e$ W9 O- w
Find minimum of function using genetic algorithm
. `1 H4 s: V5 P2 g6 K9 f. b2 d8 }
意思就是通过使用遗传算法找到函数的最小值。
" Y7 i- ~# i4 t `6 r6 K
它的用法,如下:
6 |6 H) f% A s! n
x = ga(fitnessfcn,nvars)
/ M- D) r" ~ Q \" I- e
x = ga(fitnessfcn,nvars,A,b)
+ E3 Y2 d$ T7 S7 v9 U$ Y# @
x = ga(fitnessfcn,nvars,A,b,Aeq,beq)
# o3 h1 j V9 ~: l7 V0 L3 {6 ?3 d
x = ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB)
8 I6 I! ]) P9 Y+ a
x = ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon)
9 j& Y- q7 ^; v' a/ x
x = ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon,options)
" F" ^8 O" t& I Y+ k5 t
x = ga(fitnessfcn,nvars,A,b,[],[],LB,UB,nonlcon,IntCon)
! @, h4 |. d! z: @8 `9 {1 d
x = ga(fitnessfcn,nvars,A,b,[],[],LB,UB,nonlcon,IntCon,options)
% ~$ [' [) }$ w3 ^; i3 q
x = ga(problem)
. w- t2 k7 r! C$ A" Q# ?" z
[x,fval] = ga(fitnessfcn,nvars,…)
: E: b. A: J( [7 n- H% G: Y2 H% q
[x,fval,exitflag] = ga(fitnessfcn,nvars,…)
# K+ W9 O3 m, h* {
[x,fval,exitflag,output] = ga(fitnessfcn,nvars,…)
* j. ?; j; f, H: Q
[x,fval,exitflag,output,population] = ga(fitnessfcn,nvars,…)
2 ]! Y& {) ]& V7 z, b8 P
[x,fval,exitflag,output,population,scores] = ga(fitnessfcn,nvars,…)
8 v. X E* H. i5 ]5 \! m0 \
x为经过遗传进化以后的自变量最佳染色体返回值;fval为最佳染色体的适应度,exitflag为算法停止的原因;output为包含每一代输出的结构以及有关算法性能的其他信息;population返回矩阵,群体其行是最终总体;scores返回最终群体的得分。
4 s; @; Z1 L( m2 x8 m
fitnessfcn为适应度函数,nvars为目标函数自变量的个数,A,b,Aeq,beq为约束条件(与线性规划类似)LB,UB为自变量的上界和下界;函数nonlcon接受x并返回矢量C和Ceq,分别表示非线性不等式和等式;IntCon要求中列出的变量采用整数值;options为默认优化参数由options中的值替换。
# Q, _$ h; ?2 \1 r. U, r
我们用的更多的是这种
" C3 w. q! s8 U; d: X! `
[x,fval] = ga(fitnessfcn,nvars,options)
" o1 S3 D9 a7 q8 O
令options=gaoptimset()函数,gaoptimset函数用法如下:
7 o4 @1 W* c7 b" k- d
) C# l- a. }, k4 R3 I0 x7 I* C
属性如下:
+ B0 C) Z, Y# r' Q, \
^8 M8 S _" ?5 S/ u, D/ s. C; x) N
# w" A3 X; v+ A* ^
! A3 m5 {+ _* V* H0 t
& p' u/ m0 Z, o( _# [% R6 W- O, b
) D4 J& `3 a6 e. |0 A
; r+ ^1 M; R; z8 h x9 ^! o
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5