Algoritmo genetico, poblacion, individuo con cruce y seleccion por probabilidad

Preguntas RecientesCategoria: JavaAlgoritmo genetico, poblacion, individuo con cruce y seleccion por probabilidad
drozz preguntada 1 año antes

clase individuo


/**
 *
 * @author hagamosweb
 */
public class Individuo {
    public int idIndividuo;
    public int tamanioBits; // tamaño del codigo Binario
    public int bits[];
    double probabilidad = 0;
    
     public Individuo(int tamanioBits) {
        this.tamanioBits = tamanioBits;
        bits = new int[tamanioBits];
        rellenarAleatoriamente();
    }
    
    public Individuo(int tamanioBits, int id) {
        this.tamanioBits = tamanioBits;
        this.idIndividuo = id;
        bits = new int[tamanioBits];
        rellenarAleatoriamente();
    }
    public void setId(int id) {
        this.idIndividuo = id;
    }
    public void setTamanioBits(int tam) {
        this.tamanioBits = tam;
    }
    public void setProbabilidad(double probabilidad) {
        this.probabilidad = probabilidad;
    }
     public double getProbabilidad() {
         return this.probabilidad;
     }
    
    public void rellenarAleatoriamente() {
        for(int i = 0; i < tamanioBits; i++) {
            int numAleatorio = (int)(Math.random() * 100);
            //System.out.println(numAleatorio);
            if((numAleatorio % 2) == 0) {
                bits[i] = 0;
            } else {
                bits[i] = 1;
            }
        }
    }
    
    public int decimal() {
        String bin = "";
        for(int i = 0; i < tamanioBits; i++) {
            bin += bits[i];
        }
        return Integer.parseInt(bin,2);
    }
    
    @Override
    public String toString() {
        String bin = "";
        for(int i = 0; i < tamanioBits; i++) {
            bin += bits[i] + "\t";
        }
        return idIndividuo + ".-\t" +bin;
    }
    
    public static Individuo cruza(Individuo individuoA,Individuo individuoB, int puntoCruce) {
        if(puntoCruce == 0 || puntoCruce == individuoA.tamanioBits -1) {
            System.out.println("no es un punto de cruce valido");
            return null;
        }
        Individuo decendiente = new Individuo(individuoA.tamanioBits, individuoA.idIndividuo);
        for(int i = 0; i < decendiente.tamanioBits; i++) {
            if(puntoCruce >= i) {
                //mientras no pase el punto de cruce tomara los byts del individuo A
                decendiente.bits[i] = individuoA.bits[i];
            } else {
                //despues de pasar el punto de cruce tomara los byts del individuo B
                decendiente.bits[i] = individuoB.bits[i];
            }
        }
        return decendiente;
    }
}

metodos del algoritmo genetico


/**
 *
 * @author hagamosweb
 */
public class AlgoritmoLocochon {
    
    Individuo []poblacion;
    int tamanioBits = 8;
    int tamPoblacion = 10;
    double parametroCruce = 0.8;
    
    public Individuo buscarIndividoPorId(int idIndividuo) {
        for(int i = 0; i < poblacion.length; i++) {
            if(poblacion[i].idIndividuo == idIndividuo) {
                return poblacion[i];
            }
        }
        return null;
    }
    
    public void crearPoblacion() {
        poblacion = new Individuo[tamPoblacion];
        for(int i = 0; i < poblacion.length; i++) {
            poblacion[i] = new Individuo(tamanioBits, i);
        }
    }
    public void imprimirPoblacion() {
        System.out.println("====Poblacion====");
        for(int i = 0; i < poblacion.length; i++) {
            System.out.println(poblacion[i]);
        }
    }
    
    public void probablidadDeIndividuo() {
        System.out.println("====Probabilidad por Individuo====");
        int total = 0; // suma de todos los individuos convertidos a decimas
        for(int i = 0; i < poblacion.length; i++) {
            total += poblacion[i].decimal();
        }
        double totalProbablididad = 0;
        for(int i = 0; i < poblacion.length; i++) {
            double probablidadIndividuo = (double)poblacion[i].decimal() / total;
            totalProbablididad += probablidadIndividuo;
            poblacion[i].setProbabilidad(totalProbablididad);
            System.out.println(poblacion[i].idIndividuo + ": " + poblacion[i].probabilidad);
        }
        System.out.println("total probabilidad: " + totalProbablididad);
    }
    
