/// <summary> /// Evalua al individuo /// </summary> /// <param name="chromosome"> /// Individuo a evaluar /// </param> /// <returns> /// Retorna el valor de aptitud del individuo /// </returns> public double Evaluate(IIndividual chromosome) { // obtener el individuo en notacion polaca string function = chromosome.ToString(); double fitness = 0; //Se suma un error inicial proporcional a la longitud de la expresion //double error = ((double)function.Length)/1000; // para cada linea de la tabla de verdad for (int i = 0, n = data.GetLength(0); i < n; i++) { // cargamos el valor de los 4 bits de entrada variables[0] = data[i, 0]; variables[1] = data[i, 1]; variables[2] = data[i, 2]; variables[3] = data[i, 3]; try { // evaluamos el arbol generado con estas variables bool y = PolishBooleanExpression.Evaluate(function, variables); // si el arbol generado difiere de la solucion //se agranda el error en 1 unidad //error += (y == data[i,4]) ? 0 : 1 ; fitness += (y == data[i, 4]) ? 1 : 0; if (i == 15 && (y == data[i, 4])) fitness += 0.25; } catch { return 0; } } fitness = (fitness - 16.25 < double.Epsilon) ? Math.Pow(fitness, 4) : Math.Pow(fitness, 3); if (fitness > 0.0) { fitness -= ((double)function.Length); } return fitness; //return data.GetLength(0) + 1/ (error + 1); }
/// <summary> /// Traduce de genotipo a fenotiop /// </summary> public string TranslateNative(IIndividual chromosome) { //TODO: Retornar en notacion infija return chromosome.ToString(); }