- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566467 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175163
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python实现的遗传算法实例(一)/ F; y( _# H k5 x& w6 z$ F$ B" V
; c5 `% g" z; S- u( ^6 n" i一、遗传算法介绍9 O$ Y, g6 ~7 Y& e( b
7 R G- b; m9 h( P7 q- x 遗传算法是通过模拟大自然中生物进化的历程,来解决问题的。大自然中一个种群经历过若干代的自然选择后,剩下的种群必定是适应环境的。把一个问题所有的解看做一个种群,经历过若干次的自然选择以后,剩下的解中是有问题的最优解的。当然,只能说有最优解的概率很大。这里,我们用遗传算法求一个函数的最大值。
; a1 @, X9 y, O) i: x f(x) = 10 * sin( 5x ) + 7 * cos( 4x ), 0 <= x <= 104 w6 q/ e, J2 k2 h) [
) j8 Z$ @* E- r7 t6 Z$ ]1、将自变量x进行编码
9 @& {- _; f- f' F4 C5 M! o3 F& u% O4 d
取基因片段的长度为10, 则10位二进制位可以表示的范围是0到1023。基因与自变量转变的公式是x = b2d(individual) * 10 / 1023。构造初始的种群pop。每个个体的基因初始值是[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
) h1 O1 q! T% p, K; \& V4 j |+ q: J* r
2、计算目标函数值
% l s3 `" Z6 b; C }) Y
, ~; `6 x# G; P0 `9 b 根据自变量与基因的转化关系式,求出每个个体的基因对应的自变量,然后将自变量代入函数f(x),求出每个个体的目标函数值。
) m* O$ w7 i2 ?% ?( M- C, ^
" o: p1 r1 B1 H/ B3、适应度函数
3 t8 W4 A! ]/ {9 M+ u
; X; b5 K7 i e 适应度函数是用来评估个体适应环境的能力,是进行自然选择的依据。本题的适应度函数直接将目标函数值中的负值变成0. 因为我们求的是最大值,所以要使目标函数值是负数的个体不适应环境,使其繁殖后代的能力为0.适应度函数的作用将在自然选择中体现。% r1 R) T1 h; l5 p8 ~
) v: z \" ?1 ^( b. \( \1 r9 Q) p, I4、自然选择
& W" A$ T+ x, r, ^
2 T6 M; ~$ U& p- i自然选择的思想不再赘述,操作使用轮盘赌算法。其具体步骤:/ t6 T$ h# A' d5 _! [
; q% u* u* g& \7 g% y! X8 v
假设种群中共5个个体,适应度函数计算出来的个体适应性列表是fitvalue = [1 ,3, 0, 2, 4] ,totalvalue = 10 , 如果将fitvalue画到圆盘上,值的大小表示在圆盘上的面积。在转动轮盘的过程中,单个模块的面积越大则被选中的概率越大。选择的方法是将fitvalue转化为[1 , 4 ,4 , 6 ,10], fitvalue / totalvalue = [0.1 , 0.4 , 0.4 , 0.6 , 1.0] . 然后产生5个0-1之间的随机数,将随机数从小到大排序,假如是[0.05 , 0.2 , 0.7 , 0.8 ,0.9],则将0号个体、1号个体、4号个体、4号个体、4号个体拷贝到新种群中。自然选择的结果使种群更符合条件了。
. f5 Y" Y/ c- I+ s9 @, _: I
3 B. A8 V; K3 o1 z. L5、繁殖7 m* A A/ L" B+ L& T% P
4 r& W+ X% n: K假设个体a、b的基因是! E! q- ^; A o( l w; P5 {% m
0 Y" d- x) l# L: U+ E- N2 F0 R$ ?2 za = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]$ E4 d% o3 i) C
9 E9 C9 m- T3 T5 z
b = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]
: H4 l5 M$ I! u# h1 O S% K& I2 B6 F# F$ }) [9 \ O4 A
这两个个体发生基因交换的概率pc = 0.6.如果要发生基因交换,则产生一个随机数point表示基因交换的位置,假设point = 4,则:
% `/ u) @5 ^: B8 Y" E% {( b, Z# S i8 X" _* f: y
a = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]* E# F9 D; [; n/ ?. I& J& P' z
: J8 |+ R- r( t2 i" K0 sb = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]
/ y) A& O( |' j! I
+ g/ x/ J$ L( F% _交换后为:$ x: P4 C* |( a5 V
' L3 q6 h ^4 e% g. N* ?+ V9 K
a = [1, 0, 0, 0, 1, 0, 1, 1, 1, 1]7 e7 _1 J& z. c% X0 `7 h7 N5 u
Y" Y8 t- @2 P8 O' f5 b
b = [0, 0, 0, 1, 0, 1, 1, 1, 0, 0]
2 B# `5 s. {$ B. O' R
' b7 C: U2 S2 H" b0 W* F6、突变
: \/ K$ [( i' ^" S9 h" [* L2 ^! [( [6 \. ?" X; v A3 W
遍历每一个个体,基因的每一位发生突变(0变为1,1变为0)的概率为0.001.突变可以增加解空间
0 ]9 W t! N: w" ]# p+ X! X
& M. P' i; O8 P" k& ^1 Y; ^' e. c二、代码
* H: W% ]- F8 o$ udef b2d(b): #将二进制转化为十进制 x∈[0,10]8 q" \* C7 @: `$ L! t$ x
t = 0
Y* l' \% W2 _- V, g5 N for j in range(len(b)):
; H. n; B* ^5 d+ A, S2 x- W t += b[j] * (math.pow(2, j))
2 }; o" V* C3 _% g* T t = t * 10 / 1023+ j) `+ @4 ]6 V, H. [
return t
: u9 J" Q O* }2 Y/ X- M: X' A) `. \+ y% K9 L( I
popsize = 50 #种群的大小9 F; t1 P2 Q9 N+ w7 f; C
#用遗传算法求函数最大值:
1 B8 a* V; B5 s G- Q5 P/ J#f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]0 l# |" r6 X; I7 a) x* g
4 Z4 `4 b: a( m: J+ [
chromlength = 10 #基因片段的长度
% L7 r7 @# w, dpc = 0.6 #两个个体交叉的概率
5 X d/ b( |; k1 Hpm = 0.001; #基因突变的概率
0 c1 A' l" u; m7 F+ Hresults = [[]]- I7 T, [, x+ N8 ^! U/ Y7 N
bestindividual = []
0 _7 V, o, ~% { h" {bestfit = 00 s2 p; A' ~8 _7 t6 m
fitvalue = []3 @* y5 E9 h: N) M) b
tempop = [[]]
& t" y+ n2 Z! R, xpop = [[0, 1, 0, 1, 0, 1, 0, 1, 0, 1] for i in range(popsize)]
7 E9 R9 h" Y! u" I: j U6 Gfor i in range(100): #繁殖100代
8 X1 T; R+ B: a2 b! V8 L objvalue = calobjvalue(pop) #计算目标函数值* P. F9 X, H s' E8 T' _4 y( S+ n
fitvalue = calfitvalue(objvalue); #计算个体的适应值* t; L$ n; c- ^ f& c
[bestindividual, bestfit] = best(pop, fitvalue) #选出最好的个体和最好的函数值
8 W8 P% M) G( H1 h! I results.append([bestfit,b2d(bestindividual)]) #每次繁殖,将最好的结果记录下来% }, Z3 n/ x2 U7 v1 y% a, l
selection(pop, fitvalue) #自然选择,淘汰掉一部分适应性低的个体
2 J* B( s' a& w( ?1 G crossover(pop, pc) #交叉繁殖
4 h5 Y. A5 T s+ x7 s mutation(pop, pc) #基因突变
7 w2 f# J, v+ d9 C ( b0 I5 @9 P1 L( m3 ^- U% C7 H% ]
# K$ Z6 K/ Y6 O, jresults.sort() # ^7 X y! v, _7 A* ~
print(results[-1]) #打印函数最大值和对应的
- L; D# P( P% E+ }! d; i+ Zdef calfitvalue(objvalue):#转化为适应值,目标函数值越大越好,负值淘汰。
4 N, C: _4 _ s p fitvalue = []) P5 J0 o( e! }0 g( p1 |2 J
temp = 0.0
2 M( Q2 u8 m9 Y8 C+ J Cmin = 0;" \% d. r' X: ]: u6 \; Q
for i in range(len(objvalue)):
. D: T( w5 v* N- h: d8 o& O if(objvalue + Cmin > 0): E6 N) r6 S: {9 ?* y
temp = Cmin + objvalue
) G, b: h* T \ else:3 \& ?2 ~% e; ^7 f8 C: c
temp = 0.0) ~9 u- S6 T9 R- m6 i) _
fitvalue.append(temp)
! ?; @1 o8 ]; {: O5 r return fitvalue
' i4 A; {: W/ C: i; F" F* f b! Mimport math
y- }8 H6 \; j4 N5 @8 ^# X% k' o
, C* G! Q6 e1 B5 Tdef decodechrom(pop): #将种群的二进制基因转化为十进制(0,1023)& n$ `. U7 l* Q) c3 e `4 I
temp = [];: ]& C. W: L" j% S
for i in range(len(pop)): K: d% u" I$ l& V1 {
t = 0;
1 y7 z$ |! V% c/ q2 S for j in range(10):; a5 F3 m& z! F0 L2 O' a
t += pop[j] * (math.pow(2, j))
& I! B! l4 |) W3 L. |3 F temp.append(t) {. }. E$ f# E1 ~8 s6 ^, B
return temp9 V7 W1 x" a2 g4 P
8 j) v( U* |3 @def calobjvalue(pop): #计算目标函数值3 g- y3 U1 j* ^8 R0 L# s; v
temp1 = [];/ O! M7 i' X+ h; X {3 _8 T
objvalue = [];1 d s) |6 e& Q' w8 m
temp1 = decodechrom(pop)
4 \3 l& h9 o8 Y4 D for i in range(len(temp1)):7 M1 K! S; p* ?
x = temp1 * 10 / 1023 #(0,1023)转化为 (0,10)
" Z7 ^ N: H2 O# Z objvalue.append(10 * math.sin(5 * x) + 7 * math.cos(4 * x))* H" U. W$ F1 u3 o
return objvalue #目标函数值objvalue[m] 与个体基因 pop[m] 对应
( I* D# R( ^* c/ l. Sdef best(pop, fitvalue): #找出适应函数值中最大值,和对应的个体+ l$ a( P6 v1 M$ U
px = len(pop)
* {. ]0 Z7 |7 ? U* F n bestindividual = []1 J0 i" J- R* S6 g0 k( `9 B- B
bestfit = fitvalue[0]
% _; p+ e! A$ d, D! H% x) P for i in range(1,px):
% k! a6 _+ Z" d9 @ if(fitvalue > bestfit):
; |0 C1 `1 h* L2 g bestfit = fitvalue( I Z$ L' q/ Q4 l1 _
bestindividual = pop
- P- N( |9 z2 s3 {8 u9 {2 b return [bestindividual, bestfit]
. ] Z! W0 q/ ?5 [6 oimport random
3 ~' l7 e( \- S6 {! g5 D" R9 N' A( }5 U
def sum(fitvalue):
' Z/ ^! V' A( x+ u total = 0% W9 w+ o' ?, |7 Y1 l, n5 }* Q
for i in range(len(fitvalue)):
! \; t4 e; }, f4 }( x; E total += fitvalue& h& x/ U5 |1 U/ ~) m. h- T; [
return total9 i- {- [: W5 e. ~
. g$ Y: x' T; }) g/ Rdef cumsum(fitvalue): |. K$ q3 b" k- v# Y* i
for i in range(len(fitvalue)):# G6 O( S4 @+ T0 D" ^' R
t = 0;
5 P. y# e+ m9 M: L" L j = 0;
& L6 [0 P6 L& L while(j <= i):
0 N" b) C. \( m( U5 ^# m0 l t += fitvalue[j]/ U# K( k$ z- N1 [
j = j + 1
6 ?7 `8 C$ a% d, i, A fitvalue = t;
: B& z+ p* H1 B8 ]5 A/ U9 V( J+ [# q( }: E7 X4 N
def selection(pop, fitvalue): #自然选择(轮盘赌算法)* e% P; r& D' D6 A( _# K" R# L) z
newfitvalue = []" q* M% L4 @; _5 B5 W5 }: V( T
totalfit = sum(fitvalue): n' P4 i" i) V. z7 a" n) B& S
for i in range(len(fitvalue)):
6 O; d3 A" U8 Y6 p newfitvalue.append(fitvalue / totalfit)8 e- Z8 C5 j- q6 q' D7 b7 @
cumsum(newfitvalue) ^2 h8 m8 K, c% |, q3 M
ms = [];0 O8 V& h8 G( z# k
poplen = len(pop)
8 a9 {% x* [" n9 v for i in range(poplen):
9 Q% ^4 i) A! W7 ^4 B ms.append(random.random()) #random float list ms
; Q! A, f T+ k ms.sort()6 P. o& e2 J& V8 m8 c
fitin = 0
3 c4 b1 \4 F# r0 l, u! p" T6 { newin = 0
- A* q& M- n8 @: N- e# B newpop = pop/ C# J: \4 J9 L
while newin < poplen:
8 T( q8 H) f" s9 [- r7 ^8 ^6 } if(ms[newin] < newfitvalue[fitin]):
& R! i- ]; X n l3 o newpop[newin] = pop[fitin]
# x: I# P8 t8 X# T/ y0 x newin = newin + 1
2 J. C( j, b& Y; [' M, B, [" ~ else:+ I2 V* s T2 T: M. ^# { ]4 V* @
fitin = fitin + 1
9 s2 @* H2 t; A. q pop = newpop
# @% y* ]6 ?0 f/ q! m8 pimport random' H; M" q1 b0 c
2 n. n. \; v+ H9 X9 \5 f1 Y
def crossover(pop, pc): #个体间交叉,实现基因交换
8 s: `7 p( V4 G& A" N. K8 z poplen = len(pop): B% {( X \- h5 K# j& p F+ O( F
for i in range(poplen - 1):
& b1 ~ q$ E2 U- K if(random.random() < pc):8 s p% a5 p. c9 q; S3 A. W
cpoint = random.randint(0,len(pop[0]))% u! I/ t% R$ l6 k% q' m
temp1 = []& a. h' O& R2 W% V8 T. ]- G0 N
temp2 = []
& n* \, r* {: |( g) h( v/ Q0 c2 T temp1.extend(pop[0 : cpoint]), U% ]# F* M1 d4 Y- M4 d
temp1.extend(pop[i+1][cpoint : len(pop)])& g" u Z% S. D* ]1 M- w t
temp2.extend(pop[i+1][0 : cpoint])
S+ z4 ~+ H# W4 w, L0 ~ temp2.extend(pop[cpoint : len(pop)])+ w7 {! t9 Y: p& x; m, B' P" {" H& h
pop = temp11 I: n; T) R/ q7 Q0 ]9 r
pop[i+1] = temp2
, Q% X. A6 n* Y. w! U( Nimport random
. x9 k" j) I B& V6 U( Y
' K1 q3 Q# [7 ?/ m4 I- x' Hdef mutation(pop, pm): #基因突变
. s2 q# {* W3 }- i4 i0 L6 ? px = len(pop)6 G$ h8 z, Z3 i
py = len(pop[0])
6 c4 N3 q* L" C# G
5 Q3 u( F8 z0 Q4 W0 G for i in range(px):( R+ G+ k; o1 Y( Y
if(random.random() < pm):
+ l5 }# I; W Q. B: _5 e mpoint = random.randint(0,py-1)
9 Y$ K4 x0 o) I" j5 V6 P; G if(pop[mpoint] == 1):3 b" t1 X( i" g% j, Q
pop[mpoint] = 0* Y! h, a5 `$ K+ R/ V+ F% ]
else:+ H1 v* o% `& D9 n3 W N
pop[mpoint] = 1: n4 k6 q) c- f% @3 K7 D
" _+ G: J! F+ J& z5 E' K$ \) [% a9 I
————————————————" q9 a7 G4 M0 g; J/ s8 c) d' p) g2 J
版权声明:本文为CSDN博主「simon-zhao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。4 |2 S, {5 X0 U5 `* Y$ M3 D
原文链接:https://blog.csdn.net/u010902721/article/details/23531359( H/ Y2 p+ O: S6 J& W
$ D4 T: z' \( \. b7 [. h% g3 ], b5 w. Y" s# G
|
zan
|