|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
9 p1 ]- _# X1 w+ x
一、简介/ D; k! q: ]2 P: `% B
1 遗传算法基本理论: M, i8 ]+ F" V' W' f
遗传学认为,遗传是作为一种指令遗传码封装在每个细胞中,并以基因的形式包含在染色体中,每个基因有特殊的位置并控制某个特殊的性质。每个基因产生的个体对环境有一定的适应性。基因杂交和突变可能产生对环境适应性强的后代,通过优胜劣汰的自然选择,适应度值高的基因结构就保存下来。
# y7 l4 \$ j/ ]% k! e遗传算法借鉴“适者生存”的遗传遗传学理论,将优化问题的求解表示成“染色体”的“适者生存”过程,通过“染色体”群的一代代复制、交叉、变异的进化,最终得到的是最适应环境的个体,从而得到问题的最优解或者满意解。这是一种高度并行、随机和自适应的通用的优化算法。* x+ N! C5 s3 L$ ^" c0 l& E( C
遗传算法的一系列优点使它近年来越来越受到重视,在解决众多领域的优化问题中得到了广泛的应用,其中也包括在交通领域的成功应用。/ j) f* m9 o0 t/ o! ~
2 遗传算法的特点
' W/ W" @ U) e8 o遗传算法是模拟生物自然环境中的遗传和进化过程而形成的一种自适应全局优化概率搜索算法。是一类可用于复杂系统优化计算的鲁棒搜索算法,与其他一些优化算法相比,它具有很多特点。) v; I) R: V5 ^+ j. C& A
传统的优化算法主要有三种:枚举法、启发式算法和搜索算法:, q$ A# Z3 M+ m( A) E8 n
1.枚举法! E- q: a5 C- M. l
枚举法在可行解集合内枚举所有可行解,以求出精确最优解。对于连续函数,该方法要求先对其进行离散化处理,这样就可能因离散处理而永远达不到最优解。此外,当枚举空间比较大时,该算法的求解效率非常低,极其耗时。
: ]0 C) }; W5 r4 T/ i- E/ n0 K2.启发式算法 c3 y/ o4 \# J% M1 D' k8 N
启发式算法寻求一种能产生可行解的启发式规则,以找到一个最优解或近似最优解。启发式算法的求解效率比较高,但对每一个需求解的问题必须找出其特有的启发式规则,这个启发式规则一般无通用性,不适合于其他问题。
6 V' ^; |1 p1 |6 ~3.搜索算法, O$ A( v, B. q/ e1 ?: i
搜索算法在可行解集合的一个子集内进行搜索操作,以找到问题的最优解或者近似最优解。搜索算法虽然保证不了一定能够得到问题的最优解,但若适当的利用一些启发知识,就可在近似解的质量和效率上达到一种较好的平衡。
9 K, S- Y2 E) w( }+ y3 基本遗传算法的工作流程
. A; M- u, ^* z( T8 t! _
, {) w( ]9 R) |/ l' e& F' Y0 N" g- j$ Z8 ]# B
4 适应度函数0 L/ i& t3 P! a. u1 l% c
6 l8 U ^/ M6 f
% x7 y6 t# j5 e- b$ S, x, _* p* H
- E/ w5 z/ b) F$ ?- \
5 选择算子
2 N& B2 w& }* y7 l2 h; i选择又称为复制,是在群体中选择生命力强的个体产生新的群体的过程。遗传算法使用选择算子来对群体中的个体进行优胜劣汰操作,根据每个个体的适应度大小选择,适应度较高的个体被遗传到下一代群体中的概率较大;反之亦然。这样就可以使得群体中个体的适应度值不断接近最优解。选择算子的确定的好坏,直接影响到遗传算法的计算结果。/ U D$ b' i8 @( P, ^1 Z
下面介绍几种典型常用的选择算子:' N4 D6 R1 p9 }) q+ N. h4 D4 c, P' ^
1.轮盘赌选择
8 O; t% V- B$ ~. N2.随机竞争选择3 _& I* H, ~1 |1 d: `* l2 A+ }
3.随机遍历选择8 b6 d4 ^( X& \
4.排序选择
. x% i1 U r9 G9 ?* M; g" B5.联赛选择: P. N/ o, m8 s: K
6 交叉算子: i# G f4 Q! a
下面介绍几种适合于二进制编码个体或十进制编码个体的交叉算子。# d/ n( ]: S1 l
l.单点交叉7 b: ^1 l: v2 e% Y& ?$ l. ~* P
单点交叉(One-point Crossover)又称为简单交叉,是最常用和最基本的交叉操作算子。它以二值串中的随机选择点开始,对每一对相互配对的个体,依设定的交叉概率在其交叉点处相互交换两个个体的部分染色体,从而产生出两个新的个体。 K4 B4 V6 P% y2 a& v) L
2.两点交叉与多点交叉6 G- z0 |" g# e/ g
两点交叉(Two-point Crossover)是指在个体编码串中随即设置两个交叉点,然后再进行部分基因交换。两点交叉的具体过程是:; f" |9 D7 }& c8 y+ N
(1)在相互配对的两个个体编码串中随即设置两个交叉点。" F- P9 X3 k+ @8 v2 \2 `: C9 G; x
(2)交换两个个体在所设定的两个交叉点之间的部分染色体。
7 g) Q. O* x% } ?- P3.均匀交叉" Z }& X0 R4 S5 U1 ]
均匀交叉是指两个配对个体的每个基因座上基因都以相同的交叉概率进行交换,从而形成两个新的个体。其具体运算可通过设置一屏蔽字来确定新个体的各个基因如何由哪一个父代个体来提供。. F0 E( y7 F1 ^5 l* e
4.算术交叉( E3 g: J; F4 G4 Z* R8 r
算术交叉是指由两个个体的线性组合而产生出两个新的个体。为了能够进行线性组合运算,算术交叉的操作对象一般是浮点数编码所表示的个体。1 v% N6 W& Z" j7 H- e6 K
7 变异算子: i+ F# c1 F# E3 K7 }" d
遗传算法中所谓的变异运算,是指将个体染色体编码串中的某些基因座上的基因值用该基因座的其他等位基因来替换,从而形成一个新的个体。变异是遗传算法生成新个体的主要方法之一,变异运算可以使算法在运行过程中维持种群的多样性,有效避免早熟,起到改善遗传算法局部搜索能力的作用。
* a- B( B: ^* `% `遗传算法中变异算子也应根据不同的要求进行选择和设计,下面是几种常用的变异算子。
: U9 c4 l7 F4 Q$ _* z5 I, A7 B8 遗传算法的改进
" I9 O/ h9 m" n. ~4 {+ c5 \' I3 a0 N
" \* G% j8 P% g. {& l9 Z* T- I; K( V4 G2 A i2 A
. @/ F9 a4 D, j4 S
二、源代码4 R' Y" |0 R# C% g
%% GA3 W; E7 e0 ~9 Q) l
%% 清空环境变量
& m9 X+ O+ x" t; ^; I* oclc,clear,close all; s4 y& M, q! w- `- P
warning off' L6 n% ~5 D5 k" Z
% feature jit off9 d8 i6 N) f( B7 P/ _7 ]' P
%% 遗传算法参数初始化
9 A' `: ]% ^$ K- R: |2 E+ Omaxgen = 50; % 进化代数,即迭代次数
) j5 w: i/ U& p$ ^* Dsizepop = 100; % 种群规模6 y( p9 f0 [$ V
pcross = [0.7]; % 交叉概率选择,0和1之间( {: n, G1 M& a' s r: T* P1 t
pmutation = [0.1]; % 变异概率选择,0和1之间
# G( D) b" T* x8 b%染色体设置4 q; Y2 D, b' _9 R. T) G6 p
lenchrom=ones(1,3); % t1、t2、t3
' |+ Z. l7 R# E g) G- Y# ebound=[38,59;26,37;33,44;]; % 数据范围
/ y0 R1 }& e# `%---------------------------种群初始化------------------------------------/ P8 z* d' k p. v2 D- |, }
individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]); %将种群信息定义为一个结构体2 A' X9 ?# n" J1 o4 N
avgfitness = []; %每一代种群的平均适应度" l' ^2 ~1 Y n
bestfitness = []; %每一代种群的最佳适应度 R; Q% M7 ?: V
bestchrom = []; %适应度最好的染色体
+ }* H0 T1 Z9 v z1 K, @' j2 `" v3 J
%% 初始化种群
: _& x3 t* k3 dfor i=1:sizepop
+ Z1 p2 Q) J3 c( f: u3 ^: t4 H/ p % 随机产生一个种群
1 `' H" o9 k7 R) D1 v# f" f" ~3 k individuals.chrom(i,:)=Code(lenchrom,bound); % 编码(binary和grey的编码结果为一个实数,float的编码结果为一个实数向量)
+ u) d+ ]$ J) j' q; ] x=individuals.chrom(i,:);, }9 W+ J' J8 ]8 T
% 计算适应度# I2 `" ~ D0 p
individuals.fitness(i)=fun(x); % 染色体的适应度 % v) W" Y+ R' m
end
S' M1 V( k/ k; Z# f- ^! Y$ o8 E# \" b
3 P0 A& p& q+ C%% 找最好的染色体, c8 z0 O8 D: z. g2 v
[bestfitness bestindex] = min(individuals.fitness);
( Z- l3 |. N; ibestchrom = individuals.chrom(bestindex,:); % 最好的染色体$ l3 |# @0 U6 g1 H! n, q3 i
% 记录每一代进化中最好的适应度和平均适应度. C: G' B/ j5 e9 w: [; j& u# ?6 _
trace = [bestfitness]; 0 R7 o0 ]( [, I; W, r+ L3 i
7 P; k1 Q- k. W2 f
%% 迭代求解最佳初始阀值和权值
, ]5 f3 O# s. W, ~. c' {% 进化开始) u4 r' ~# L" l4 u' }5 j$ Y
for i=1:maxgen
* M6 C' a! E! m. W' E$ z disp(['迭代次数: ',num2str(i)])5 u/ V9 F$ w1 t" m; a
% 选择
' i! ^( F# f0 [ individuals=Select(individuals,sizepop);
' k @& j, C6 Q, c1 N3 W. n % 交叉" s2 C9 D4 s$ Z5 q Z
individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);# d6 E& h; j; U4 p& [/ E, F
% 变异0 K" O: q8 L4 G. _
individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound);4 O! m2 g# i3 m: t3 d
4 C- C0 P, v6 O' d, a* ~- Y- T: \ % 计算适应度
% J8 k0 S4 `6 L2 j for j=1:sizepop
* {9 x, E$ A' V7 } x=individuals.chrom(j,:); % 解码
# `: a! l/ b/ i" ~- V& x( T individuals.fitness(j)=fun(x); % 染色体的适应度
R+ W& o, Y5 O+ K+ X# {5 F end
) ?7 x3 {" Y7 g' |# `4 z: Y%% 改进的GA/ O( |8 v) c9 k7 ^
%% 清空环境变量
/ S" `' f2 G' f+ w% clc,: [! a0 o/ ?1 i0 l c4 y
clear % ,close all % 清除变量空间# b4 t4 @* x: U }. j
warning off % 消除警告
: y7 ^2 ~+ q- Y, n% feature jit off % 加速代码执行
) S* y! Q9 U# V# K%% 遗传算法参数初始化: l2 o. t) L- f b# T5 r
maxgen = 50; % 进化代数,即迭代次数
& d; H/ K. @ G1 u* x2 Ysizepop = 100; % 种群规模4 ^ |# q* X5 P# r: `* J( Z
pcross = [0.7]; % 交叉概率选择,0和1之间
" w: P6 _5 {1 c( b% u3 |pmutation = [0.01]; % 变异概率选择,0和1之间
2 O% G" Q. I) c: L, C6 u4 i8 Udelta = 0.1;$ F) H; W1 [9 Z1 l# k
% 城市交通信号系统参数/ L( I7 C4 }4 }
C = 140;
' ]2 G- P; Y# y" S3 WL = 10;
) v& X# Q2 Z6 q, u& G# r. ^# t0 ^load('data.mat') % 包含交通流量q以及饱和流量xij8 E9 E0 i8 I+ {0 g7 V. R7 u0 v
q = q./3600; % 转化为秒s4 b, E- F" x9 X" B/ p( w
xij = xij./3600; % 转化为秒s
" y3 w6 _$ p) D& z, O, r9 m%染色体设置; D+ l8 f0 U3 H1 z' @6 K
lenchrom=ones(1,3); % t1、t2、t3
' p( ^; I; s ?. [" g( O8 v/ gbound=[38,59;26,37;33,44;]; % 数据范围
+ I ^: d! [5 s4 B3 r3 Q%---------------------------种群初始化------------------------------------+ B4 g8 P) Y5 I
individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]); %将种群信息定义为一个结构体! S+ e- h T2 G
avgfitness = []; %每一代种群的平均适应度3 q9 U/ }2 x" n) a7 |2 G- c
bestfitness = []; %每一代种群的最佳适应度
" B2 f7 N2 u, D. A; d( M$ w- u7 Ebestchrom = []; %适应度最好的染色体1 m" `! R5 f( v, Y, C
0 S" x( i5 K* s! ]9 |
%% 初始化种群. C7 ]- h- d* T8 J: Y
for i=1:sizepop
4 a% s* n2 V+ Q2 `1 I% h- ~ % 随机产生一个种群1 C: ~# E e% \6 M$ N. Y7 S
individuals.chrom(i,:)=Code(lenchrom,bound); % 编码(binary和grey的编码结果为一个实数,float的编码结果为一个实数向量)
( i5 I# R' P* {' p: N4 x9 T x=individuals.chrom(i,:);
" P0 g) d: F& Q+ O# R % 计算适应度, X& ]1 z: C' H
individuals.fitness(i)=fun1(x); % 染色体的适应度
4 m# b. y H% j7 xend9 r, p; `' ?6 A: v5 i# {* E
. ?# e9 l! w& j1 u+ r
%% 找最好的染色体5 {2 @; W- L D
[bestfitness bestindex] = min(individuals.fitness);" i% }3 Y% k# U5 M
bestchrom = individuals.chrom(bestindex,:); % 最好的染色体
, u/ x3 o2 O6 s: y0 u% 记录每一代进化中最好的适应度和平均适应度1 p V! G0 Y: T$ e
trace = [bestfitness]; H! m3 c `- G1 J7 w
+ X2 z$ s' ]" J1 z( `5 q) K* P' o" {& L%% 迭代求解最佳初始阀值和权值1 j' K; d4 | p" F
% 进化开始- C4 B9 t8 z* Z8 b
for i=1:maxgen% |" e: G! j+ G! F0 H
disp(['迭代次数: ',num2str(i)])6 y. z Q/ h; ?/ N4 ]
% 选择( H4 Y* [' e& v- o4 Q$ d
individuals=Select1(individuals,sizepop); . l- r/ U8 v+ d, T) ~$ S
% 交叉3 z2 Y2 ]( v# W+ y
individuals.chrom=Cross1(pcross,lenchrom,individuals.chrom,sizepop,bound);
: p: z" ]& }/ U7 J0 N % 变异' D7 ^# ]$ C* F, R: S# i
individuals.chrom=Mutation1(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound);
; E3 X7 E4 K0 ^7 d: r S
a. e% @# I& y2 z3 e5 N+ K! Q. L7 R % 计算适应度
' ?' z& v h* O, I0 R for j=1:sizepop
6 q6 `3 f: _* x5 M x=individuals.chrom(j,:); % 解码
; {" D: Y" X: w+ S/ Y individuals.fitness(j)=fun1(x); % 染色体的适应度 9 ?1 r, ]" x; T" d7 C. p' j1 l
end
: E' V. l1 f; Q: I fmax = max(individuals.fitness); % 适应度最大值
' o% m, H7 L) r! _9 E8 p3 [) R fmin = min(individuals.fitness); % 适应度最小值 r1 I5 Q5 r8 f$ x i) K1 J9 m+ c9 O
favg = mean(individuals.fitness); % 适应度平均值
, v" `; z* n& j individuals.fitness = (individuals.fitness + abs(fmin))./(fmax+fmin+delta); %适应度标定
# _7 V: R+ k0 M* d" X, T
2 E1 p9 _5 W i) X8 J 3 y! i; J9 N" P, o2 Q" l
[newbestfitness,newbestindex]=min(individuals.fitness);
# n. C* ]# H1 ? i [worestfitness,worestindex]=max(individuals.fitness);. r k F6 i: Y( F/ u& W
/ J1 k$ n( J+ T+ k+ u% `: f
if bestfitness>newbestfitness- G+ {! V# A7 C$ x
bestfitness=newbestfitness;3 W0 ]8 b3 X7 a9 a, ?! X
bestchrom=individuals.chrom(newbestindex,:);
+ y. z- b: s) F end
" N8 P: h; b3 [2 u* W; W. h d* C
8 {" d( C0 ]! v6 ^3 t
* G# h" \5 r4 I三、运行结果
2 ~, H1 U2 n1 P8 i, R
$ X$ l$ w' S ` d& y |
|