Java - 交叉算法

时间:2017-03-26 12:47:23

标签: java android algorithm genetic-algorithm crossover

我在Android应用程序上处理TSP问题。

我有一个交叉算法,我希望最小化循环次数以获得更快的算法。 我怎么能这样做?

这是代码:

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;
}

1 个答案:

答案 0 :(得分:0)

如果我正确理解GA交叉,您可能只会使用一个 for loop 从父母那里返回一个孩子。

请查看我的示例代码:

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;
    }