1 A- C2 _! N: h* Z遍历每一个个体,基因的每一位发生突变(0变为1,1变为0)的概率为0.001.突变可以增加解空间 [6 k a1 [4 j6 n 9 ^/ b6 Q# i" c# j( d二、代码; x( H* G$ B$ [8 u$ \
def b2d(b): #将二进制转化为十进制 x∈[0,10]2 L' k( `& ]; A: c
t = 09 x0 G! q% S8 @+ E2 @
for j in range(len(b)): 4 c* Y* U8 K5 E" a2 ` t += b[j] * (math.pow(2, j)). z9 f3 W% ~9 \) F" P. y
t = t * 10 / 1023/ u6 _( n3 t, u' z( {% K. ~5 \
return t7 k4 I5 R) ^, b# V. b- i) L) P0 c% j
6 U: K8 R7 U8 J7 a7 [
popsize = 50 #种群的大小0 h/ C1 r0 ]& B% _. {$ S) W
#用遗传算法求函数最大值:: M" J4 B3 |: I6 p ]& w( v' B/ y
#f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] - |% U, x+ ^1 f, l - U. r9 L) D$ C5 R( q0 F4 m- N I5 Dchromlength = 10 #基因片段的长度8 w7 ?% |% r* ?
pc = 0.6 #两个个体交叉的概率! Y* Y3 j I0 B6 s. M0 S3 M
pm = 0.001; #基因突变的概率7 ?( E" j8 K3 t* c" x! ]4 r% }
results = [[]] $ Y8 g6 @1 T, C1 ^bestindividual = [] * K, T& ?# N! L9 Ybestfit = 0 $ J' w9 [9 U }3 J/ i- Y# nfitvalue = [] 7 t8 n& S. P3 Ftempop = [[]] / p$ X- u; H X& n* I- t( R1 d Z' ?pop = [[0, 1, 0, 1, 0, 1, 0, 1, 0, 1] for i in range(popsize)] $ ^* v' C8 ?7 P: X, C$ F5 Gfor i in range(100): #繁殖100代: O) R% p. ]7 Z, d/ z6 V2 {( F
objvalue = calobjvalue(pop) #计算目标函数值% {2 @8 J K: ]8 L
fitvalue = calfitvalue(objvalue); #计算个体的适应值 h' A0 [' r% N3 ~! C5 v( [: d1 A: V [bestindividual, bestfit] = best(pop, fitvalue) #选出最好的个体和最好的函数值 `5 E7 O8 y8 r: b8 L results.append([bestfit,b2d(bestindividual)]) #每次繁殖,将最好的结果记录下来* m) s' r) D& V* W! j8 _4 x
selection(pop, fitvalue) #自然选择,淘汰掉一部分适应性低的个体4 w( H+ ~5 y- L9 I
crossover(pop, pc) #交叉繁殖 1 j# e* B1 g, N3 R( y9 _& M$ A* S mutation(pop, pc) #基因突变# {2 ^; s" V" u6 j" S9 C
1 o9 E7 w. @9 }
& C* |, Q0 V& n: N( @$ i9 O3 ~" hresults.sort() & d7 c8 V" Z. C. o M1 P/ Dprint(results[-1]) #打印函数最大值和对应的% h# |" w' a. \6 u
def calfitvalue(objvalue):#转化为适应值,目标函数值越大越好,负值淘汰。( S# t1 W( f1 e, y
fitvalue = []. C" y2 C) F; ?3 h0 {" W6 M7 U
temp = 0.03 B3 P; w$ S9 V6 O: l O
Cmin = 0; : |5 H2 A+ G8 k; o W% g for i in range(len(objvalue)):! [2 r D' N& c. M: b+ R
if(objvalue + Cmin > 0): 3 y3 h/ d- H) _" n; s1 X temp = Cmin + objvalue - x; m/ o. f( v8 N9 u+ R0 { else: * ^ S! ^, @$ U' _$ ?4 ? i temp = 0.00 ~4 V0 K% r9 {# z* |
fitvalue.append(temp)4 V( N# Q- i0 F0 O. E; N
return fitvalue 3 `2 P! {5 R, R; x0 ]import math8 _, { m Q" A; H
9 d/ D6 `% {( F- X' _# c$ c+ s* ]+ Udef decodechrom(pop): #将种群的二进制基因转化为十进制(0,1023); @9 w" U( `* l
temp = []; 2 d. w P+ U- x: B+ o; l6 E for i in range(len(pop)): 1 ?/ N/ L2 ^/ p5 J0 M5 t, y t = 0; 1 c7 {* I, c: y ?+ ?6 w* n. n' C. O9 m for j in range(10):" E! F# }& L5 X# D
t += pop[j] * (math.pow(2, j))( n) g K8 W: Y' G6 d
temp.append(t) 1 ?" Y8 W$ Q5 _, H* ~* e return temp! O; ^/ [& {9 g+ W/ p w, H$ D# h8 J
! x, x; _# Q" R9 L2 W; h& Tdef calobjvalue(pop): #计算目标函数值9 J# G" A- }: y
temp1 = [];5 t F# c" r9 ?) W6 O9 \ p! V
objvalue = [];9 ^3 {* I8 l* b. q6 b7 z
temp1 = decodechrom(pop)' a U! u* E+ W" Q. }: F; |
for i in range(len(temp1)): ' V* X5 [! [2 a% i: S x = temp1 * 10 / 1023 #(0,1023)转化为 (0,10)8 p# f, V4 l6 B# q! h$ g& L
objvalue.append(10 * math.sin(5 * x) + 7 * math.cos(4 * x))& k! S6 N0 m% H+ N4 O+ c# ^! [2 C
return objvalue #目标函数值objvalue[m] 与个体基因 pop[m] 对应 " B7 ?3 p/ Y9 _! q( o
def best(pop, fitvalue): #找出适应函数值中最大值,和对应的个体 ; I; D' @/ H, `/ X; L) p px = len(pop) 8 o ?: f) F4 _ bestindividual = []2 f9 ]5 u4 u( Y
bestfit = fitvalue[0]2 m' }8 k) I5 u; z9 z* H1 C
for i in range(1,px): 0 a$ l4 m6 s2 E( f. M8 {2 Y* N if(fitvalue > bestfit): % g( w" k+ M" O5 c$ T8 a. Q bestfit = fitvalue . J; P3 d+ R/ w4 k$ g bestindividual = pop2 m _* P& k7 U5 G
return [bestindividual, bestfit]. Y% u' F9 E' k/ P/ |% Y
import random/ w: {: _: f3 J {0 X" V5 A
% w7 n' Z, F: {8 \9 \
def sum(fitvalue):3 N' }& H" |3 y/ a0 k* @! C1 b
total = 0 ; j2 x; E$ Q& c1 U0 I* s* f6 a& u for i in range(len(fitvalue)):# l' `) f. S% V% D9 m
total += fitvalue ' |% ?4 G3 }- K% P! I H( C1 S return total& `: [+ O' c4 O6 E4 i
& x2 h1 T" @, y7 I; H6 S
def cumsum(fitvalue): ) L' g4 q; h3 O3 `% c9 Q for i in range(len(fitvalue)):0 Q) f9 O7 b; H! v- }
t = 0; ) L5 u5 G5 p4 n$ h j = 0; $ {0 A' ^4 N( j2 C while(j <= i):1 q1 ^" \ z% a a- M4 ^
t += fitvalue[j]: B8 i* N( c/ f: d2 L& {' n7 t Q
j = j + 1* J. k0 q0 W( _1 t0 W# `, D2 A6 F
fitvalue = t; : T! H% C; [% }, M# h# r C/ c- R ; P7 W# ~: q* R8 Y2 i. c% qdef selection(pop, fitvalue): #自然选择(轮盘赌算法) , Y x7 f- Q. l" c" j J) ` newfitvalue = [] % ^1 z: @$ ]- G0 p totalfit = sum(fitvalue): B4 r4 Q3 B% u3 B5 { T. g0 a1 h
for i in range(len(fitvalue)): & { t1 ^) _5 K, B' {( O newfitvalue.append(fitvalue / totalfit) 2 z( {4 {8 E& Z" o% A cumsum(newfitvalue)/ n4 [6 ^. J7 V5 g- O7 a$ g
ms = []; , q5 H2 w8 p2 f" N poplen = len(pop); K: F, l8 u8 \. \
for i in range(poplen): k( G. q1 [8 d: e* ]2 | K. n ms.append(random.random()) #random float list ms 1 d& T; g% U4 ~2 s+ C/ _+ |5 g ms.sort() & d2 v( ]6 @, [8 ?; J; S8 `0 J fitin = 09 W7 g* u1 `* F9 ]. H9 a: O- U/ R
newin = 06 O: h4 J$ G3 B% m$ A
newpop = pop 8 Z; ?* t" R; S( b. e" X while newin < poplen:6 g0 C$ j0 a5 c2 u) @/ c
if(ms[newin] < newfitvalue[fitin]):" j! D' b* q: ~& `& X: F2 e
newpop[newin] = pop[fitin] - m: N' l" F1 n$ E' o2 D newin = newin + 13 Q j. m: Z# h0 a% ?9 C
else: 5 V% g+ s. P. y' f4 x6 B- B9 u fitin = fitin + 1 ! ]% P, o# S* x: F* ]7 N' P pop = newpop7 ` }! s) D$ m1 p/ j( w
import random % `: f3 J9 z' E( ?& y: E) M0 u' q
def crossover(pop, pc): #个体间交叉,实现基因交换 + F& Y1 @: k u$ ?; @ poplen = len(pop)- L9 S) e. @: H% L* x
for i in range(poplen - 1): - r% ~2 _, |8 o6 q* Y if(random.random() < pc):- \+ ]' q( B# w- X$ _' m9 l5 y0 v# K
cpoint = random.randint(0,len(pop[0])). \5 h) h/ S5 _+ j1 V* m9 X
temp1 = [] * K9 z( g0 H. w( q( O% W0 w temp2 = []; {7 k: Y; l) p% W% p5 n$ E4 L
temp1.extend(pop[0 : cpoint])0 U* w8 ? D) z+ I4 ~
temp1.extend(pop[i+1][cpoint : len(pop)])0 o' b n& m* b+ H+ n/ f6 N2 s
temp2.extend(pop[i+1][0 : cpoint])4 [% I! ]* ]8 J) l9 D1 |
temp2.extend(pop[cpoint : len(pop)]) 5 Q$ x- b# q7 q/ N pop = temp1 + r4 d+ J! F% C! l* ~; [ pop[i+1] = temp24 s8 |' s- M c$ y
import random% y7 \( T% |, v# [2 J
# `" j; D/ C% `3 L' @! V
def mutation(pop, pm): #基因突变 0 i% s' a2 W, ^ px = len(pop)- P( q4 Y2 H+ J5 v) ^) G( O1 F
py = len(pop[0]) $ f9 C- w0 S. S4 B+ a$ R8 N% M/ H) L C: M% @/ I% B o$ ~3 t3 A
for i in range(px): " J2 c9 l! z6 b- X if(random.random() < pm):- ^$ K: B4 z, j F
mpoint = random.randint(0,py-1) 7 g$ h" S* i$ G2 H& a7 N8 h# P if(pop[mpoint] == 1): . G5 U1 z% j3 w$ E* ] pop[mpoint] = 0* ~! H7 u6 d1 }/ _9 ]
else: 4 h5 m, A5 M; p9 I2 L pop[mpoint] = 1 # e/ D5 s- P$ f+ r- J3 {# a4 P2 k1 A
7 H! o: }/ O. z) M5 b+ }———————————————— $ S# }/ T, O# n6 |$ ?, a版权声明:本文为CSDN博主「simon-zhao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 6 i+ K; ~. b, V# P8 k! o, h+ b2 ^原文链接:https://blog.csdn.net/u010902721/article/details/23531359 8 D) R0 K& i0 m @* R2 @. {2 l4 Y# X4 C o
1 S I5 Q" ?4 |( f) L% o