- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565365 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174832
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python实现的遗传算法实例(一)
/ Z* R) u& v) m7 J
2 B# ^2 f( M, c. |一、遗传算法介绍 O& I- k9 _/ C
0 k# } }1 B/ E- C% o3 e 遗传算法是通过模拟大自然中生物进化的历程,来解决问题的。大自然中一个种群经历过若干代的自然选择后,剩下的种群必定是适应环境的。把一个问题所有的解看做一个种群,经历过若干次的自然选择以后,剩下的解中是有问题的最优解的。当然,只能说有最优解的概率很大。这里,我们用遗传算法求一个函数的最大值。/ d( e9 h" i* f% _) P/ k
f(x) = 10 * sin( 5x ) + 7 * cos( 4x ), 0 <= x <= 100 ~ |" P0 Q* a; y8 l
% ]" L6 K& T; @) `4 o8 B- t3 F+ L" Y1、将自变量x进行编码$ r# [( B2 K9 }7 R
$ y) {# o& n% c& ^# j- A
取基因片段的长度为10, 则10位二进制位可以表示的范围是0到1023。基因与自变量转变的公式是x = b2d(individual) * 10 / 1023。构造初始的种群pop。每个个体的基因初始值是[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
3 u, G7 q; ~% x& i- ~7 y& R; r5 M4 A
2、计算目标函数值" l6 L7 S! { h! f3 y
) U5 F% F& r# Q: i. `) ]( o& O
根据自变量与基因的转化关系式,求出每个个体的基因对应的自变量,然后将自变量代入函数f(x),求出每个个体的目标函数值。3 b1 E% b% p9 y/ Z* Q" I+ @
; p; @( Z; ~9 p @' W, Z( `, J( F3、适应度函数
6 p& i. H) o& [: P, k: s
/ }" {. D% P; s* ]3 A; Z8 s 适应度函数是用来评估个体适应环境的能力,是进行自然选择的依据。本题的适应度函数直接将目标函数值中的负值变成0. 因为我们求的是最大值,所以要使目标函数值是负数的个体不适应环境,使其繁殖后代的能力为0.适应度函数的作用将在自然选择中体现。
4 L$ f* J" u. P( Q9 a3 l. Q/ d8 p; s, Z* t
4、自然选择
# w& a! V+ J8 l" Z
" q$ O' A& h0 o0 U' s" o: j* p自然选择的思想不再赘述,操作使用轮盘赌算法。其具体步骤:' |0 x6 d3 }' E0 y
( {2 o4 b8 O5 n/ K/ U假设种群中共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号个体拷贝到新种群中。自然选择的结果使种群更符合条件了。/ Z- ]: ?& k$ ]7 u1 \+ m
; q4 W: E }- s% Z1 O1 F! r6 x
5、繁殖3 _0 n+ F' ]1 A
5 C) X) m$ o( d l3 r假设个体a、b的基因是% Z: ]& E& S2 H( V! R' \# F2 S% n
" n/ p9 G9 S0 w" x1 da = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]+ t2 H! `" ]: t) g
" e. r/ c5 s8 N5 Pb = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]; B6 z; H8 o- A8 v! K
2 S+ F$ O4 T9 K+ Y" O( q这两个个体发生基因交换的概率pc = 0.6.如果要发生基因交换,则产生一个随机数point表示基因交换的位置,假设point = 4,则:4 P' U, E; ^* s/ M; W4 n d
* ^- a3 K W6 _$ l4 la = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]0 n' a% K7 v4 ^6 o( i
: b/ p- w3 y0 I3 L2 bb = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]5 Q; I3 _+ d" Y2 w, `! k
$ j% ~, x0 J+ d1 C6 c9 I交换后为:
% E- c! P. ]$ D6 e4 o3 ~2 w' s/ l% W2 c. F# f0 ^! @/ Y
a = [1, 0, 0, 0, 1, 0, 1, 1, 1, 1]* D# o5 n) S1 M+ l$ t8 e @
+ q/ g A/ \. L
b = [0, 0, 0, 1, 0, 1, 1, 1, 0, 0]
+ c; y" u6 d4 t1 @ B- ^6 k1 d1 _" m4 D& {* H
6、突变
, c5 K- {. H* r3 X. E) q3 U. I2 J& n5 S, Y; d2 F8 l9 P- _
遍历每一个个体,基因的每一位发生突变(0变为1,1变为0)的概率为0.001.突变可以增加解空间
3 R3 J) Y" N1 ~3 q8 X
: ]9 P. t7 ]& O, s* V( {7 ^/ K+ w$ X4 ?二、代码4 M! w* I8 t6 \' W
def b2d(b): #将二进制转化为十进制 x∈[0,10]
' O4 V1 W& [4 u8 t. { t = 0" R5 z' d: R) f6 a3 E( G0 C
for j in range(len(b)):" P% B* v" D) K6 g- y3 [
t += b[j] * (math.pow(2, j))8 P8 A2 C% I- W; [
t = t * 10 / 1023
4 j! Z% y& T0 r: f. t return t" u6 S- |9 w% A; d
' \* q- F& a0 ]& npopsize = 50 #种群的大小
( B0 o# i' S( g1 }#用遗传算法求函数最大值:
8 ~% E; y! B4 k" o! A7 B: u9 G! [7 @#f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]( }( W% L3 K# R& W2 U1 j* P
- P4 l4 [! \4 x+ _$ Nchromlength = 10 #基因片段的长度
9 q' S. h9 c3 |! B' Fpc = 0.6 #两个个体交叉的概率% ?1 K" d |! ]+ F6 a+ Z
pm = 0.001; #基因突变的概率
: s2 q$ v+ e4 }' z0 F Gresults = [[]]
3 v3 a- i' H+ o* Vbestindividual = []
9 p3 j$ O0 A( b- m) ~( zbestfit = 0
5 u' I+ i* y: ?6 ffitvalue = []" z0 O: j$ |& V1 I' G/ Q0 h3 w6 s
tempop = [[]]
( A( v' X" ?* J0 j$ Y2 \pop = [[0, 1, 0, 1, 0, 1, 0, 1, 0, 1] for i in range(popsize)]& M. e% A+ O6 o6 a7 c3 [0 |6 M
for i in range(100): #繁殖100代
+ F5 `/ I [0 z objvalue = calobjvalue(pop) #计算目标函数值
% i; ~8 w5 }/ K. [; b fitvalue = calfitvalue(objvalue); #计算个体的适应值
" ~6 R* p% H" @ [bestindividual, bestfit] = best(pop, fitvalue) #选出最好的个体和最好的函数值
% ~* p8 O% M& s6 y4 q" w( H& Q results.append([bestfit,b2d(bestindividual)]) #每次繁殖,将最好的结果记录下来# ?& a$ x) x) U) G: f0 v( l
selection(pop, fitvalue) #自然选择,淘汰掉一部分适应性低的个体
+ R, t' E5 v2 X y crossover(pop, pc) #交叉繁殖 V6 L' k8 o$ l( f& @! l
mutation(pop, pc) #基因突变
* z. d% T; b9 R7 q; y 1 o& Z+ j3 q$ o% M; J
/ A% ~5 b/ p3 t; d- Wresults.sort()
2 l' U0 ~* ]$ L8 Y9 u# F# A& Mprint(results[-1]) #打印函数最大值和对应的 U& t" f2 M" [, q: j: K, z
def calfitvalue(objvalue):#转化为适应值,目标函数值越大越好,负值淘汰。2 f$ b& D9 `' r; u- V7 f
fitvalue = []5 z- r6 X; T( S8 C, `
temp = 0.06 H2 |% v0 H5 e3 m. V
Cmin = 0;, f4 m/ Z; j" B* ~) ~( U# P: y8 K, P8 j
for i in range(len(objvalue)): ?' Y8 v' S2 H0 Y% p/ ~; i+ W6 ? @# W) W
if(objvalue + Cmin > 0):( E( j' w5 e# K& K, u" y: m: D5 q& M
temp = Cmin + objvalue- G1 ?0 Y5 ]( _
else:
6 r A5 k; `4 I# X temp = 0.0
" j& W' L6 b, Y5 b4 w" Y fitvalue.append(temp)
& p2 g7 u: @) g$ V+ [9 m return fitvalue7 l) p0 _; V' I- Z& B p
import math
3 R4 m: F5 R3 J( A( Y2 M e
- d$ A3 m! B. Sdef decodechrom(pop): #将种群的二进制基因转化为十进制(0,1023)
3 q/ y! f( z4 F/ C temp = [];8 y+ u' t0 q2 F3 L! s. \' w% ]
for i in range(len(pop)):( Y9 V" p8 `( ]; b; G0 g5 Y
t = 0;
/ j+ P4 ^* D2 _% E for j in range(10):
9 `; k& N$ t! Z2 U t# R3 p t += pop[j] * (math.pow(2, j)). n5 M* V4 u1 `8 `) |
temp.append(t)0 r! V# z3 h$ t# ?; [8 N% v5 a- S8 P
return temp
0 k( A/ o2 |- N* }5 o4 X4 W: S) g0 R8 G# `
def calobjvalue(pop): #计算目标函数值: F5 O7 l% f* V; J( B8 b
temp1 = [];
9 U5 ?. a& g2 l( T( p objvalue = [];5 E" d: O2 {4 m/ c) m( R8 y b' t# u
temp1 = decodechrom(pop)/ D" e/ s3 k. x' z4 n
for i in range(len(temp1)):$ L3 E$ d% F' H
x = temp1 * 10 / 1023 #(0,1023)转化为 (0,10)
/ l4 V: w' J( s& F: c$ b0 `) s objvalue.append(10 * math.sin(5 * x) + 7 * math.cos(4 * x))
2 e, E9 T! G& l& B t return objvalue #目标函数值objvalue[m] 与个体基因 pop[m] 对应
W9 f: G2 H/ P! hdef best(pop, fitvalue): #找出适应函数值中最大值,和对应的个体% z# d0 d9 C; \
px = len(pop)& G: L" H7 i7 w
bestindividual = []: s$ ]6 v6 M: |# Q
bestfit = fitvalue[0]
/ Q2 s2 [; b: [& m; ]) ~. p for i in range(1,px):
6 E; q z! W$ [0 H% V if(fitvalue > bestfit):
# j( g' i1 ?& H- j bestfit = fitvalue& q5 K6 d: o8 \1 w5 i# q
bestindividual = pop2 t: h8 D- o) R7 r
return [bestindividual, bestfit]
3 s! ~1 h7 g/ e! z8 Wimport random
" `, B% _( K( p) K# \4 R' H
6 T/ d/ S0 [" |' P" Fdef sum(fitvalue):5 z+ G4 [9 V' y. H
total = 0
4 d4 u5 }8 g) \/ G3 B: B for i in range(len(fitvalue)):( e! u4 s0 [0 v0 |3 H
total += fitvalue
8 `' x) w* ~7 ?: m$ ? return total
2 @/ c! w4 I, {5 ]1 a' X) M. w" K% K, v. n
def cumsum(fitvalue):
: j% B& J. U8 l" N, z/ E1 p' v for i in range(len(fitvalue)):
3 P8 I' @, e& n6 r, j3 } t = 0;
1 o; Q# e# r, p) J4 ]# `( [ j = 0;6 _# s$ d* b B5 N& _, o8 d
while(j <= i):, B( j( } V/ g" U( C: ` \
t += fitvalue[j]2 K: K) i9 j2 }! z
j = j + 1
: ^8 j7 `6 E% J) r* h fitvalue = t;
7 y4 P _- p4 b: ]! v' Q: g0 m1 Q/ @
2 j6 {- C2 D. r% ]" gdef selection(pop, fitvalue): #自然选择(轮盘赌算法)3 `; z( U/ |) d+ a9 V- b ^' _: F
newfitvalue = []
4 w" n1 q" i2 Z! ? totalfit = sum(fitvalue) q, ?+ z" t, [/ {: E8 t
for i in range(len(fitvalue)):
, |5 u; z+ g) A! A% H+ B newfitvalue.append(fitvalue / totalfit)
& V: T0 m7 o( Q cumsum(newfitvalue)$ C' m: }2 C: m @5 {' ]- B
ms = [];' D2 X3 p4 i3 n( ?. r8 l8 [
poplen = len(pop)! J6 i3 |7 V% d% K% f$ V/ |! U! I. g
for i in range(poplen):
* W, _/ g9 j5 U7 z" w ms.append(random.random()) #random float list ms
6 m; g! j6 J" c5 S9 Q, s ms.sort()5 Y- \" t9 C4 G, h7 _6 L. S
fitin = 04 x* @8 X1 C2 a
newin = 01 T2 X) I, p; Z& g+ \* U& s* p
newpop = pop4 F: e# y2 B/ d" V( H9 A$ o
while newin < poplen:
: C4 @9 Z" H, U, N* T if(ms[newin] < newfitvalue[fitin]):7 O c9 r/ a& ^3 l8 C: V) ^ W
newpop[newin] = pop[fitin]0 w/ u5 k; D; J0 z! W. [
newin = newin + 1
+ x$ A& ~6 m2 |) Z$ d9 e1 t8 G else:
/ I! i- L% k9 k* x8 P. j K fitin = fitin + 1! P* _+ u! Q5 S7 @
pop = newpop
/ u1 c1 b+ b! G4 Z, simport random
6 n/ F) d1 N( L# K3 Z% u3 z
2 j: v6 T/ x/ N/ Y+ c( M0 z6 q- ydef crossover(pop, pc): #个体间交叉,实现基因交换$ L$ J& p3 U/ u+ W' g. w
poplen = len(pop)/ p: c9 A% Z' L1 Y
for i in range(poplen - 1):
/ a2 F+ ]& r7 O if(random.random() < pc):
: m& N' w- Z- }5 N, a) e) l( I2 i cpoint = random.randint(0,len(pop[0]))
7 G) [8 a, _: D* T/ L, x8 |9 j temp1 = []
; z, J& p. {* }0 g temp2 = []9 {' V6 |, b$ ~
temp1.extend(pop[0 : cpoint])! x6 x1 O3 f% r4 {) |
temp1.extend(pop[i+1][cpoint : len(pop)])
. |% \; i, p/ a1 R0 n, v8 T( D' ` temp2.extend(pop[i+1][0 : cpoint])1 A" D: O8 Y2 g' V9 [( ` d( g
temp2.extend(pop[cpoint : len(pop)])
6 Q! D) q/ m- c3 n" | pop = temp1
# C" G/ C) F6 T: G& y1 F8 N pop[i+1] = temp2# P3 }7 P+ W- T
import random
2 |+ R# O0 `1 i. J( h: y
2 Z( l: p5 l; X+ N( A, Zdef mutation(pop, pm): #基因突变" V. |9 Y8 j S8 ^: v6 D$ }/ |
px = len(pop)+ t" q. s. n0 l# _) Z z- s$ d! w
py = len(pop[0])
) K+ D0 R3 r- t/ c8 h8 D& G& m$ V5 H" o
for i in range(px):- t0 E0 W0 E9 ~/ n, V9 R) I
if(random.random() < pm):4 q' Z+ _1 F3 Q& [8 a& X
mpoint = random.randint(0,py-1)+ _1 ]+ i$ j( p& Q! F1 a
if(pop[mpoint] == 1):
' O% e5 [% ]" c. E, f1 i8 t pop[mpoint] = 08 W2 n5 q- V8 E6 A/ C
else:# G2 L6 D/ r: B0 T2 F/ u
pop[mpoint] = 1% }0 o; S6 E h f
5 U! P( i7 ]; D ^
- r; C% b9 M" C————————————————: D- K% _7 G( E7 X6 f/ |0 ^
版权声明:本文为CSDN博主「simon-zhao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% _1 Z; L) J0 J: h4 ]
原文链接:https://blog.csdn.net/u010902721/article/details/23531359- W$ A: h/ R0 _, f
3 z8 c3 Y% n4 Z" Q$ Y* t, B
- L1 s" L4 u# G; s
|
zan
|