-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCromosoma.cpp
More file actions
210 lines (180 loc) · 5.2 KB
/
Cromosoma.cpp
File metadata and controls
210 lines (180 loc) · 5.2 KB
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#include "Cromosoma.h"
using namespace std;
Cromosoma::Cromosoma(int tamano, int parametro) {
tamArr = tamano;
numeroParametros = parametro;
binario = new int[tamArr]();
real = new double[tamArr]();
}
int Cromosoma::getTam(){
return this->tamArr;
}
//FUNCIONES DE RANDOM
int randBin() {
static thread_local std::mt19937 binarioRand;
std::uniform_int_distribution<int> bin(0,1); // guaranteed unbiased
return bin(binarioRand);
}
int randReales(int min,int max) {
static thread_local std::mt19937 realRand;
std::uniform_int_distribution<int> car(min,max); // guaranteed unbiased
return car(realRand);
}
double randDoubles(double min,double max) {
static thread_local std::mt19937 doubleRand;
//encontrar el equivalente para doubles
std::uniform_real_distribution<double> func(min,max); // guaranteed unbiased
return func(doubleRand);
}
void Cromosoma::inicializarPoblacion(int minCarros, int maxCarros, double minKM, double maxKM, double minCO2, double maxCO2){
//Random para valores binarios
std::mt19937 genRandomBinario(time(0)); // random-number engine used (Mersenne-Twister in this case)
std::uniform_int_distribution<int> bin(0,1); // guaranteed unbiased
//Random para valores reales de Parametro:Carros
std::mt19937 genRandomCarros(time(0)); // random-number engine used (Mersenne-Twister in this case)
std::uniform_int_distribution<int> car(minCarros,maxCarros); // guaranteed unbiased
// Rand_Entero randomCarro{300000,417828};
//Random para valores reales de Parametro:Km
//Rand_double randomKm{15000,30000};
std::mt19937 genRandomKM(time(0)); // random-number engine used (Mersenne-Twister in this case)
std::uniform_real_distribution<double> km(minKM,maxKM); // guaranteed unbiased
//Random para valores reales de Parametro:KgCO2
//Rand_double randomCo2{1.517,9.405};
std::mt19937 genRandomCO2(time(0)); // random-number engine used (Mersenne-Twister in this case)
std::uniform_real_distribution<double> co2(minCO2,maxCO2); // guaranteed unbiased
//Inicializando Valores de Arreglos
//BINARIO
for(int i=0;i<tamArr;i++){
binario[i]= randBin();//bin(rng);
//cout << binario[i];
}
//Inicializando el arreglo de reales por parametro
int inicio = 0;
//Aleatorio numero de carros
for(int i=0;i<tamArr/numeroParametros;i++){
real[inicio] = randReales(minCarros,maxCarros);
inicio++;
}
//Aleatorio numero de KM
for(int i=0;i<tamArr/numeroParametros;i++){
real[inicio] = randDoubles(minKM,maxKM);
inicio++;
}
//Aleatorio numero de KG de CO2
for(int i=0;i<tamArr/numeroParametros;i++){
real[inicio] = randDoubles(minCO2,maxCO2);
inicio++;
}
}
//opcionArreglo=
//0 Si SE QUIERE OBTIENER de ARREGLO BINARIO
//1 Si se quiere tomar DE ARREGLO REAL
void Cromosoma::cambiarElemento(int indice, double elemento, int opcionArreglo){
if(opcionArreglo==0){
binario[indice]=elemento;
}
else{
real[indice]=elemento;
}
}
//Obtener valor de elemento.
double Cromosoma::obtenerElemento(int indice, int opcionArreglo){
if(opcionArreglo==0){
return binario[indice];
}
else{
return real[indice];
}
}
//Recorrer elemento binario
void Cromosoma::recorrerBinario(){
cout<<"Arreglo Binario Aletario"<<endl;
for(int i=0;i<tamArr;i++){
cout<< binario[i];
}
}
//Recorrer arreglo de reales
void Cromosoma::recorrerReales(){
cout<<"Arreglo Real Aletario"<<endl;
for(int i=0;i<tamArr;i++){
cout<< real[i] <<endl;
}
}
//Visualizar real binario
void Cromosoma::visualizacionCompleta(ofstream &file){
cout<<"Arreglo Binario / Real Aletario"<<endl;
for(int i=0;i<tamArr;i++){
cout<< binario[i] <<" <--> " <<real[i]<<endl;
file<< binario[i] <<" <--> " <<real[i]<<"\n";
}
}
//getters y setters
int* Cromosoma::getBinario(){
return binario;
}
double* Cromosoma::getReal(){
return real;
}
int Cromosoma::getTamano(){
return tamArr;
}
int Cromosoma::getParametros(){
return numeroParametros;
}
//Promedios de Cromosomas
double* Cromosoma::promedioParametro(){
int sumaCar; double sumaKm; double sumaCO2;
sumaCar = sumaKm = sumaCO2 = 0;
int totalCar; int totalKm; int totalCO2;
totalCar = totalKm = totalCO2 = 0;
int index = 0;
parametros = new double[3];
for(int i=0;i<tamArr/numeroParametros;i++){
if(binario[index]==1){
sumaCar = sumaCar + real[index];
totalCar++;
}
index++;
}
//Aleatorio numero de KM
for(int i=0;i<tamArr/numeroParametros;i++){
if(binario[index]==1){
sumaKm= sumaKm + real[index];
totalKm++;
}
index++;
}
//Aleatorio numero de KG de CO2
for(int i=0;i<tamArr/numeroParametros;i++){
if(binario[index]==1){
sumaCO2= sumaCO2 + real[index];
totalCO2++;
}
index++;
}
//Los parametros se dividaran en:
/*
CARROS = INDICE 0
KM = INDICE 1
CO2 = INDICE 2
*/
parametros[0] = sumaCar/totalCar;
parametros[1] = sumaKm/totalKm;
parametros[2] = sumaCO2/totalCO2;
return parametros;
}
//Funcion fitness en donde evalua la cantidad total de contaminate por cromosoma
double Cromosoma::fitnessCromosoma(){
this->promedioParametro();
valorFitness = (parametros[1]*parametros[2])*parametros[0];
return valorFitness;
}
void Cromosoma::cambiaBinario(int index,int val){
this->binario[index] = val;
}
double Cromosoma::getValorFitness(){
return valorFitness;
}
int Cromosoma::getBinarioAt(int index){
return this->binario[index];
}