標准遺傳算法(二進制編碼 python實現)


代碼地址:https://github.com/guojun007/binary_sga

 

種群初始化:

binary_sga/population_init/population_init.py

#種群初始化函數
def population_init(population, N, V, nbits):
    #自變量個數V並沒有用到
    del population[:]
    for i in xrange(N):
        tempIndividual=[]
        for j in nbits:
            tempVal=[]
            for k in xrange(j):
                tempVal.append(random.randint(0, 1))
            tempIndividual.append(tempVal)
        population.append(tempIndividual)

 

選擇操作:(輪盤賭選擇)

binary_sga/selection/selection.py

#!/usr/bin/env python
#encoding:UTF-8
import copy
import random
#輪盤賭選擇法
def selection(population, xbin):
    s=sum(xbin)
    temp=[k*1.0/s for k in xbin]
    temp2=[]

    s2=0
    for k in temp:
        s2=s2+k
        temp2.append(s2)

    temp3=[]
    for _ in xrange(len(population)):
        r=random.random()
        for i in xrange(len(temp2)):
            if r<=temp2[i]:
                temp3.append(i)
                break

    temp4=[]
    temp5=[]
    for i in temp3:
        temp4.append(copy.deepcopy(population[i]))
        temp5.append(xbin[i])
    population[:]=temp4
    xbin[:]=temp5

 

 

交叉操作:(單點交叉)

binary_sga/crossover/crossover.py

#二進制編碼,單點交叉
def crossover(population, alfa, nbits):
    for i in xrange(len(population), 2):
        for j in xrange(len(nbits)):
            r=random.random()
            if r<alfa:
                p=random.randint(1, nbits[j]-1)
                population[i][j][p:], population[i+1][j][p:]=population[i+1][j][p:], population[i][j][p:]

 

 

變異操作:

binary_sga/mutation/mutation.py

def mutation(population, belta, nbits):
    for i in xrange(len(population)):
        for j in xrange(len(nbits)):
            for k in xrange(nbits[j]):
                r=random.random()
                if r<belta:
                    population[i][j][k]^=1

 

 

二進制個體解碼操作:

binary_sga/decode/decode.py

#種群個體解碼
def decode(population, population_real, minBinVal, maxBinVal, nbits):
    del population_real[:]

    def iner(valList):
        L=len(valList)
        s=0
        for i in valList:
            s=s+i*(2**(L-1))
            L=L-1
        return s

    for i in population:
        temp=[]
        for j in i:
            temp.append(iner(j))

        for j in xrange(len(temp)):
            temp[j]=temp[j]*(maxBinVal[j]-minBinVal[j])*1.0/(2**(nbits[j])-1)+minBinVal[j]
        population_real.append(temp)

 

 

測試函數部分:

binary_sga/function/object_fun.py

#對偶問題, 轉化為求最大值
#二維 Rastrigin測試函數
def object_fun(p):
    import math
    x=p[0]
    y=p[1]
    object_value=20.0+x**2+y**2-10.0*(math.cos(2*math.pi*x)+math.cos(2*math.pi*y))
    return 100.0-object_value

"""
#求最大值,無需轉化
#二維 Schaffer測試函數
def object_fun(p):
    import math
    x=p[0]
    y=p[1]
    object_value =0.5-((math.sin( math.sqrt(x**2+y**2) ))**2-0.5)/(1+0.001*(x**2+y**2))**2
    return object_value
"""

 

 

 

 

主函數部分:

binary_sga/sga.py

N=200
V=2
nbits=(17, 17)
maxBinVal=(-5, -5)
minBinVal=(5, 5)
population=[]
population_real=[]
alfa=0.9
belta=0.05

#目標函數值列表
xbin=[]


def per_run():
    population_init(population, N, V, nbits)

    for i in xrange(200):
        decode(population, population_real, minBinVal, maxBinVal, nbits)
        eval_fun(population_real, xbin)
        selection(population, xbin)
        crossover(population, alfa, nbits)
        mutation(population, belta, nbits)

    decode(population, population_real, minBinVal, maxBinVal, nbits)
    eval_fun(population_real, xbin)
    return 100.0-max(xbin)

N為個體種群數。

V為自變量個數。

nbits 各個自變量二進制編碼的長度。

maxBinVal 各個自變量 上限。
minBinVal 各個自變量 下限。
種群個體 二進制編碼 列表 population。
種群個體 實數解碼  列表 population_real。

alfa=0.9  交叉概率。 belta=0.05 變異概率。


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM