• 遗传算法+Python代码


    算法原理

    to-do

    Python代码

    # -- coding: utf-8 --
    
    import numpy as np
    import math
    
    def solve_p(domain):
        N = 20
        domain = np.asarray(domain)
        temp = max(np.max(abs(domain),axis=0))
        p = (len(bin(temp))-2)*N
        return p
    
    def randInit(p,num,paraNum):
        '''随机生成随机数'''
        xSum = [None]*paraNum
        for i in range(paraNum):
            x = [None]*num
            for j in range(num):
                temp = np.random.randint(0,2,p)
                x[j] = ''.join(str(temp[j]) for j in range(p))
            xSum[i] = x
        return xSum
    
    def bin2dec(p,b,num,paraNum):
        maxNumBin = '1'*p
        maxNumDec = int(maxNumBin,2)
        d = [None]*paraNum
        for i in range(paraNum):
            temp = [None]*num
            for j in range(num):
                temp[j] = int(b[i][j],2)/maxNumDec
            d[i] = temp
        return d
    
    def values(p,x,func,num,paraNum):
        x = bin2dec(p,x,num,paraNum) #转换为十进制
        v = [None]*num
        for j in range(num):
            temp = [None]*paraNum
            for i in range(paraNum):
                temp[i] = x[i][j]
            v[j] = func(temp)
        return v
    
    def func(t):
        y = -20*math.exp(-0.2*math.sqrt(0.5*(t[0]**2+t[1]**2)))-math.exp(0.5*(math.cos(2*math.pi*t[0])+math.cos(2*math.pi*t[1])))+22.71282
    #    y = t[0]**2+t[1]**2
        return y
    
    def copy(x,v,num,paraNum):
        #轮盘赌算法
        v = np.asarray(v)/sum(v)
        cumV = [0]*num
        for i in range(num):
            cumV[i] = cumV[i-1] + v[i]
    
        someList = [y for y in range(num)]
        n = [0]*num
        for i in range(num):
            temp = np.random.random()
            for j in range(num):
                if temp < cumV[j]:
                    n[j] += 1
                    break
        #生成复制
        x2 = [None]*paraNum
        for i in range(paraNum):
            temp = [None]*num
            for j in range(num):
                temp[j] = x[i][j]
            x2[i] = temp
        return x2
    
    def cross(x2,num,paraNum):
        x3 = [None]*paraNum
        flag = np.random.randint(0,num)
        s = np.random.permutation(num) #partnership
        for i in range(paraNum):
            temp = [None]*num
            for j in range(0,num-1,2):
                temp[s[j]],temp[s[j+1]] = x2[i][s[j]][:flag]+x2[i][s[j+1]][flag:],x2[i][s[j+1]][:flag]+x2[i][s[j]][flag:]
            for k in range(j+1,num):
                temp[s[k]] = x2[i][s[k]]
            x3[i] = temp
        return x3
    
    def heter(x3,p,pro,num,paraNum):
        x4 = [None]*paraNum
        for i in range(paraNum):
            temp2 = [None]*num
            for j in range(num):
                temp = list(x3[i][j])
                for k in range(p):
                    if np.random.random() < pro:
                        temp[k] = str((int(temp[k])+1)%2)
                temp2[j] = ''.join(temp)
            x4[i] = temp2
        return x4
    
    def dieOut(x5,v2,num,paraNum):
        vS = list(enumerate(v2))
        def takeSecond(elem):
            return elem[1]
        vS.sort(key=takeSecond,reverse=True)
        xNext = [None]*paraNum
        for i in range(paraNum):
            temp = [None]*num
            for j in range(num):
                temp[j] = x[i][vS[j][0]]
            xNext[i] = temp
        return xNext
    
    def out(p,x,num,paraNum):
        print('最优取值为:',end='')
        temp = [None]*paraNum
        for i in range(paraNum):
            temp[i] = bin2dec(p,x[i][0],1,1)
        print(temp)
        
        for j in range(paraNum):
            for i in range(paraNum):
                temp[i] = temp[i][0]
        print('最优解为',func(temp))
    
    
    num = 50 #种群个数
    paraNum = 2 #变量个数
    domain = [[-5,5],[-5,5]] #定义域
    p = solve_p(domain)
    x = randInit(p,num,paraNum)
    iterTimes = 50
    
    for i in range(iterTimes):
        v = values(p,x,func,num,paraNum)
        x2 = copy(x,v,num,paraNum)
        x3 = cross(x2,num,paraNum)
        x4 = heter(x3,p,0.001,num,paraNum)
        v2 = values(p,x4,func,num,paraNum)
        x5 = x+x4
        x = dieOut(x5,v2,num,paraNum)
    out(p,x,num,paraNum)
    
  • 相关阅读:
    深圳和上海
    肖舸的“畅销门”和“卓越门”
    一件小事引发的辞职——团队里的Y君
    同洲、宇龙手机源代码之争
    《过得去》
    评肖舸之《0bug一书给谁带来了奶酪?》
    《观止》点滴
    webgame 地图加载(论坛摘录)
    分块加载(转)
    45度游戏的另类深度排序(copyPixels)
  • 原文地址:https://www.cnblogs.com/kexve/p/11740654.html
Copyright © 2020-2023  润新知