void Poblacion :: Cruce_uniforme (Individuo & padre1, Individuo & padre2,
Individuo & hijo1, Individuo & hijo2)
{
// Lo primero de todo sera generar dos mascaras aleatorias, una para los
// parametros booleanos y otro para los reales
vector<bool> mascara_booleana (0);
vector<bool> mascara_reales (0);
for (int i = 0; i < padre1.operacion_escalar.size(); i++)
{
float b = padre1.Numeros_Aleatorios_Entre_a_y_b (0, 1);
if (b >= 0.5)
mascara_booleana.push_back(1);
else
mascara_booleana.push_back(0);
}
for (int i = 0; i < padre1.parametros_reales.size(); i++)
{
float b = padre1.Numeros_Aleatorios_Entre_a_y_b (0, 1);
if (b >= 0.5)
mascara_reales.push_back(1);
else
mascara_reales.push_back(0);
}
// En este punto se tienen generadas de forma aleatoria unas mascaras que seran
// distintas para cada cruce.
/* La politica de cruce a uilizar sera la siguiente:
Si 1 en Mascara -> Parametro del padre1 para el hijo1
Si 0 en Mascara -> Parametro del padre2 para el hijo1
Si 1 en Mascara -> Parametro del padre2 para el hijo2
Si 0 en Mascara -> Parametro del padre1 para el hijo2
*/
// Aplicamos el cruce selectivo con la politica anterior para crear el hijo1 y
// el hijo 2
for (int i = 0; i < mascara_booleana.size(); i++)
{
if (mascara_booleana[i] == 1)
{
hijo1.operacion_escalar.push_back (padre1.operacion_escalar[i]);
hijo2.operacion_escalar.push_back (padre2.operacion_escalar[i]);
}
else
{
hijo1.operacion_escalar.push_back (padre2.operacion_escalar[i]);
hijo2.operacion_escalar.push_back (padre1.operacion_escalar[i]);
}
}
for (int i = 0; i < mascara_reales.size(); i++)
{
if (mascara_reales[i] == 1)
{
hijo1.parametros_reales.push_back (padre1.parametros_reales[i]);
hijo2.parametros_reales.push_back (padre2.parametros_reales[i]);
}
else
{
hijo1.parametros_reales.push_back (padre2.parametros_reales[i]);
hijo2.parametros_reales.push_back (padre1.parametros_reales[i]);
}
}
}