数学建模社区-数学中国

标题: 数学建模十类经典算法(2) [打印本页]

作者: 百年孤独    时间: 2016-3-29 16:57
标题: 数学建模十类经典算法(2)
2、最优化理论的三大非经典算法$ ]. T6 Y' w( Z% v7 t0 p
这十几年来最优化理论有了飞速发展,模拟退火法、神经网络、遗传算法这三类算法发展很快。近几年的赛题越来越复杂,很多问题没有什么很好的模型可以借鉴,于是这三类算法很多时候可以派上用场,比如:97 年A 题的模拟退火算法,00 年B 题的神经网络分类算法,象01 年B 题这种难题也可以使用神经网络,还有美国竞赛89 年A 题也和BP 算法有关系,当时是86 年刚提出BP 算法,89 年就考了,说明赛题可能是当今前沿科技的抽象体现。目前算法最佳的是遗传算法。
( c  S. \/ t% b7 q9 k
/ U; b5 I2 @  J% N, [遗传算法简介:
' z( C* P9 ]$ R* ^) r% S遗传算法是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法,由美国J.Holland教授提出,其主要特点是群体搜索策略和群体中个体之间的信息交换,搜索不依赖于梯度信息。它尤其适用于传统搜索方法难于解决的复杂和非线性问题,可广泛用于组合优化、机器学习、自适应控制、规划设计和人工生命等领域,是21世纪有关智能计算中的关键技术之一。( s/ F: p9 k6 a5 g
在人工智能领域中,有不少问题需要在复杂和庞大的搜索空间中寻找最优解或准最优解。象货郎担问题和规划问题等组合优化问题就是典型的例子。在求解此类问题时,若不能利用问题固有知识来缩小搜索空间则会产生搜索的组合爆炸。- ^. J" n+ p' H
; @) Q' p' R( J
因此,研究能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制搜索过程,从而得到最优解地通用搜索方法一直是令人瞩目地课题。遗传算法就是这种特别有效地算法。生物的进化是一个奇妙的优化过程,它通过选择淘汰,突然变异,基因遗传等规律产生适应环境变化的优良物种。遗传算法是根据生物进化思想而启发得出的一种全局优化算法。尽管遗传算法本身在理论和应用方法上仍有许多待进一步研究地问题,但它已在很多领域地应用中展现了其特色和魅力。' G  U6 |, x' J- w- T
遗传算法的基本概念
/ `2 z7 Z' {- H$ f遗传算法的基本思想是基于Darwin进化论和Mendel的遗传学说的。
4 n& c, X, {7 F* @: UDarwin进化论最重要的是适者生存原理。它认为每一物种在发展中越来越适应环境。物种每个个体的基本特征由后代所继承,但后代又会产生一些异于父代的新变化。在环境变化时,只有那些能适应环境的个体特征方能保留下来。 # z5 i. \- s/ G  X
Mendel遗传学说最重要的是基因遗传原理。它认为遗传以密码方式存在细胞中,并以基因形式包含在染色体内。每个基因有特殊的位置并控制某种特殊性质;所以,每个基因产生的个体对环境具有某种适应性。基因突变和基因杂交可产生更适应于环境的后代。经过存优去劣的自然淘汰,适应性高的基因结构得以保存下来。 9 w% S2 M. n7 M4 W7 ]8 f8 d1 W
由于遗传算法是由进化论和遗传学机理而产生的直接搜索优化方法;故而在这个算法中要用到各种进化和遗传学的概念。这些概念如下:
; d' B; P7 t- f! [0 v7 B) c一、串(String) : ~- a3 v3 |% @6 a# m- ?6 R
它是个体(Individual)的形式,在算法中为二进制串,并且对应于遗传学中的染色体(Chromosome)。
/ o) }, C5 e& |% r  L2 s3 |( N二、群体(Population) . K+ E2 L, W* K/ i
个体的**称为群体,串是群体的元素 5 t+ O9 I- h2 Y: _* S) c% u' |
三、群体大小(Population Size) & l  D0 d1 p( p
在群体中个体的数量称为群体的大小。 + i+ ^, N' |/ d% F$ b+ n
四、基因(Gene)
0 [- T: {( ~" T% E/ l7 d基因是串中的元素,基因用于表示个体的特征。例如有一个串S=1011,则其中的1,0,1,1这4个元素分别称为基因。它们的值称为等位基因(Alletes)。 , T, u  A! U  J& \; \1 J2 R
五 、基因位置(Gene Position) ' ]) |4 T3 ~! Y' j5 e0 r; ^2 u+ ^  N
一个基因在串中的位置称为基因位置,有时也简称基因位。基因位置由串的左向右计算,例如在串S=1101中,0的基因位置是3。基因位置对应于遗传学中的地点(Locus)。
, M: E' |2 |& V' p3 V) o* Z& g% x7 S. T, Y# R
六、基因特征值(Gene Feature) 1 N) ^# p4 B2 W% {% E9 s: Y
在用串表示整数时,基因的特征值与二进制数的权一致;例如在串S=1011中,基因位置3中的1,它的基因特征值为2;基因位置1中的1,它的基因特征值为8。 : i* Q! j! g, E- c% |1 Y" V
七、串结构空间SS
  H+ ~' |) f1 i) Q- ~在串中,基因任意组合所构成的串的**。基因操作是在结构空间中进行的。串结构空间对应于遗传学中的基因型(Genotype)的**。 : [; u8 Z# T; _: @
八、参数空间SP / h  K' j) n; U1 f! W0 k% U' u2 e
这是串空间在物理系统中的映射,它对应于遗传学中的表现型(Phenotype)的**。 . c& |+ C$ K- r3 n" W0 z, I
九、非线性
& L5 s+ P% L$ N+ }8 a; M$ i它对应遗传学中的异位显性(Epistasis)
  R( G; V" J( B7 A; j! N十、适应度(Fitness) 3 J* {, l: P& \3 a, N: G5 G
表示某一个体对于环境的适应程度。遗传算法的原理
/ S) N7 ^, X* d) S遗传算法GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群“染色体”,也即是假设解。然后,把这些假设解置于问题的“环境”中,并按适者生存的原则,从中选择出较适应环境的“染色体”进行复制,再通过交叉,变异过程产生更适应环境的新一代“染色体”群。这样,一代一代地进化,最后就会收敛到最适应环境的一个“染色体”上,它就是问题的最优解。! E0 ~1 `# {) ]# v2 I
一、遗传算法的目的 2 _5 X: p/ O0 b, t% y6 ?
典型的遗传算法CGA(Canonical Genetic Algorithm)通常用于解决下面这一类的静态最优化问题:
' r! d' g7 f- P考虑对于一群长度为L的二进制编码bi,i=1,2,…,n;有
6 @; w3 E2 c- W  [bi∈{0,1}
8 n' o; O4 @0 [6 O( j5 S; n给定目标函数f,有f(bi),并且
9 j% b4 V6 Z7 x4 o/ @+ I0<f(bi)<∞
5 G* l. k# r7 Z同时
5 b1 V  T0 i5 C* Pf(bi)≠f(bi+1) # {+ @% u% `% u" u
求满足下式 " p5 c0 o" h1 q
max{f(bi)|bi∈{0,1}的bi。
9 O5 P# }; `  v) Z% t) [  O3 m很明显,遗传算法是一种最优化方法,它通过进化和遗传机理,从给出的原始解群中,不断进化产生新的解,最后收敛到一个特定的串bi处,即求出最优解。
( V2 {& h. K2 A8 |+ l* L! c. V8 X& `1 t: O0 w: q6 v  C5 ^3 O
二、遗传算法的基本原理
9 G5 Q2 M+ y- d& w6 E+ h* p2 j长度为L的n个二进制串bi(i=1,2,…,n)组成了遗传算法的初解群,也称为初始群体。在每个串中,每个二进制位就是个体染色体的基因。根据进化术语,对群体执行的操作有三种:
. K% n, @3 M+ l1.选择(Selection) 8 g1 j0 }1 C# F: n5 f4 p4 i) {
这是从群体中选择出较适应环境的个体。这些选中的个体用于繁殖下一代。故有时也称这一操作为再生(Reproduction)。由于在选择用于繁殖下一代的个体时,是根据个体对环境的适应度而决定其繁殖量的,故而有时也称为非均匀再生(differential reproduction)。 4 D# x0 L. T$ W7 v% ]+ e" o7 f
2.交叉(Crossover) % U1 X/ D" W$ n: f. v  ^
这是在选中用于繁殖下一代的个体中,对两个不同的个体的相同位置的基因进行交换,从而产生新的个体。 ' J: T3 h5 c4 D' {" m
3.变异(Mutation) 4 \) S4 }3 Y1 B5 Y/ ^4 B8 ~
这是在选中的个体中,对个体中的某些基因执行异向转化。在串bi中,如果某位基因为1,产生变异时就是把它变成0;反亦反之。三、遗传算法的步骤 - j  ^4 ]; m% M, L) f5 S3 u) W
1.初始化
/ g( O9 P1 ]1 L9 u& [选择一个群体,即选择一个串或个体的**bi,i=1,2,...n。这个初始的群体也就是问题假设解的**。一般取n=30-160。 5 d% N# |; g7 G- ?! C
通常以随机方法产生串或个体的**bi,i=1,2,...n。问题的最优解将通过这些初始假设解进化而求出。 $ K7 \; \- k; J2 k; F- G
2.选择
( Y! S: a; \1 w8 r根据适者生存原则选择下一代的个体。在选择时,以适应度为选择原则。适应度准则体现了适者生存,不适应者淘汰的自然法则。
7 W; }. R+ w, n0 S8 v给出目标函数f,则f(bi)称为个体bi的适应度。以
/ x% h8 F) L; v7 c8 ?# a2 \/ p/ H* i; U: a" _% m

4 f$ F6 A+ H9 X, u2 Z为选中bi为下一代个体的次数。
: D( ]) K7 W& m4 k7 Q

( E2 C) v8 H! Z9 X+ F) ?: q% m# A3 Y显然:
" j/ Z2 b# {! P1 _. G(1)适应度较高的个体,繁殖下一代的数目较多。 0 j$ I5 {; p$ S9 s% v3 X
(2)适应度较小的个体,繁殖下一代的数目较少;甚至被淘汰。
9 ], r) Y2 R& Z! a8 a/ s) v这样,就产生了对环境适应能力较强的后代。对于问题求解角度来讲,就是选择出和最优解较接近的中间解。
' ~  V7 c/ [) e5 x, s1 q4 n8 J+ }* T选择的方法有: ) f  i! ]# n! H$ Y1 D6 z$ B
适应度比例法
; W6 \& I: O8 k; C2 M1 z, L8 y期望值法 9 Q  n) o# }* d$ M" ~4 J7 a; o
排位次法
. B9 K$ w- B7 D6 _$ v: P& P精华保存法- h' j) p% ?3 o8 ^7 v' [
! h' g4 T) t1 K: u0 a
3.交叉
! h0 L5 P0 Z8 J; @5 Y对于选中用于繁殖下一代的个体,随机地选择两个个体的相同位置,按交叉概率P。在选中的位置实行交换。这个过程反映了随机信息交换;目的在于产生新的基因组合,也即产生新的个体。交叉时,可实行单点交叉或多点交叉。
0 f7 P1 O3 f& G/ r2 q& {& a
/ L7 f+ {; H& C6 L7 d) a例如:有个体 & B: l- f" ^  J/ Q( Y
S1=100101 5 r/ G- o5 s3 e# r6 c7 i
S2=010111
4 C1 b3 Z  \- M, l% N选择它们的左边3位进行交叉操作,则有 6 m5 J/ E- j7 L  `. F/ K+ ~' @
S1=010101
  z$ p  p4 e% VS2=100111
4 t; g) ^: J# W2 ?0 }. N一般而言,交叉概率P,取值为0.25—0.75。4.变异
% s" J0 B2 L* @根据生物遗传中基因变异的原理,以变异概率Pm对某些个体的某些位执行变异。在变异时,对执行变异的串的对应位求反,即把1变为0,把0变为1。变异概率Pm与生物变异极小的情况一致,所以,Pm的取值较小,一般取0.01-0.2。
3 i2 v6 X+ Y3 S6 h6 s
8 Z' O/ U- e5 U) t6 S例如:- g* k) Y+ [$ [6 a' X2 p: q  g
有个体S=101011。 3 h. |6 i* U. [/ Z
对其的第1,4位置的基因进行变异,则有
7 T8 u! F# [$ |6 W7 A2 t: T! V  A, sS'=001111 % K  }( \0 D6 V6 l! v' l) `! l
单靠变异不能在求解中得到好处。但是,它能保证算法过程不会产生无法进化的单一群体。因为在所有的个体一样时,交叉是无法产生新的个体的,这时只能靠变异产生新的个体。也就是说,变异增加了全局优化的特质。* P8 u1 D) p& z' |" T  @9 j
5.全局最优收敛(Convergence to the global optimum) 8 S( Y$ y0 t4 F! W  U
当最优个体的适应度达到给定的阀值,或者最优个体的适应度和群体适应度不再上升时,则算法的迭代过程收敛、算法结束。否则,用经过选择、交叉、变异所得到的新一代群体取代上一代群体,并返回到第2步即选择操作处继续循环执行。 / w4 X: {9 p5 l- e
遗传算法基本处理流程图如下: 8 z6 ?4 M! W3 @2 B8 Y

* H5 p) z5 u( [9 i/ N5 C4 Z二、遗传算法的应用关键 ( v; I4 }5 y# x7 e3 R
遗传算法在应用中最关键的问题有如下3个
- z9 c2 l" R$ s* b8 P; _1.串的编码方式   w" F5 i6 h$ \/ g7 Z+ z, G
这本质是问题编码。一般把问题的各种参数用二进制编码,构成子串;然后把子串拼接构成“染色体”串。串长度及编码形式对算法收敛影响极大。 2 E/ K4 X. S8 t! R1 N! ?& \2 E
2.适应函数的确定
9 Q; l$ O2 O% n1 D* r0 w适应函数(fitness function)也称对象函数(object function),这是问题求解品质的测量函数;往往也称为问题的“环境”。一般可以把问题的模型函数作为对象函数;但有时需要另行构造。 , q" \2 x* z4 R4 ?% N' v
3.遗传算法自身参数设定
0 @) }) W2 q0 t8 k/ {, n, u遗传算法自身参数有3个,即群体大小n、交叉概率Pc和变异概率Pm。
  C; F9 I3 O1 H; ^群体大小n太小时难以求出最优解,太大则增长收敛时间。一般n=30-160。交叉概率Pc太小时难以向前搜索,太大则容易破坏高适应值的结构。一般取Pc=0.25-0.75。变异概率Pm太小时难以产生新的基因结构,太大使遗传算法成了单纯的随机搜索。一般取Pm=0.01—0.2。
2 ]) z& D. P# @  Q  F! s' dmatlab遗传算法工具箱函数及实例讲解 . Q- w, b7 N1 s+ E
核心函数: ! x) x. o' A% q9 H$ B  l
(1)function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始种群的生成函数
3 E3 j* M! _2 c【输出参数】
6 Q8 ?6 J$ |: I5 e, Mpop--生成的初始种群 : k# P7 U* m6 b/ D# _$ x2 ^
【输入参数】
4 [* H) [' p- X: Znum--种群中的个体数目
# d% ], E! J& e- X$ Abounds--代表变量的上下界的矩阵 5 `/ d6 h  t, w8 @* u- z8 U
eevalFN--适应度函数 2 c1 s- A5 o# _3 j/ f) V
eevalOps--传递给适应度函数的参数
. W6 v0 ~9 p7 i" A6 S3 O" moptions--选择编码形式(浮点编码或是二进制编码)[precision F_or_B],如
* Y+ p( f' C3 x/ W( Y$ Cprecision--变量进行二进制编码时指定的精度 : w4 x2 z* P" i! \. D
F_or_B--为1时选择浮点编码,否则为二进制编码,由precision指定精度)
2 W0 F. ^) y. y4 v, V2)function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts,...
# J, Q( K. v4 w, E# htermFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)--遗传算法函数6 x% y( K; @) X# K
【输出参数】 , \. H. D% u6 f/ ~2 a0 P
x--求得的最优解 ; e* ]* p( B; ~+ f, |1 a
endPop--最终得到的种群
- q& R+ n6 k8 [  m. I: u0 LbPop--最优种群的一个搜索轨迹 3 h' X2 v) E( F( u* x$ q, M
【输入参数】 3 |) }. E& z6 ~6 g
bounds--代表变量上下界的矩阵 ) m; [! _4 t1 z( K' {! I
evalFN--适应度函数 / p' d+ h8 E6 d" \5 V
evalOps--传递给适应度函数的参数
- [, o, [2 z6 N) g( z4 c$ |  GstartPop-初始种群 ) u& A+ I! F' z% h% U
opts[epsilon prob_ops display]--opts(1:2)等同于initializega的options参数,第三个参数控制是否输出,一般为0。如[1e-6 1 0]
: B7 D" @' `* f- A" X/ p- DtermFN--终止函数的名称,如[‘maxGenTerm’] : x" C# B( Q) S* O0 K+ ?
termOps--传递给终止函数的参数,如[100]
: N) l- t8 {! p# o$ qselectFN--选择函数的名称,如[‘normGeomSelect’] , i$ I: @  b1 C" Z- ~
selectOps--传递给选择函数的参数,如[0.08] ! I% P* r; `/ ?) L, B
xOverFNs--交叉函数名称表,以空格分开,如['arithXover heuristicXover simpleXover']
  j* O; [) x6 E% e4 o/ k+ u1 m% XxOverOps--传递给交叉函数的参数表,如[2 0;2 3;2 0] # r3 U* I9 K7 _* U; b- u6 m" G
mutFNs--变异函数表,如['boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation']
; ]; e# p) D1 h. h0 N- QmutOps--传递给交叉函数的参数表,如[4 0 0;6 100 3;4 100 3;4 0 0]
/ S. Y' t* B% ?- T6 x【问题】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0<=x<=9 2 d% e+ K+ f( N, ^* P3 f; `% l  R
【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交叉概率为0.95,变异概率为0.08
8 F0 X- }; A' |7 @$ q【程序清单】
! g% o( c3 h( ?8 Y. l" a/ K" f%编写目标函数 ( `" B! V2 X1 x8 m5 l; r+ u6 J
function[sol,eval]=fitness(sol,options)
$ |+ y% x/ i7 K4 @3 ~. |, jx=sol(1); 6 W! k, L* m. Y$ C
eval=x+10*sin(5*x)+7*cos(4*x);
. |8 v) W9 r. l3 C( ?& ?5 L%把上述函数存储为fitness.m文件并放在工作目录下 / _8 R. p8 n  R0 {0 y) c! m3 v% N& @

8 q2 z" W7 e+ U2 f3 V* iinitPop=initializega(10,[0 9],'fitness');%生成初始种群,大小为10
1 L& C* Y  _: d- Q0 s5 W[x endPop,bPop,trace]=ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,'normGeomSelect',...
2 g  m" O6 e; s/ s3 n5 V8 i, r[0.08],['arithXover'],[2],'nonUnifMutation',[2 25 3]) %25次遗传迭代 & m& G( {+ H9 L& {- e  W
运算结果为:x = 7.8562 24.8553(当x为7.8562时,f(x)取最大值24.8553)
8 L  @% Z0 \( [) S+ k/ g7 O2 Z5 e6 G, i
注:1、遗传算法一般用来取得近似最优解,而不是最优解。 2 p7 T0 K5 D$ W
2、matlab工具箱函数必须放在工作目录下
1 Q3 l: E1 v* ^* b9 D




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5