我在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;
}
答案 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;
}