QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5973|回复: 0
打印 上一主题 下一主题

python实现的遗传算法实例(一)

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-5-9 14:48 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    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
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-7-18 12:43 , Processed in 0.387415 second(s), 51 queries .

    回顶部