Question

I am using a genetic algorithm and I'm trying to re-create individuals in a population (after removing them at the end of the generation). The issue is that the 'crossover' function creates two individuals and the 'mutate' and 'createRandomIndividual' function create one individual. How could I incorporate that in the loop?

List<Individual> population = new ArrayList<Individual>();

private void replaceIndividuals(int individualsTurnover) {
    //individualTurnover = number of individuals I need to re-generate
    boolean even = individualsTurnover % 2 == 0;

    for (int i=0; i<individualsTurnover/2; i++){
        replaceIndividuals();
    }

    if (!even)
        mutate();
}

private void replaceIndividuals() {
    int random = generator.nextInt(10);

    if (random < 1) {
        // generates one individual via mutation
        mutate(); 
    }
    else if (random < 2) {
        // generates one individual randomly
        createRandomIndividual();
    }
    else  {
        //generates two individuals by crossing-over individuals from a pool of parents
        crossover();
    }
}

Currently too many individuals are being created. The number of individuals creates should be = 'individualTurnover'.

Was it helpful?

Solution

This might solve your problem. I have changed the method signature slightly

 public class Test
    {

        private void replaceIndividuals(int individualsTurnover) {
            //individualTurnover = number of individuals I need to re-generate
           while(individualsTurnover > 1)
           {
               individualsTurnover = individualsTurnover - replaceIndividuals();
               //I am deducting this count because those many individuals are already created
           }
           //This is the only possible count > 0
           if(individualsTurnover == 1)
           {
               mutate();
           }
        }
        /**
         * 
         * @return No of individulas created
         */
        private int  replaceIndividuals() {
            int random = generator.nextInt(10);

            if (random < 1) {
                // generates one individual via mutation
                mutate();
                retrun 1;
            }
            else if (random < 2) {
                // generates one individual randomly
                createRandomIndividual();
                return 1;
            }
            else  {
                //generates two individuals by crossing-over individuals from a pool of parents
                crossover();

                return 2;
            }
        }
    }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top