    public void seleccion() {
        System.out.println("====Seleccion====");
        int idsIndividuosSelec[] = new int[tamPoblacion];
        // se crea el arreglo de valores aleatorios
        double numAleatorios[] = new double[tamPoblacion];
        for(int i = 0; i < tamPoblacion; i++) {
             numAleatorios [i]= Math.random();
        }
        for(int i = 0; i < tamPoblacion; i++) {
            for(int j = 0; j < tamPoblacion; j++) {
                if(numAleatorios[i] < poblacion[j].getProbabilidad()) {
                    idsIndividuosSelec[i] = poblacion[j].idIndividuo;
                    System.out.print("no.aleatorio: " + numAleatorios[i]);
                    System.out.println(" probabilidad individuo "+
                            poblacion[j].idIndividuo +": " +
                            poblacion[j].getProbabilidad());
                    break;
                }
            }
        }
    }
    
    public void cruza() {
        Individuo []nuevaPoblacion = new Individuo[tamPoblacion];
        // se crea el arreglo de valores aleatorios que son los parametros de cruce
        double aleaCruce[] = new double[tamPoblacion];
        for(int i = 0; i < tamPoblacion; i++) {
            aleaCruce[i]= Math.random();
        }
        //se determina un punto de cruza que es para saber hasta donde se intercambiaran
        //bits del codigo binario entre cada individuo
        //es un random de rango [segunda_posicion_genetica - penultim_posicion_genetica]
        int puntoCruce = 1 + ((int)(Math.random() * (tamanioBits -2)));
        for(int i = 0; i < tamPoblacion; i = i +2) {
            Individuo individuoA = poblacion[i];
            Individuo individuoB = poblacion[i +1];
            if(aleaCruce[i] <= parametroCruce) {// si se pueden cruzar
                nuevaPoblacion[i] = Individuo.cruza(individuoA, individuoB, puntoCruce);
                nuevaPoblacion[i +1] = Individuo.cruza(individuoB, individuoA, puntoCruce);
            } else {
                
            }
        }
        System.out.println("===== punto cruce: " + puntoCruce);
        System.out.println("==============Poblacion original ============== ");
        imprimirPoblacion();
        System.out.println("==============Poblacion nueva ============== ");
        // los individuos que no de pudieron cruzar saldran como null en la nueva poblacion
        poblacion = nuevaPoblacion;
        imprimirPoblacion();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        AlgoritmoLocochon a = new AlgoritmoLocochon();
        a.crearPoblacion();
        a.imprimirPoblacion();
        a.probablidadDeIndividuo();
        a.seleccion();
        a.cruza();
    }
    
}

fitorec contestada 1 año antes

Interesante. No se que problema estés resolviendo pero no es tan común que la solución(es) se encuentre en las generaciones derivadas de la población inicial, por lo cual agregaría una función de mutación en el individuo y mandar a llamar según una probabilidad(p.e. de un 5%), por otra parte la función de cruza del individuo creo que la deberías de hacer cambiando cada cromosoma(elemento de tu arreglo binario) del padre A o B de forma aleatoria y no por un limite de cruce(puntoCruce), quedando algo como.

public static Individuo cruza(Individuo individuoA,Individuo individuoB) {
Individuo decendiente = new Individuo(individuoA.tamanioBits, individuoA.idIndividuo);
for (int i = 0; i < decendiente.tamanioBits; i++) {
if (Math.random() < 0.5) {
decendiente.bits[i] = individuoA.bits[i];
} else {
decendiente.bits[i] = individuoB.bits[i];
}
}
return decendiente;
}

Claro que todo esto depende del problema que intentas resolver, pero prueba haciéndoles algunas variaciones en tu proceso genético.

Your Answer

12 + 17 =