/** * Builder. Copies a chromosome of specified size * * @param size Size of the chromosome * @param a Chromosome to copy */ public Cromosoma(int size, Cromosoma a) { int i; cuerpo = new boolean[size]; for (i = 0; i < cuerpo.length; i++) cuerpo[i] = a.getGen(i); calidad = a.getCalidad(); cruzado = false; valido = true; } // end-method
/** * Test if two chromosome differ in only one gene * * @param a Chromosome to compare * @return Position of the difference, if only one is found. Otherwise, -1 */ public int differenceAtOne(Cromosoma a) { int i; int cont = 0, pos = -1; for (i = 0; i < cuerpo.length && cont < 2; i++) if (cuerpo[i] != a.getGen(i)) { pos = i; cont++; } if (cont >= 2) return -1; else return pos; } // end-method
/** * Reinitializes the chromosome by using CHC diverge procedure * * @param r R factor of diverge * @param mejor Best chromosome found so far * @param prob Probability of setting a gen to 1 */ public void divergeCHC(double r, Cromosoma mejor, double prob) { int i; for (i = 0; i < cuerpo.length; i++) { if (Randomize.Rand() < r) { if (Randomize.Rand() < prob) { cuerpo[i] = true; } else { cuerpo[i] = false; } } else { cuerpo[i] = mejor.getGen(i); } } cruzado = true; } // end-method
/** Function which selects the elements of the population */ public void Select() { int i, j; for (i = 0; i < Popsize; i++) for (j = i + 1; j < POPSIZE; j++) if (Better(Poblacion[j].perf(), Poblacion[i].perf())) INTERCAMBIAR(i, j); if (Poblacion[0].perf() < BEST_CROM.perf()) { for (j = 0; j < Genes; j++) BEST_CROM.set_gene(j, Poblacion[0].gene(j)); for (j = 0; j < GenesA; j++) BEST_CROM.set_geneA(j, Poblacion[0].geneA(j)); for (j = 0; j < n_reglas_total; j++) BEST_CROM.set_geneR(j, Poblacion[0].geneR(j)); BEST_CROM.set_perf(Poblacion[0].perf()); BEST_CROM.set_entrado(1); } }
/** Function which restart the population */ public void ReStart() { int i, j, i_mejor; if (Ajuste == 1) { if (BEST_CROM.entrado() == 1) { /* BUSCAR EL MEJOR ELEMENTO */ for (i = i_mejor = 0; i < Popsize; i++) if (Better(Poblacion[i].perf(), Poblacion[i_mejor].perf())) i_mejor = i; for (j = 0; j < Genes; j++) Poblacion[0].set_gene(j, BEST_CROM.gene(j)); for (j = 0; j < GenesA; j++) Poblacion[0].set_geneA(j, BEST_CROM.geneA(j)); for (j = 0; j < n_reglas_total; j++) Poblacion[0].set_geneR(j, (char) 1); Poblacion[0].set_perf(BEST_CROM.perf()); i = 1; } else { i = 0; } /* REINICIALIZAR TODOS MENOS EL PRIMERO */ for (; i < Popsize; i++) { for (j = 0; j < Genes; j++) { Poblacion[i].set_gene(j, BEST_CROM.gene(j) + ((Randomize.Rand() - 0.5) / 4.0)); if (Poblacion[i].gene(j) > Gene[j].max()) Poblacion[i].set_gene(j, Gene[j].max()); if (Poblacion[i].gene(j) < Gene[j].min()) Poblacion[i].set_gene(j, Gene[j].min()); } for (j = 0; j < GenesA; j++) { Poblacion[i].set_geneA(j, BEST_CROM.geneA(j) + ((Randomize.Rand() - 0.5) / 4.0)); if (Poblacion[i].geneA(j) > Gene[j].max()) Poblacion[i].set_geneA(j, Gene[j].max()); if (Poblacion[i].geneA(j) < Gene[j].min()) Poblacion[i].set_geneA(j, Gene[j].min()); } for (j = 0; j < n_reglas_total; j++) Poblacion[i].set_geneR(j, (char) 1); } THRESHOLD = (double) ((Genes + GenesA) * BITS_GEN / 4.0); reduccionIni = THRESHOLD * 0.001; } else { if (BEST_CROM.entrado() == 1) { /* BUSCAR EL MEJOR ELEMENTO */ for (i = i_mejor = 0; i < Popsize; i++) if (Better(Poblacion[i].perf(), Poblacion[i_mejor].perf())) i_mejor = i; /* COLOCAR EL MEJOR EN LA PRIMERA POSICION */ for (j = 0; j < Genes; j++) Poblacion[0].set_gene(j, BEST_CROM.gene(j)); for (j = 0; j < GenesA; j++) Poblacion[0].set_geneA(j, BEST_CROM.geneA(j)); for (j = 0; j < n_reglas_total; j++) Poblacion[0].set_geneR(j, (char) 1); Poblacion[0].set_perf(BEST_CROM.perf()); i = 1; } else i = 0; /* REINICIALIZAR TODOS MENOS EL PRIMERO */ for (; i < Popsize; i++) { for (j = 0; j < Genes; j++) Poblacion[i].set_gene(j, BEST_CROM.gene(j)); for (j = 0; j < GenesA; j++) Poblacion[i].set_geneA( j, Gene[j].min() + (Gene[j].max() - Gene[j].min()) * Randomize.Rand()); for (j = 0; j < n_reglas_total; j++) Poblacion[i].set_geneR(j, '1'); } THRESHOLD = (double) (GenesA / 4.5); reduccionIni = THRESHOLD * 0.001; } Reiniciado = 1; }
/** * It initialize the population * * @param tam1 It contains the size of the table of training * @param v1 It contains the training input values * @param s1 It contains the training output values * @param tam2 It contains the size of the table of test * @param v2 It contains the test input values * @param s2 It contains the test output values * @param n_variables It contains the number of variables * @param reglas It contains the number of rules * @param var It contains the number of state variables * @param sal It contains the exit value * @param v It contains the values of data base * @param semilla It contains the value of the seed */ public void Initialize( int tam1, double[][] v1, double[] s1, int tam2, double[][] v2, double[] s2, int n_variables, int reglas, int var, double sal, double[] v, long semilla) { /* INICIALIZAR VARIABLES */ int i, j; Genes = 0; contador = contador2 = 0; Reiniciado = 0; Randomize.setSeed(semilla); E = new Ecm(tam1, v1, s1, tam2, v2, s2, n_variables, reglas, var, sal, v); Poblacion = new Cromosoma[2 * Popsize]; Trials = 0; for (i = 0; i < n_variables; i++) { Genes += E.base().getN_etiquetas(i); } Ajuste = 1; Gene = new Gen[Genes]; GenesA = Genes - E.base().getN_etiquetas(E.base().getN_var_estado()); THRESHOLD = (double) ((Genes + GenesA) * BITS_GEN / 4.0); reduccionIni = THRESHOLD * 0.001; n_reglas_total = reglas; Gen aux = new Gen(); aux.set_min(0.0); aux.set_max(1.0); for (i = 0; i < Genes; i++) { Gene[i] = aux; } for (i = 0; i < 2 * Popsize; i++) { Poblacion[i] = new Cromosoma(Genes, GenesA, n_reglas_total); } sample = new int[Popsize]; BEST_CROM = new Cromosoma(Genes, Genes, n_reglas_total); for (j = 0; j < Genes; j++) { BEST_CROM.set_gene(j, Gene[j].min() + (Gene[j].max() - Gene[j].min()) / 2.); Poblacion[0].set_gene(j, BEST_CROM.gene(j)); } for (j = 0; j < GenesA; j++) { BEST_CROM.set_geneA(j, Gene[j].min() + (Gene[j].max() - Gene[j].min()) / 2.); Poblacion[0].set_geneA(j, BEST_CROM.gene(j)); } for (j = 0; j < n_reglas_total; j++) { BEST_CROM.set_geneR(j, (char) 1); Poblacion[0].set_geneR(j, (char) 1); } for (i = 1; i < Popsize; i++) { for (j = 0; j < Genes; j++) Poblacion[i].set_gene( j, Gene[j].min() + (Gene[j].max() - Gene[j].min()) * Randomize.Rand()); for (j = 0; j < GenesA; j++) Poblacion[i].set_geneA( j, Gene[j].min() + (Gene[j].max() - Gene[j].min()) * Randomize.Rand()); for (j = 0; j < n_reglas_total; j++) Poblacion[i].set_geneR(j, (char) 1); } F = new Funciones(); }