0

I working on android app for TSP problem.

I have a crossover algorithm and i want minimize number of loops for faster algorithm. How I can do it?

This is the code:

public static Path crossover(Path dad, Path mom) {
    //Create new child path
    Path child = new Path();

    //Get start and sub path positions for dads path
    double startPos = (double) (Math.random() * dad.pathSize());
    double endPos = (double) (Math.random() * dad.pathSize());

    //Loop and add the sub path from dad to our child
    for (int i = 0; i < child.pathSize(); i++) {
        //If our start position is less than the end position
        if (startPos < endPos && i > startPos && i < endPos) {
            child.setDestination(i, dad.getDestination(i));
        } // if our start position is larger
        else if (startPos > endPos) {
            if (!(i < startPos && i > endPos)) {
                child.setDestination(i, dad.getDestination(i));
            }
        }
    }


    // Loop through mom destination path
    for (int i = 0; i < mom.pathSize(); i++){
        // If child doesn't have the destination add it
        if (!child.containsDestination(mom.getDestination(i))) {
            // Loop to find a spare position in the child's path
            for (int j = 0; j < child.pathSize(); j++) {
                //Spare position found, add destination
                if (child.getDestination(j) == null) {
                    child.setDestination(j, mom.getDestination(i));
                    break;
                }
            }
        }
    }
    return child;
}
pdarkness
  • 1
  • 3

1 Answers1

0

If I understand the GA crossover correctly, you may only employ one for loop returning a child from parents.

Please have a look at my sample code:

public Chromosomes crossoverChrom(Chromosomes inpChrom1, Chromosomes inpChrom2){
        // offspring chromosome has the same size as the target chromosome
        Chromosomes offspring = new Chromosomes(inpChrom1.getGenes().length);

        for (int i = 0; i < offspring.getGenes().length;i++){
            double randOffspring = Math.random();
            //          System.out.println("i_offspring [" + i + "] , randOffspring = " + randOffspring);
            if(randOffspring <= crossoverRate){
                //              System.out.println("gene from chrom 1");
                offspring.setGenes(i, inpChrom1.getGenes()[i]);
            } else {
                //              System.out.println("gene from chrom 2");
                offspring.setGenes(i, inpChrom2.getGenes()[i]);
            }
        }
        //      System.out.println("Offspring      = " + offspring + " | Fitness = " + offspring.getFitness());
        //      System.out.println("--------------------------------------------------");
        return offspring;
    }
halfer
  • 19,824
  • 17
  • 99
  • 186
Farid Alijani
  • 839
  • 1
  • 7
  • 25