python遗传算法求解一元一次函数极值

#初始化种群
from random import *
import copy
import random

def population(N,L):
    ls=[]
    while len(ls)<N:
        ls.append([random.randint(0,1) for i in range(20)])
    return ls

#二进制到十进制
def decode(n):
    n.reverse()
    sum=0
    for i in range(len(n)):
        sum+=int(n[i])*pow(2,i)
#         sum+=int(n[len(n)-1-i])*pow(2,i)
        result=sum*(10/(pow(2,len(n))-1))
    return result

import numpy as np
#求个体适度值(就是将自变量带入函数求出的y值)
def moderaty(x):
#     x=int(x)
#     print(type(x))
    return x+10*np.sin(5*x)+7*np.cos(4*x)

#交叉
def crossover(a1,a2):
    a,b=np.random.choice(len(a1),2)
#     print(a1,a2)
#     print(a,b)
    if a<b:
        a1_1 = a1[0:a] + a2[a:b-1] + a1[b-1:]
        a2_1 = a2[0:a] + a1[a:b-1] + a2[b-1:]
    elif a>b:
        a1_1 = a1[0:b] + a2[b:a-1] + a1[a-1:]
        a2_1 = a2[0:b] + a1[b:a-1] + a2[a-1:]
    elif a == b:
        a1_1 = a1[0:a] + a2[a:a+1] + a1[b+1:]
        a2_1 = a2[0:a] + a1[a:a+1] + a2[b+1:]
    return a1_1,a2_1

#变异
def mutate(pop):
    a=np.random.choice(len(pop))
    if pop[a]==0:
        pop_new= pop[0:a] + [1] + pop[a+1:]
    else:
        pop_new= pop[0:a] + [0] + pop[a+1:]
    return pop_new

#排序
def Asort(pop):
    for i in range(len(pop)-1):
        for j in range(i+1,len(pop)):
#             print(i,j)
#             print(type(pop[i]))
#             print(pop[j])
#             print(pop[i])

            if moderaty(decode(pop[j]))>moderaty(decode(pop[i])):
                pop[i],pop[j]=pop[j],pop[i]
    return pop

if __name__=='__main__':
    NP=40          #初始化种群数目
    L=20           #染色体二进制编码长度
    
    POP=population(NP,L)
#     print(POP)
    POP_all=copy.deepcopy(POP)
    
    G=100          #最大进化代数(就是最大迭代次数)
    Pc=0.8          #交叉概率
    Pm=0.1          #变异概率
    
    #交叉
    for i in range(G):
        for j in range(len(POP)):
#             print(i,j)
            if np.random.random()<Pc:
                if j%2==0:
                    pop=crossover(POP[j],POP[j+1])
                    POP_all.append(pop[0])
                    POP_all.append(pop[1])
                else:
                    pop=crossover(POP[j],POP[j-1])
                    POP_all.append(pop[0])
                    POP_all.append(pop[1])
            else:
                continue
#         print('交叉',len(POP_all))
#         print(POP_all)

        #变异
#         POP0=copy.deepcopy(POP_all)
        POP_end=copy.deepcopy(POP_all)
        for q in range(len(POP_all)):
#             print(POP0[q],type(POP0[q]))
            if np.random.random()<Pm:
                POP_end.append(mutate(POP_all[q]))
#         print('变异',len(POP_all))
        
#         for e in range(len(POP_end)):
#             POP_end[e]=decode(POP_end[e])
#         print(POP_end)
    
        POP_end=Asort(POP_end)
#         print(POP_end)
        POP=POP_end[0:40]
#         for r in range(len(POP)):
#             POP[r]=decode0(POP[r])
        POP_all=copy.deepcopy(POP)
#         print(POP)

for i in range(len(POP)):
    print(decode(POP[i]))
    print(moderaty(decode(POP[i])))

import matplotlib.pyplot as plt
x=np.linspace(0,10,10000)
y=moderaty(x)
scatter_x = np.array([decode(POP[0])])
scatter_y = np.array([moderaty(decode(POP[0]))])
plt.plot(x,y)
plt.scatter(scatter_x, scatter_y, c='r')
plt.show()

你可能感兴趣的:(PYTHON,python)