有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓-Java交叉算法

我正在为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) 个答案

  1. # 1 楼答案

    如果我正确理解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;
        }