-
Notifications
You must be signed in to change notification settings - Fork 0
/
de_rosenbrock.py
90 lines (79 loc) · 2.45 KB
/
de_rosenbrock.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import random, string, math
from random import randint
#Geração da população
def randomPop(p):
pop = [[0]*20 for x in range(p)]
for i in range(p):
for j in range(20):
pop[i][j] = random.uniform(-10,10)
return pop
#Funcao Rastrigin 20 variaveis
def func(x):
total = 0
for i in range(len(x)-1):
total += 100*math.pow((x[i+1] - math.pow(x[i],2)),2) + math.pow((x[i]-1),2)
return total
#Funcao imprimi a população e retorna o F(x1,...,x20) de cada individuo
def PrintPop(pop):
ind=0
best = 1000000
total = 0
fpop = []
for i in range(len(pop)):
x=pop[i]
fxy=func(x)
fpop.insert(i,fxy)
total += fxy
print("Ind%i : %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f," %(i,x[0],x[1],x[2],x[3],x[4],x[5],x[6]), end='')
print(" %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f," %(x[7],x[8],x[9],x[10],x[11],x[12],x[13]), end='')
print(" %.2f, %.2f, %.2f, %.2f, %.2f, %.2f" %(x[14],x[15],x[16],x[17],x[18],x[19]), end='')
print(" ---> f(Ind): %f" %(fxy))
if fxy < best:
best = fxy
ind = i
print("\n Melhor Individuo: %i = %f || Media: %f" %(ind,best,(total/len(pop))))
#Crossover entre a população mutante e a atual
def crossover(pop_x,pop_v):
pop_u=[[0]*20 for x in range(len(pop_x))]
for i in range(len(pop_x)):
for j in range(20):
cr = random.uniform(0.0000,1.0000)
ji = randint(0,19)
if cr <= 0.9 or ji == j:
pop_u[i][j] = pop_v[i][j]
else:
pop_u[i][j] = pop_x[i][j]
return pop_u
#Criação da população Mutante
def mutation(pop):
popv=[[0]*20 for x in range(len(pop))]
r2=0
r3=0
for i in range(len(pop)):
r2=randint(0,19)
r3=randint(0,19)
for j in range(20):
popv[i][j] = pop[i][j] + 0.9*(pop[r2][j]-pop[r3][j])
return popv
#Selecionar entre a população antiga e a nova
def selection(pop_x, pop_u):
pop=[[0]*20 for x in range(len(pop_x))]
for i in range(len(pop_x)):
if (func(pop_u[i]) < func(pop_x[i])):
pop[i] = pop_u[i]
else:
pop[i] = pop_x[i]
return pop
def main():
print("\n------RASTRIGIN EM EVOLUCAO DIFERENCIAL - 20 VARIAVEIS------")
p = int(input("\nDigite o tamanho da Populacao:"))
g = int(input("\nDigite o tamanho de Geracoes:"))
pop = randomPop(p) #inicializa a população
print("\n Populacao Inicial:")
for i in range(g):
PrintPop(pop)
pop_u=[[0]*20 for x in range(p)]
pop_u=crossover(pop,mutation(pop)) #cria a população mutante e faz crossover
pop=selection(pop,pop_u) #seleciona entre old or new individuos
print("\nGeracao (%i): " % i)
if __name__ == "__main__": main()