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)
result=sum*(10/(pow(2,len(n))-1))
return result
import numpy as np
def moderaty(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)
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)):
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)
POP_all=copy.deepcopy(POP)
G=100
Pc=0.8
Pm=0.1
for i in range(G):
for j in range(len(POP)):
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
POP_end=copy.deepcopy(POP_all)
for q in range(len(POP_all)):
if np.random.random()<Pm:
POP_end.append(mutate(POP_all[q]))
POP_end=Asort(POP_end)
POP=POP_end[0:40]
POP_all=copy.deepcopy(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()