- I$ x6 o* W5 `4 M: e1 h! ^- I6、突变 8 b! n2 N) b+ w0 i% C, x o" `5 Y% F* |
遍历每一个个体,基因的每一位发生突变(0变为1,1变为0)的概率为0.001.突变可以增加解空间 7 q* Q: F+ {7 o6 f9 J5 P* M' s2 k! D& m9 c: F8 e4 M. S
二、代码" Q3 [' l2 `" }. V$ A; ^+ L- i
def b2d(b): #将二进制转化为十进制 x∈[0,10]+ [2 ]1 l- }1 ?& v4 @# \
t = 04 _" u$ a) V$ h# u& b* |
for j in range(len(b)):/ O/ Z- l) ?+ I9 D% P; k8 e
t += b[j] * (math.pow(2, j)) 9 u# ?! P- u! g t = t * 10 / 1023 ( ~$ `8 ^9 B. B8 j; ?+ c# s; | return t" _. m7 i) e# m9 I4 e
: \. _/ \+ p8 H u5 y( C/ Rpopsize = 50 #种群的大小- J5 E2 X% W5 i) p% p
#用遗传算法求函数最大值:9 P9 F* e$ [* Q! h- J
#f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] 2 z2 O/ A' P* R4 u% d" I8 o+ b - X- f6 ]0 D6 mchromlength = 10 #基因片段的长度 1 ?/ ^3 V w7 W+ p. zpc = 0.6 #两个个体交叉的概率 " I1 n& S' i# r( l7 |3 E0 L1 q, apm = 0.001; #基因突变的概率 3 p8 _, u! z+ Aresults = [[]]+ m% b. d* ^0 H" S, Q; j& r
bestindividual = []* q- d% \! w0 X
bestfit = 0" l7 t# _7 H q2 [+ Y6 y
fitvalue = [] ; f% _ V4 p0 O4 b3 I' Jtempop = [[]]; p7 G( |& R( y
pop = [[0, 1, 0, 1, 0, 1, 0, 1, 0, 1] for i in range(popsize)] # V) B- Q) \9 p( vfor i in range(100): #繁殖100代/ M, [2 P, w0 [' W# E" `
objvalue = calobjvalue(pop) #计算目标函数值 # r& {9 E8 f4 h+ ?3 u fitvalue = calfitvalue(objvalue); #计算个体的适应值 ' n! Y, Y! J3 b# s [bestindividual, bestfit] = best(pop, fitvalue) #选出最好的个体和最好的函数值9 q3 }- E) u5 ?$ w+ I8 A) ?
results.append([bestfit,b2d(bestindividual)]) #每次繁殖,将最好的结果记录下来5 Y- P3 a+ ~, F! b
selection(pop, fitvalue) #自然选择,淘汰掉一部分适应性低的个体/ U5 W! v3 ^- f/ s2 M0 N) W
crossover(pop, pc) #交叉繁殖& Z: y: w1 v1 t) s
mutation(pop, pc) #基因突变 $ d d1 m9 J j, ]6 ?+ n$ v * l0 Y, _0 W; J% y3 K2 w o
- J7 j/ x4 t+ L, \# H1 Y3 Z
results.sort() ' [! j* A# g9 F4 W6 ?+ B" C. yprint(results[-1]) #打印函数最大值和对应的) { ?% w& X0 v/ q" Y( p3 \" E
def calfitvalue(objvalue):#转化为适应值,目标函数值越大越好,负值淘汰。 4 @* }( u$ {" a5 x+ f+ k% T9 \ g fitvalue = [] & w, [" A: H1 @) S3 X i# }6 @ temp = 0.0 # a! @% v$ t8 [+ e0 I0 ~/ H Cmin = 0; * r, @6 A& P8 i. U! P) F3 U! V. w for i in range(len(objvalue)): % j+ T. x; ]+ I5 i if(objvalue + Cmin > 0): ; J" f: a2 G) d temp = Cmin + objvalue9 x7 c$ \( g3 \ y4 c' f
else: ! W; ~/ ]- L$ e t1 Z temp = 0.0+ U I! U3 o( x/ R8 b' P
fitvalue.append(temp) ( ?* z# @: V! l; y- K: O: ?7 [ return fitvalue R% |1 B7 u2 b; n) Fimport math7 G: A& ?, r: {5 A# T
% \2 M" p* L& L/ r7 `def decodechrom(pop): #将种群的二进制基因转化为十进制(0,1023) ; Z. m% K& C1 w# f* C+ I temp = []; 1 m. \& [/ @' w$ R- T for i in range(len(pop)):& }) B8 w1 P* K# F( T
t = 0; s6 x" V s! l# g
for j in range(10):3 U2 c3 Q# u) P' C2 k
t += pop[j] * (math.pow(2, j))/ X+ q5 |/ {1 f
temp.append(t) 8 U: f) D. V5 q% L* t" K return temp5 w; _( _+ h3 y" t' s
* O. [5 I5 K8 ]0 \3 U1 Y! }- Qdef calobjvalue(pop): #计算目标函数值 9 X. k- V- d: H+ l& h8 H) k6 K9 z temp1 = []; |5 e H! a/ _7 q* A# o3 N; f
objvalue = [];" g2 H" m1 t3 X, C. H* v
temp1 = decodechrom(pop) " x* J* ]; h% o* d for i in range(len(temp1)):5 ?9 } O, g* `7 R1 B0 m
x = temp1 * 10 / 1023 #(0,1023)转化为 (0,10)0 W. \- E- a* Q
objvalue.append(10 * math.sin(5 * x) + 7 * math.cos(4 * x)) $ a+ H/ Z, I8 c; a/ ?4 L: | return objvalue #目标函数值objvalue[m] 与个体基因 pop[m] 对应 " j ~- \7 A o( D7 }6 G$ Mdef best(pop, fitvalue): #找出适应函数值中最大值,和对应的个体 7 L) o, Z$ F8 v( [% Q0 M px = len(pop) 5 ~5 i8 n. o. u- l, [; V1 h bestindividual = [] b- g3 S+ _: y8 l% `: i S bestfit = fitvalue[0]; k, c+ K* g0 W
for i in range(1,px):! S/ E' S; T9 E
if(fitvalue > bestfit):% M- |) N5 }; {
bestfit = fitvalue( O' U$ a4 _# t; V) U. V/ R" m( _
bestindividual = pop+ [: q! U! m3 ~" k9 {5 I6 u9 n
return [bestindividual, bestfit]2 q3 m9 X% T9 ^( [& I! T* w
import random + s6 {( f, m! x0 F' p* M $ w% z5 J0 Y- a4 ^& ]def sum(fitvalue): 8 {3 C& ]; e I, q |3 J total = 0! |, T8 L# _0 j
for i in range(len(fitvalue)):+ e* q: }) I% |. ]# v( L
total += fitvalue7 V2 }0 v7 |: H' j: ^/ K
return total5 [# @. c5 a% h& Y$ e; {; @
. m; R" g" D7 h/ f' r) I$ o7 z- _def cumsum(fitvalue):: [) j6 w z7 T! T& d
for i in range(len(fitvalue)):' g* ?! e7 f: H- c* \
t = 0; ]2 ^) `3 A0 J
j = 0;+ a4 Q# v+ q# W' q' c( T' s
while(j <= i): % R O: m1 r6 o* Q8 q t += fitvalue[j]; q9 e$ L- I9 S
j = j + 1 ! x% U# g* \6 f# X! k fitvalue = t;# J( i" M" `/ O/ o( l
3 R- ?+ B9 T% E# [, \
def selection(pop, fitvalue): #自然选择(轮盘赌算法)' `( {1 g9 [- T/ V v* ]) l
newfitvalue = [] - [6 c) K4 m3 | totalfit = sum(fitvalue) ! v& g5 T; q" d& I6 C3 b for i in range(len(fitvalue)): $ B! ]; C8 L, z: I newfitvalue.append(fitvalue / totalfit) 8 K- m( [4 O! }5 L2 t1 u, e }9 i cumsum(newfitvalue)1 @ z5 e- w! n D! O
ms = [];3 o2 h! w$ i1 {% w
poplen = len(pop)% @- v4 ^# }5 N9 l9 h) Z
for i in range(poplen): ' _0 O3 G/ x- G- ~ ms.append(random.random()) #random float list ms3 ?* i( J$ P$ a! Q* g" S
ms.sort() 4 G( s1 h3 a$ N6 I+ f6 h# G8 x fitin = 0 . S% D \1 e) ]7 u! @4 |- z newin = 09 C: S7 D Q5 |% U5 p2 S) O5 c
newpop = pop ; {* m0 k5 U9 k: m$ u3 I while newin < poplen: 6 n9 u( g* P: I if(ms[newin] < newfitvalue[fitin]):6 @4 k) [: b) j- Y1 a. z
newpop[newin] = pop[fitin], [/ {/ T: ^- m" U, Z" j
newin = newin + 1 " f4 r7 G8 I, e' K+ O( s5 `# d else: * V7 J9 m) L- W* o1 _ fitin = fitin + 1% e. X% `9 \0 [
pop = newpop4 ?9 ^& G- D; m2 n( G4 @
import random , ], Y6 m% ]3 Q; e8 Q7 ^6 o) S/ q$ c* M0 C, G2 M# B2 Q
def crossover(pop, pc): #个体间交叉,实现基因交换# P2 }7 e2 ?! |% N; c- ~1 M& N
poplen = len(pop)$ A+ ~: c5 v. ~! F# s
for i in range(poplen - 1): 2 J, N7 J. k- ^5 N7 ]2 e if(random.random() < pc): : N N/ `: |, z9 H }1 W( C$ u& ` cpoint = random.randint(0,len(pop[0]))& d: y C7 C7 i
temp1 = []. W/ m i5 O& R* {
temp2 = [] ; `; g& ?4 r9 r7 d temp1.extend(pop[0 : cpoint]) , e- O/ Q% E6 }. A temp1.extend(pop[i+1][cpoint : len(pop)]) 6 ?2 g& E' X. A2 `" H5 O( a& g temp2.extend(pop[i+1][0 : cpoint])+ c, ]# Q- o7 v
temp2.extend(pop[cpoint : len(pop)]) ; j( V& a# t. q: q+ w0 s; V; x pop = temp1 3 U0 _' L, ^7 I+ K% |7 ^0 c( n: h pop[i+1] = temp2 # E% ?& E( @5 e6 Y0 Uimport random U- ? C& b5 F; G
6 N! P- a8 A( S/ P* U
def mutation(pop, pm): #基因突变 + I4 B- Q' q1 [- D/ S px = len(pop)5 ^5 ?8 h: ^2 f( [ `, D
py = len(pop[0])( s7 ^$ q- p3 f' L
# B+ H; X: ]" v for i in range(px): ) v: X- ~' n* V. n6 y8 ]' \& a if(random.random() < pm):; K+ M& r0 ^$ K; q- z: c, P
mpoint = random.randint(0,py-1)! q6 V$ t+ W1 h& @/ A/ Q
if(pop[mpoint] == 1):6 b- u1 m R9 u
pop[mpoint] = 0+ j% V& E; m4 {5 A6 W
else: # I2 u% C/ v, W9 Y+ j0 O7 {1 h( p pop[mpoint] = 1: v& K3 K4 J' w: u5 F6 k
" y+ Z, J) k( O a9 |& H% ]& d - x9 _% ?- G2 G% c/ Q———————————————— $ Z( A/ ?, _. i6 B+ @8 I$ X# J( |版权声明:本文为CSDN博主「simon-zhao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 X( c6 N& O0 {3 ~! ]1 k
原文链接:https://blog.csdn.net/u010902721/article/details/235313590 j& ^4 D5 b$ ? X2 v4 L
7 n# D) o' O' p& b H. L, E