QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5995|回复: 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实现的遗传算法实例(一)/ F; y( _# H  k5 x& w6 z$ F$ B" V

    ; c5 `% g" z; S- u( ^6 n" i一、遗传算法介绍9 O$ Y, g6 ~7 Y& e( b

    7 R  G- b; m9 h( P7 q- x        遗传算法是通过模拟大自然中生物进化的历程,来解决问题的。大自然中一个种群经历过若干代的自然选择后,剩下的种群必定是适应环境的。把一个问题所有的解看做一个种群,经历过若干次的自然选择以后,剩下的解中是有问题的最优解的。当然,只能说有最优解的概率很大。这里,我们用遗传算法求一个函数的最大值。
    ; a1 @, X9 y, O) i: x        f(x) = 10 * sin( 5x ) + 7 * cos( 4x ),    0 <=  x <= 104 w6 q/ e, J2 k2 h) [

    ) j8 Z$ @* E- r7 t6 Z$ ]1、将自变量x进行编码
    9 @& {- _; f- f' F4 C5 M! o3 F& u% O4 d
          取基因片段的长度为10, 则10位二进制位可以表示的范围是0到1023。基因与自变量转变的公式是x = b2d(individual) * 10 / 1023。构造初始的种群pop。每个个体的基因初始值是[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
    ) h1 O1 q! T% p, K; \& V4 j  |+ q: J* r
    2、计算目标函数值
    % l  s3 `" Z6 b; C  }) Y
    , ~; `6 x# G; P0 `9 b      根据自变量与基因的转化关系式,求出每个个体的基因对应的自变量,然后将自变量代入函数f(x),求出每个个体的目标函数值。
    ) m* O$ w7 i2 ?% ?( M- C, ^
    " o: p1 r1 B1 H/ B3、适应度函数
    3 t8 W4 A! ]/ {9 M+ u
    ; X; b5 K7 i  e      适应度函数是用来评估个体适应环境的能力,是进行自然选择的依据。本题的适应度函数直接将目标函数值中的负值变成0. 因为我们求的是最大值,所以要使目标函数值是负数的个体不适应环境,使其繁殖后代的能力为0.适应度函数的作用将在自然选择中体现。% r1 R) T1 h; l5 p8 ~

    ) v: z  \" ?1 ^( b. \( \1 r9 Q) p, I4、自然选择
    & W" A$ T+ x, r, ^
    2 T6 M; ~$ U& p- i自然选择的思想不再赘述,操作使用轮盘赌算法。其具体步骤:/ t6 T$ h# A' d5 _! [
    ; q% u* u* g& \7 g% y! X8 v
    假设种群中共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号个体拷贝到新种群中。自然选择的结果使种群更符合条件了。
    . f5 Y" Y/ c- I+ s9 @, _: I
    3 B. A8 V; K3 o1 z. L5、繁殖7 m* A  A/ L" B+ L& T% P

    4 r& W+ X% n: K假设个体a、b的基因是! E! q- ^; A  o( l  w; P5 {% m

    0 Y" d- x) l# L: U+ E- N2 F0 R$ ?2 za = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]$ E4 d% o3 i) C
    9 E9 C9 m- T3 T5 z
    b = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]
    : H4 l5 M$ I! u# h1 O  S% K& I2 B6 F# F$ }) [9 \  O4 A
    这两个个体发生基因交换的概率pc = 0.6.如果要发生基因交换,则产生一个随机数point表示基因交换的位置,假设point = 4,则:
    % `/ u) @5 ^: B8 Y" E% {( b, Z# S  i8 X" _* f: y
    a = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]* E# F9 D; [; n/ ?. I& J& P' z

    : J8 |+ R- r( t2 i" K0 sb = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]
    / y) A& O( |' j! I
    + g/ x/ J$ L( F% _交换后为:$ x: P4 C* |( a5 V
    ' L3 q6 h  ^4 e% g. N* ?+ V9 K
    a = [1, 0, 0, 0, 1, 0, 1, 1, 1, 1]7 e7 _1 J& z. c% X0 `7 h7 N5 u
      Y" Y8 t- @2 P8 O' f5 b
    b = [0, 0, 0, 1, 0, 1, 1, 1, 0, 0]
    2 B# `5 s. {$ B. O' R
    ' b7 C: U2 S2 H" b0 W* F6、突变
    : \/ K$ [( i' ^" S9 h" [* L2 ^! [( [6 \. ?" X; v  A3 W
    遍历每一个个体,基因的每一位发生突变(0变为1,1变为0)的概率为0.001.突变可以增加解空间
    0 ]9 W  t! N: w" ]# p+ X! X
    & M. P' i; O8 P" k& ^1 Y; ^' e. c二、代码
    * H: W% ]- F8 o$ udef b2d(b): #将二进制转化为十进制 x∈[0,10]8 q" \* C7 @: `$ L! t$ x
            t = 0
      Y* l' \% W2 _- V, g5 N        for j in range(len(b)):
    ; H. n; B* ^5 d+ A, S2 x- W                t += b[j] * (math.pow(2, j))
    2 }; o" V* C3 _% g* T        t = t * 10 / 1023+ j) `+ @4 ]6 V, H. [
            return t
    : u9 J" Q  O* }2 Y/ X- M: X' A) `. \+ y% K9 L( I
    popsize = 50 #种群的大小9 F; t1 P2 Q9 N+ w7 f; C
    #用遗传算法求函数最大值:
    1 B8 a* V; B5 s  G- Q5 P/ J#f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]0 l# |" r6 X; I7 a) x* g
    4 Z4 `4 b: a( m: J+ [
    chromlength = 10 #基因片段的长度
    % L7 r7 @# w, dpc = 0.6 #两个个体交叉的概率
    5 X  d/ b( |; k1 Hpm = 0.001; #基因突变的概率
    0 c1 A' l" u; m7 F+ Hresults = [[]]- I7 T, [, x+ N8 ^! U/ Y7 N
    bestindividual = []
    0 _7 V, o, ~% {  h" {bestfit = 00 s2 p; A' ~8 _7 t6 m
    fitvalue = []3 @* y5 E9 h: N) M) b
    tempop = [[]]
    & t" y+ n2 Z! R, xpop = [[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]  for i in range(popsize)]
    7 E9 R9 h" Y! u" I: j  U6 Gfor i in range(100): #繁殖100代
    8 X1 T; R+ B: a2 b! V8 L        objvalue = calobjvalue(pop) #计算目标函数值* P. F9 X, H  s' E8 T' _4 y( S+ n
            fitvalue = calfitvalue(objvalue); #计算个体的适应值* t; L$ n; c- ^  f& c
            [bestindividual, bestfit] = best(pop, fitvalue) #选出最好的个体和最好的函数值
    8 W8 P% M) G( H1 h! I        results.append([bestfit,b2d(bestindividual)]) #每次繁殖,将最好的结果记录下来% }, Z3 n/ x2 U7 v1 y% a, l
            selection(pop, fitvalue) #自然选择,淘汰掉一部分适应性低的个体
    2 J* B( s' a& w( ?1 G        crossover(pop, pc) #交叉繁殖
    4 h5 Y. A5 T  s+ x7 s        mutation(pop, pc) #基因突变
    7 w2 f# J, v+ d9 C        ( b0 I5 @9 P1 L( m3 ^- U% C7 H% ]

    # K$ Z6 K/ Y6 O, jresults.sort()        # ^7 X  y! v, _7 A* ~
    print(results[-1]) #打印函数最大值和对应的
    - L; D# P( P% E+ }! d; i+ Zdef calfitvalue(objvalue):#转化为适应值,目标函数值越大越好,负值淘汰。
    4 N, C: _4 _  s  p    fitvalue = []) P5 J0 o( e! }0 g( p1 |2 J
        temp = 0.0
    2 M( Q2 u8 m9 Y8 C+ J    Cmin = 0;" \% d. r' X: ]: u6 \; Q
        for i in range(len(objvalue)):
    . D: T( w5 v* N- h: d8 o& O        if(objvalue + Cmin > 0):  E6 N) r6 S: {9 ?* y
                temp = Cmin + objvalue
    ) G, b: h* T  \        else:3 \& ?2 ~% e; ^7 f8 C: c
                temp = 0.0) ~9 u- S6 T9 R- m6 i) _
            fitvalue.append(temp)
    ! ?; @1 o8 ]; {: O5 r    return fitvalue
    ' i4 A; {: W/ C: i; F" F* f  b! Mimport math
      y- }8 H6 \; j4 N5 @8 ^# X% k' o
    , C* G! Q6 e1 B5 Tdef decodechrom(pop): #将种群的二进制基因转化为十进制(0,1023)& n$ `. U7 l* Q) c3 e  `4 I
        temp = [];: ]& C. W: L" j% S
        for i in range(len(pop)):  K: d% u" I$ l& V1 {
            t = 0;
    1 y7 z$ |! V% c/ q2 S        for j in range(10):; a5 F3 m& z! F0 L2 O' a
                t += pop[j] * (math.pow(2, j))
    & I! B! l4 |) W3 L. |3 F        temp.append(t)  {. }. E$ f# E1 ~8 s6 ^, B
        return temp9 V7 W1 x" a2 g4 P

    8 j) v( U* |3 @def calobjvalue(pop): #计算目标函数值3 g- y3 U1 j* ^8 R0 L# s; v
        temp1 = [];/ O! M7 i' X+ h; X  {3 _8 T
        objvalue = [];1 d  s) |6 e& Q' w8 m
        temp1 = decodechrom(pop)
    4 \3 l& h9 o8 Y4 D    for i in range(len(temp1)):7 M1 K! S; p* ?
            x = temp1 * 10 / 1023 #(0,1023)转化为 (0,10)
    " Z7 ^  N: H2 O# Z        objvalue.append(10 * math.sin(5 * x) + 7 * math.cos(4 * x))* H" U. W$ F1 u3 o
        return objvalue #目标函数值objvalue[m] 与个体基因 pop[m] 对应
    ( I* D# R( ^* c/ l. Sdef best(pop, fitvalue): #找出适应函数值中最大值,和对应的个体+ l$ a( P6 v1 M$ U
            px = len(pop)
    * {. ]0 Z7 |7 ?  U* F  n        bestindividual = []1 J0 i" J- R* S6 g0 k( `9 B- B
            bestfit = fitvalue[0]
    % _; p+ e! A$ d, D! H% x) P        for i in range(1,px):
    % k! a6 _+ Z" d9 @                if(fitvalue > bestfit):
    ; |0 C1 `1 h* L2 g                        bestfit = fitvalue( I  Z$ L' q/ Q4 l1 _
                            bestindividual = pop
    - P- N( |9 z2 s3 {8 u9 {2 b        return [bestindividual, bestfit]
    . ]  Z! W0 q/ ?5 [6 oimport random
    3 ~' l7 e( \- S6 {! g5 D" R9 N' A( }5 U
    def sum(fitvalue):
    ' Z/ ^! V' A( x+ u    total = 0% W9 w+ o' ?, |7 Y1 l, n5 }* Q
        for i in range(len(fitvalue)):
    ! \; t4 e; }, f4 }( x; E        total += fitvalue& h& x/ U5 |1 U/ ~) m. h- T; [
        return total9 i- {- [: W5 e. ~

    . g$ Y: x' T; }) g/ Rdef cumsum(fitvalue):  |. K$ q3 b" k- v# Y* i
        for i in range(len(fitvalue)):# G6 O( S4 @+ T0 D" ^' R
            t = 0;
    5 P. y# e+ m9 M: L" L        j = 0;
    & L6 [0 P6 L& L        while(j <= i):
    0 N" b) C. \( m( U5 ^# m0 l            t += fitvalue[j]/ U# K( k$ z- N1 [
                j = j + 1
    6 ?7 `8 C$ a% d, i, A        fitvalue = t;
    : B& z+ p* H1 B8 ]5 A/ U9 V( J+ [# q( }: E7 X4 N
    def selection(pop, fitvalue): #自然选择(轮盘赌算法)* e% P; r& D' D6 A( _# K" R# L) z
            newfitvalue = []" q* M% L4 @; _5 B5 W5 }: V( T
            totalfit = sum(fitvalue): n' P4 i" i) V. z7 a" n) B& S
            for i in range(len(fitvalue)):
    6 O; d3 A" U8 Y6 p                newfitvalue.append(fitvalue / totalfit)8 e- Z8 C5 j- q6 q' D7 b7 @
            cumsum(newfitvalue)  ^2 h8 m8 K, c% |, q3 M
            ms = [];0 O8 V& h8 G( z# k
            poplen = len(pop)
    8 a9 {% x* [" n9 v        for i in range(poplen):
    9 Q% ^4 i) A! W7 ^4 B                ms.append(random.random()) #random float list ms
    ; Q! A, f  T+ k        ms.sort()6 P. o& e2 J& V8 m8 c
            fitin = 0
    3 c4 b1 \4 F# r0 l, u! p" T6 {        newin = 0
    - A* q& M- n8 @: N- e# B        newpop = pop/ C# J: \4 J9 L
            while newin < poplen:
    8 T( q8 H) f" s9 [- r7 ^8 ^6 }                if(ms[newin] < newfitvalue[fitin]):
    & R! i- ]; X  n  l3 o                        newpop[newin] = pop[fitin]
    # x: I# P8 t8 X# T/ y0 x                        newin = newin + 1
    2 J. C( j, b& Y; [' M, B, [" ~                else:+ I2 V* s  T2 T: M. ^# {  ]4 V* @
                            fitin = fitin + 1
    9 s2 @* H2 t; A. q        pop = newpop
    # @% y* ]6 ?0 f/ q! m8 pimport random' H; M" q1 b0 c
    2 n. n. \; v+ H9 X9 \5 f1 Y
    def crossover(pop, pc): #个体间交叉,实现基因交换
    8 s: `7 p( V4 G& A" N. K8 z    poplen = len(pop): B% {( X  \- h5 K# j& p  F+ O( F
        for i in range(poplen - 1):
    & b1 ~  q$ E2 U- K        if(random.random() < pc):8 s  p% a5 p. c9 q; S3 A. W
                cpoint = random.randint(0,len(pop[0]))% u! I/ t% R$ l6 k% q' m
                temp1 = []& a. h' O& R2 W% V8 T. ]- G0 N
                temp2 = []
    & n* \, r* {: |( g) h( v/ Q0 c2 T            temp1.extend(pop[0 : cpoint]), U% ]# F* M1 d4 Y- M4 d
                temp1.extend(pop[i+1][cpoint : len(pop)])& g" u  Z% S. D* ]1 M- w  t
                temp2.extend(pop[i+1][0 : cpoint])
      S+ z4 ~+ H# W4 w, L0 ~            temp2.extend(pop[cpoint : len(pop)])+ w7 {! t9 Y: p& x; m, B' P" {" H& h
                pop = temp11 I: n; T) R/ q7 Q0 ]9 r
                pop[i+1] = temp2
    , Q% X. A6 n* Y. w! U( Nimport random
    . x9 k" j) I  B& V6 U( Y
    ' K1 q3 Q# [7 ?/ m4 I- x' Hdef mutation(pop, pm): #基因突变
    . s2 q# {* W3 }- i4 i0 L6 ?    px = len(pop)6 G$ h8 z, Z3 i
        py = len(pop[0])
    6 c4 N3 q* L" C# G
    5 Q3 u( F8 z0 Q4 W0 G    for i in range(px):( R+ G+ k; o1 Y( Y
            if(random.random() < pm):
    + l5 }# I; W  Q. B: _5 e            mpoint = random.randint(0,py-1)
    9 Y$ K4 x0 o) I" j5 V6 P; G            if(pop[mpoint] == 1):3 b" t1 X( i" g% j, Q
                    pop[mpoint] = 0* Y! h, a5 `$ K+ R/ V+ F% ]
                else:+ H1 v* o% `& D9 n3 W  N
                    pop[mpoint] = 1: n4 k6 q) c- f% @3 K7 D

    " _+ G: J! F+ J& z5 E' K$ \) [% a9 I
    ————————————————" q9 a7 G4 M0 g; J/ s8 c) d' p) g2 J
    版权声明:本文为CSDN博主「simon-zhao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。4 |2 S, {5 X0 U5 `* Y$ M3 D
    原文链接:https://blog.csdn.net/u010902721/article/details/23531359( H/ Y2 p+ O: S6 J& W

    $ D4 T: z' \( \. b7 [. h% g3 ], b5 w. Y" s# G
    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-9-3 12:46 , Processed in 0.331262 second(s), 52 queries .

    回顶部