- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558925 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 173050
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python实现的遗传算法实例(一)8 ~' k( W& q; _: U. `
( z( X8 y, ?( ~: u/ _8 h$ \一、遗传算法介绍. c6 ?9 _- A8 l; y. V/ i9 c
. A- y& ?9 ` s/ _ 遗传算法是通过模拟大自然中生物进化的历程,来解决问题的。大自然中一个种群经历过若干代的自然选择后,剩下的种群必定是适应环境的。把一个问题所有的解看做一个种群,经历过若干次的自然选择以后,剩下的解中是有问题的最优解的。当然,只能说有最优解的概率很大。这里,我们用遗传算法求一个函数的最大值。7 q9 h. V4 ~: J
f(x) = 10 * sin( 5x ) + 7 * cos( 4x ), 0 <= x <= 101 U7 n2 f" H8 W7 R
U/ L* x4 }1 B
1、将自变量x进行编码; K! f) r: r# I8 e8 n$ I
. f8 r6 l9 L ^% J6 M _8 s
取基因片段的长度为10, 则10位二进制位可以表示的范围是0到1023。基因与自变量转变的公式是x = b2d(individual) * 10 / 1023。构造初始的种群pop。每个个体的基因初始值是[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
5 t. @0 F- {2 O' i( W
6 i. ]0 R- W, y# q3 F2、计算目标函数值
0 x5 G. e) [- @! E/ K+ `
* M& s O6 `/ R' W 根据自变量与基因的转化关系式,求出每个个体的基因对应的自变量,然后将自变量代入函数f(x),求出每个个体的目标函数值。6 G+ z- D- m, ^7 J m
4 P5 c0 M' s2 E' w3 E3、适应度函数
+ U3 r; o9 m; L Y! _
# ?3 D- |4 `) V5 Z+ c( j 适应度函数是用来评估个体适应环境的能力,是进行自然选择的依据。本题的适应度函数直接将目标函数值中的负值变成0. 因为我们求的是最大值,所以要使目标函数值是负数的个体不适应环境,使其繁殖后代的能力为0.适应度函数的作用将在自然选择中体现。
3 R8 ?0 [/ _' ]' k. V9 \- ?/ ]9 ?( T# p# c' X
4、自然选择
; b( a* |: s0 _2 H8 p2 m- `% D
: u! S7 ~* ^4 p) k: T& l" L自然选择的思想不再赘述,操作使用轮盘赌算法。其具体步骤:
2 E) F3 ^; G6 ^# G2 h& C7 Z* F
. Y& J4 |/ `9 Y( j假设种群中共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号个体拷贝到新种群中。自然选择的结果使种群更符合条件了。) o* d& @6 R; `8 _# U
2 ^* O: s8 v+ E$ U9 P: I& n5、繁殖' M9 X7 J3 P, q' q9 g9 @0 `" _5 M
9 ^" D% Q% b7 d0 B3 ^假设个体a、b的基因是
! q$ D; j% L. d q. Q4 ^, A' O" E, w0 R4 M9 Q
a = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]7 }4 H' l9 d* R5 e
. i+ H" A/ b; d; x! R% b
b = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]
1 L6 ~5 b5 H. b _$ G$ }
9 l$ {1 A9 k, Z9 z- v0 c0 a5 m这两个个体发生基因交换的概率pc = 0.6.如果要发生基因交换,则产生一个随机数point表示基因交换的位置,假设point = 4,则:! J' W) ~. D& b& M" r: H
/ h, S0 O3 f, Q+ ^! \5 Ua = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]
! u7 |# x9 Z" \5 y
/ o( B5 S2 N. M0 ob = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]2 }4 C0 t. e5 w; R0 U! w( w
8 r3 U, }/ s; k2 I1 ]- P& c1 E
交换后为:, b0 k+ x9 i1 L1 ]+ p$ ~- [4 [
& J* C! s& _6 H! @7 V+ |a = [1, 0, 0, 0, 1, 0, 1, 1, 1, 1]
9 D& z! s4 R8 V* `3 A D k$ m8 z6 j
b = [0, 0, 0, 1, 0, 1, 1, 1, 0, 0]
9 y& N; A$ }8 q- d2 W3 x& n* E: u# ^4 \4 Y/ S: \
6、突变
' O, Z F+ o4 g$ v
# d( k, t" I- c0 U4 U' a2 t0 j' R遍历每一个个体,基因的每一位发生突变(0变为1,1变为0)的概率为0.001.突变可以增加解空间
0 ]% f* f+ P3 C; F2 h* J: ~. V) [5 i9 e9 X# Y" [, F" c# L6 a5 ]: S: \
二、代码
+ Q* S/ ~1 o3 J, _/ s1 c$ S6 ]! rdef b2d(b): #将二进制转化为十进制 x∈[0,10]* z- d! ?8 d/ Y) \: d8 Y. o
t = 0
6 g, @, E" k' r4 F. u4 R2 H3 C7 J for j in range(len(b)):6 R6 T1 D/ E% r7 [; U
t += b[j] * (math.pow(2, j))6 K; |' H- d1 [/ n* |8 _
t = t * 10 / 10231 W' v! `6 S6 l6 V2 p
return t
2 B7 K- Z" D: X/ x
& a% v' ~- F- K3 vpopsize = 50 #种群的大小
* I2 Q( ]/ h8 x; k+ {* T0 C#用遗传算法求函数最大值:
, I$ ]4 }8 E7 S& a! |#f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]
: `6 T* @ ^/ h4 k- \$ i. o# k0 G0 s& P+ X8 C M, j/ C% I. o+ `
chromlength = 10 #基因片段的长度' W' Z7 u# S% G3 e
pc = 0.6 #两个个体交叉的概率
0 w9 } l; C: m2 z; bpm = 0.001; #基因突变的概率$ j' b; T4 L1 J4 {8 r
results = [[]]
8 K! k0 e& E- Ubestindividual = []$ g1 [3 V u6 b! w& @3 F1 I, L
bestfit = 0
! Q4 `& z0 Y. [# g, Jfitvalue = []* _' ]" T( U h6 m" g* t! L
tempop = [[]]1 G. H! m. d) Q/ }4 A6 B/ D" }
pop = [[0, 1, 0, 1, 0, 1, 0, 1, 0, 1] for i in range(popsize)]
( W3 U$ |. A7 k/ Qfor i in range(100): #繁殖100代
( _2 f2 K: u6 X objvalue = calobjvalue(pop) #计算目标函数值6 L3 K% m+ z- a9 f2 r( E
fitvalue = calfitvalue(objvalue); #计算个体的适应值2 p2 n; Y1 B5 l9 y" t7 F
[bestindividual, bestfit] = best(pop, fitvalue) #选出最好的个体和最好的函数值
p3 {3 _0 x9 H* r results.append([bestfit,b2d(bestindividual)]) #每次繁殖,将最好的结果记录下来% y6 I0 \+ ^! P( o. Z; V: ^
selection(pop, fitvalue) #自然选择,淘汰掉一部分适应性低的个体# H* g4 f0 P4 R! v0 f
crossover(pop, pc) #交叉繁殖
4 j. u3 h W' }+ c" y7 t, \7 u mutation(pop, pc) #基因突变
7 f" n7 G3 M; m7 Z - W& @/ a4 B. I
) h2 w6 B$ c1 Y7 F3 B: wresults.sort()
3 t6 i6 b) K+ x4 X8 y4 aprint(results[-1]) #打印函数最大值和对应的
5 k/ I7 K6 F( \0 ^def calfitvalue(objvalue):#转化为适应值,目标函数值越大越好,负值淘汰。) O( g$ J" f9 Z5 c% H
fitvalue = []
) n" f$ s% L% h( B& M: b temp = 0.0. G# R% x( O8 {& _) |# v9 `
Cmin = 0;6 x4 S, \. w! q1 w- l4 v) v
for i in range(len(objvalue)):
$ i& T D; s' y3 _ if(objvalue + Cmin > 0):
1 k @6 U) a7 ?, o* L" j temp = Cmin + objvalue- b. C1 t9 X6 @/ |
else:
3 ^( Q/ H9 a$ A$ S3 s temp = 0.04 ~2 [+ Q, Q7 ]* K9 b1 D: A
fitvalue.append(temp): u! G+ t: Q3 n; v- B& S
return fitvalue1 Z/ w8 F$ s2 G
import math N" @4 h& ^2 j# D2 F( R0 i0 [# b
7 I) _$ f5 e* ^def decodechrom(pop): #将种群的二进制基因转化为十进制(0,1023)0 w! Q6 b+ R/ d
temp = [];% G, L4 z7 l( t8 d1 A6 Y
for i in range(len(pop)):
9 ?$ W! B3 E6 K' C5 X" D- `2 i1 w t = 0;! F, N6 E7 J3 S2 ]1 f+ w
for j in range(10):
; ~$ F5 M1 C; h# G) t% h0 Y t += pop[j] * (math.pow(2, j))$ o5 B. n6 R' I V& i* K
temp.append(t)! {& Y0 g* ?- ^* {9 @* q; [
return temp
( Q9 A6 H; m( n. |& |: c8 W0 H( p
5 h+ F. ]4 E3 R8 Mdef calobjvalue(pop): #计算目标函数值
3 {5 k6 P. E+ s: I0 z) O temp1 = [];
3 T' c7 O% {/ { objvalue = [];4 n) A( R# ^3 p, K
temp1 = decodechrom(pop)
4 f9 }+ ~) U: N/ u: c2 ^ for i in range(len(temp1)):
4 C! D5 d/ ]2 O x = temp1 * 10 / 1023 #(0,1023)转化为 (0,10)
5 ^6 S( | F* l objvalue.append(10 * math.sin(5 * x) + 7 * math.cos(4 * x))
5 {$ c. I P- e& e3 p) l return objvalue #目标函数值objvalue[m] 与个体基因 pop[m] 对应 $ z; o# Z% P& I8 k a0 v
def best(pop, fitvalue): #找出适应函数值中最大值,和对应的个体6 q7 r- P$ T: q" v t
px = len(pop)
2 c+ R) \' R( z4 { bestindividual = []9 R/ e/ p$ e b" s% O5 r! P2 Q! m1 l
bestfit = fitvalue[0]
& F% x; g4 r& w9 z) N( y3 U for i in range(1,px):
) v* @7 S7 O* a1 Y" A3 R: d if(fitvalue > bestfit):$ P7 `# \% R4 n, l
bestfit = fitvalue1 x; S) n$ g9 a$ p
bestindividual = pop/ d( f4 {- E" H: w
return [bestindividual, bestfit]
* n# [' t4 e4 p! `7 |0 Pimport random
& g, a o$ K! R9 A
6 V) b, y2 I" _% qdef sum(fitvalue):, l7 Y* z1 e. P
total = 0
+ f' d: n. c8 [6 e) L( V5 T, D! l for i in range(len(fitvalue)):' X8 a6 i _& j' ~4 b& V' d+ I8 a
total += fitvalue
" u6 I; j' S9 R4 Y3 h4 _ V return total/ P6 n5 P( |, t7 m* |1 ]0 {
5 p5 C( H5 {" Q; O
def cumsum(fitvalue):
- y1 `+ W2 O1 x) ]5 l0 t for i in range(len(fitvalue)):% q) n3 U$ l1 g5 i
t = 0;0 }" ~2 N% g# I9 W8 g% t
j = 0;& D* u/ T8 r. z4 a2 u" O) q
while(j <= i):7 n _4 ?- N) e
t += fitvalue[j], c9 s9 D) x# l6 y/ C
j = j + 1; \8 S, N5 \( \3 Z
fitvalue = t;
9 W. K8 L9 T. n; |% v
. w$ s6 e; [9 s9 f! @4 T/ Udef selection(pop, fitvalue): #自然选择(轮盘赌算法)3 I0 E8 t* f/ A9 ]
newfitvalue = []3 W/ @: z4 P+ l9 ?; t7 A
totalfit = sum(fitvalue)
- Z5 _4 r+ M* D& a! F for i in range(len(fitvalue)):
" M1 |7 V2 _1 A* [7 F newfitvalue.append(fitvalue / totalfit)/ w" e/ i' e: e, S' Q. Y
cumsum(newfitvalue)3 Q! C2 j! ?0 u4 C6 r
ms = [];2 q* N9 Z/ Q9 T& l/ c- K8 x; ]# S
poplen = len(pop)* k% G% ~% i6 Z5 Y: @, C3 @$ t
for i in range(poplen): ~% {* ~# @" [% G% k& L
ms.append(random.random()) #random float list ms
) l! q- h6 M2 C p% }$ y ms.sort()
; W s9 o- r( ~3 b0 A% p! r fitin = 0
( j9 J8 O# ]# ^, V8 E4 A) F newin = 0
/ Y% Q! I I& `$ F newpop = pop
# g# A" y1 K: g5 C# Q while newin < poplen:6 ~, k3 e1 n. T
if(ms[newin] < newfitvalue[fitin]):% i5 L6 V7 S4 r" T5 I# E: V' T$ N
newpop[newin] = pop[fitin]
/ N/ r2 W* W" ^8 q newin = newin + 1! Y6 C7 j7 p, `6 G: ?& |
else:
1 D) G w8 t1 x7 W) q' {: Y `( P fitin = fitin + 1
3 Q! ]5 m" S: @* [6 v0 N; | pop = newpop% }) c# _4 \ u' r" h7 r
import random; S% V% W: `6 W; h. n0 O; z
, x9 P3 R. N: h" J
def crossover(pop, pc): #个体间交叉,实现基因交换
9 y' p+ b6 g; `1 x& T poplen = len(pop)# f- q4 T- C% e3 C S
for i in range(poplen - 1):$ U. l* j+ O& a9 t3 g6 \; ^6 F
if(random.random() < pc):
8 L- N% ~7 S* _" p+ i. i3 K cpoint = random.randint(0,len(pop[0]))
% l6 m" ~9 g' G0 ] temp1 = []
' `. \# }. R2 S/ i O temp2 = []4 y/ V" H2 ^' G7 Q; ^" q/ M, v2 F% M
temp1.extend(pop[0 : cpoint])
: m2 Z! s9 i( V) p/ X9 g$ [ temp1.extend(pop[i+1][cpoint : len(pop)])" t# F. t, _, A7 v
temp2.extend(pop[i+1][0 : cpoint])* Y0 b/ W+ o; b5 E0 @& m6 I0 J
temp2.extend(pop[cpoint : len(pop)])
8 k3 `( h; o! k' r- h4 ^ pop = temp1 t' ^3 c4 f4 j0 d. X( Q
pop[i+1] = temp2
- ~; |' l( G9 H% J% I3 S+ {% R2 Iimport random' D/ u; C( G1 k) x' f+ ?1 Z# F
! A- U! D2 t3 t1 A; p4 }5 Ddef mutation(pop, pm): #基因突变
- O! ]1 v n/ t" T. Z- { px = len(pop)
' }7 ?6 B: _( n) ]. e! Y py = len(pop[0])
5 x; G) d+ T( Y# c5 S/ G1 d# X$ ]3 D- |- n- h
for i in range(px):
) I8 T; u" m* p/ U, g# x if(random.random() < pm):- a- m- m& _) r9 y% ?
mpoint = random.randint(0,py-1)
( p$ q: A; \, {9 Y% G if(pop[mpoint] == 1):* D8 R {" ^1 w3 D8 M" C5 o
pop[mpoint] = 0
# }9 m; @; q$ A E$ k1 t0 Q else:9 U) f1 _9 j( I0 ]3 Y
pop[mpoint] = 1, u9 a% c+ O+ e% ]& X
$ o7 D. i$ N) u$ {2 i% v
; w C/ f- D6 X1 m————————————————+ ?" c2 g- H, f- |# T
版权声明:本文为CSDN博主「simon-zhao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( |$ k1 l3 U) M/ m& E
原文链接:https://blog.csdn.net/u010902721/article/details/23531359# d& n& l, H6 f; C8 _* U0 O
# G; ~1 U% I) i A, K) i' S+ b+ `% l1 D' F
|
zan
|