/
TP.py
154 lines (114 loc) · 4.63 KB
/
TP.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#1er TP de Algoritmos Geneticos
#
#
#bloque de definicion de constantes
coef = pow(2, 30) - 1 #mi rango de decimales es [0, 2^30 - 1]
crossoverProb = 0.75
mutationProb = 0.05
#
#
#bloque de importacion de modulos
import random
#
#
#bloque de definicion de funciones
def funcionObjetivo(cInt):
return pow(cInt/float(coef), 2)
def funcionFitness(valor, suma):
fitness = (valor/float(suma))
return fitness
def promedio(valor):
return (valor/10.0)
def ruleta(fitness):
porcentaje = (fitness*100)
return porcentaje
def crossover(cromosoma1, cromosoma2, corte):
genes1 = genList[cromosoma1]
genes2 = genList[cromosoma2]
hijo = genes1[:corte] + genes2[corte:]
return hijo
#bloque del programa principal
resultados = [] #historico de los resultados
cromosomaList = [] #lista de los valores de c/cromosoma (int)
genList = [] #lista de los genes de c/cromosoma (binario)
objectiveList = [] #resultados de la funcion objetivo evaluada en los cromosomas enteros
fitnessList = [] #resultados de la funcion fitness para c/cromosoma
ruletaList = []
matrixList = []
porcentajeList = [] #guardo los porcentajes del fitness de c/cromosoma
sumaList = []
promedioList = []
maximoList = []
resultadoList = [] #guardo la tabla de resultados
indice = 0
for i in xrange(20):
#tambien puedo usar del list[:], da igual
genList = []
objectiveList = []
fitnessList = []
ruletaList = []
hijosList = []
cromosomaListNew = []
porcentajeList = []
# zip() creo pares a partir de elementos de una lista
totalObjetivo = 0
indice = 0 #para guardar la posicion del cromosoma en la lista
for j in xrange(10):
cromosoma = random.randint(0, coef) #genero un int random
cromosomaList.append(cromosoma)
cromosomaBin = bin(cromosoma)[2:].zfill(30) #paso el int a binario
genList.append(cromosomaBin)
resultadoObjetivo = funcionObjetivo(cromosoma) #evaluo la funcion en el int
objectiveList.append(resultadoObjetivo)
totalObjetivo = sum(objectiveList) #sumo toda la lista de resultados de la funcion
for resultadoObjetivo in objectiveList:
resultadoFitness = funcionFitness(resultadoObjetivo, totalObjetivo)
fitnessList.append(resultadoFitness)
porcentaje = ruleta(resultadoFitness)#le asigno un valor porcentual en la ruleta
porcentajeList.append(porcentaje) #lista que guarda porcentajes de fitness p/c cromosoma
if (porcentaje < 0.5):
porcentaje = 1
porcentaje = int(round(porcentaje))
for k in xrange(porcentaje): #voy del ultimo valor hasta el porcentaje de este cromosoma
ruletaList.append(indice) #agrego el mismo cromosoma hasta que termine el for
indice = indice + 1 #cuando terminan las 10 iteraciones la ruleta queda cargada
for l in xrange(5):#hago 5 loops porque son 5 pares
azarRuleta1 = random.randint(0, 99)
cromosomaAzar1 = ruletaList[azarRuleta1] #elijo el primer valor del par
azarRuleta2 = random.randint(0, 99)
cromosomaAzar2 = ruletaList[azarRuleta2] #elijo el 2do valor del par
crossoverRandom = random.random() #tiro un random para ver el crossover
if crossoverRandom<=crossoverProb: #si el crossover da si:
corteRandom = random.randint(0, 29)
hijo1 = crossover(cromosomaAzar1, cromosomaAzar2, corteRandom) #pongo los genes hasta el corteRandom
hijo2 = crossover(cromosomaAzar2, cromosomaAzar1, corteRandom)
hijosList.append(hijo1) #creo una lista con elementos hijos de los cromosomas
hijosList.append(hijo2)
else:
hijo1 = cromosomaAzar1
hijo2 = cromosomaAzar2
mutationRandom1 = random.random
mutationRandom2 = random.random
if mutationRandom1 <= mutationProb: #pruebo si muta y cambio el valor
genChange = random.randint(0, 29)
if (hijo1[genChange] == 0):
hijo1[genChange] = 1
else:
hijo1[genChange] = 0
if mutationRandom2 <= mutationProb:
genChange = random.randit(0, 29)
if (hijo2[genChange] == 0):
hijo2[genChange] = 1
else:
hijo2[genChange] = 0
cromosomaListNew.append(hijo1) #guardo los cromosomas nuevos en otra lista
cromosomaListNew.append(hijo2)
cromosomaList = list(cromosomaListNew) #reemplazo la lista original con los hijos
promedioObjetivo = promedio(totalObjetivo)
maximoObjetivo = max(objectiveList)
maximoFitness = max(fitnessList)
sumaObjetivo = totalObjetivo
lista = ['SUMA Objetivo: ' + str(sumaObjetivo), 'SUMA Fitness: 1', 'PROMEDIO Objetivo: ' + str(promedioObjetivo), 'PROMEDIO Fitness: 0.25', 'MAXIMO Objetivo: ' + str(maximoObjetivo), 'MAXIMO Fitness: ' + str(maximoFitness)]
resultadoList.append(lista)
print(resultadoList)
print(len(resultadoList))