Java 为什么要并行化此实现的代码';s遗传算法求解tsp的速度慢得多?
我正在做一个关于遗传算法的大学项目来解决TSP问题,老师让我们将优化函数并行化。我尝试并行实现优化功能,它可以工作,但速度要慢得多。 小费 您可以在此处找到原始代码:Java 为什么要并行化此实现的代码';s遗传算法求解tsp的速度慢得多?,java,multithreading,Java,Multithreading,我正在做一个关于遗传算法的大学项目来解决TSP问题,老师让我们将优化函数并行化。我尝试并行实现优化功能,它可以工作,但速度要慢得多。 小费 您可以在此处找到原始代码: public SalesmanGenome optimizeP()抛出InterruptedException{ //设置在优化过程中不会更改的所有常量属性 addInP.setGenerationSize(generationSize); addInP.setGenomeSize(genomeSize); addInP.setM
public SalesmanGenome optimizeP()抛出InterruptedException{
//设置在优化过程中不会更改的所有常量属性
addInP.setGenerationSize(generationSize);
addInP.setGenomeSize(genomeSize);
addInP.setMutationRate(mutationRate);
addInP.setNumberOfCities(城市数);
附加设置开始城市(开始城市);
添加设置travelPrices(travelPrices);
addInP myThreads[]=新的addInP[N_线程];
列表填充=初始填充();//随机填充
SalesmanGenome globalBestGenome=人口.get(0);
对于(int i=0;i
这是扩展线程的addInP类的run函数
public void run()
{
while( getCurrentGenerationSize() < generationSize){
List<SalesmanGenome> parents = pickNRandomElements(population,2);
List<SalesmanGenome> children = crossover(parents);
children.set(0, mutate(children.get(0)));
children.set(1, mutate(children.get(1)));
generation.addAll(children);
setCurrentGenerationSize( getCurrentGenerationSize()+2);
}
}
public void run()
{
while(getCurrentGenerationSize()
这些是我的addInP类的属性和使用共享变量currentGenerationSize的方法
private static List<SalesmanGenome> population;
private static volatile int currentGenerationSize ;
private static int generationSize;
private static int[][] travelPrices;
private static int startingCity;
private static int numberOfCities;
private static int genomeSize;
private static float mutationRate;
private static List<SalesmanGenome> generation;
public synchronized int getCurrentGenerationSize() {
return currentGenerationSize;
}
public synchronized static void setCurrentGenerationSize(int currentGenerationSize) {
addInP.currentGenerationSize = currentGenerationSize;
}
私有静态列表填充;
私有静态volatile int currentGenerationSize;
私有静态整数生成;
私有静态int[][]旅行价格;
私人静态int startingCity;
私人静态城市数;
私有静态int基因组化;
私有静态浮动突变率;
私有静态列表生成;
public synchronized int getCurrentGenerationSize(){
返回电流生成大小;
}
公共同步静态无效setCurrentGenerationSize(int currentGenerationSize){
addInP.currentGenerationSize=currentGenerationSize;
}
您可以将基因组.size
分割成一个较小的块,并独立计算分数。这只对基因组有意义。就我所见,for循环实际上不需要访问来修改其封闭范围内的任何内容。因此,你的导师可能希望你并行计算每个基因组的适合性,而不是顺序计算(for循环是顺序的)。因此,您可以启动一个大小为genome.size
的线程池,让每个线程计算给定基因组的适合度,并将结果发布回主线程,然后将结果添加到适合度。只有在计算适合度的顺序无关紧要(据我所知,这并不重要)的情况下,这种方法才有效。这是否更有效值得商榷,因为线程切换会增加开销,因此可能会比直接for循环慢。请参阅:
private static List<SalesmanGenome> population;
private static volatile int currentGenerationSize ;
private static int generationSize;
private static int[][] travelPrices;
private static int startingCity;
private static int numberOfCities;
private static int genomeSize;
private static float mutationRate;
private static List<SalesmanGenome> generation;
public synchronized int getCurrentGenerationSize() {
return currentGenerationSize;
}
public synchronized static void setCurrentGenerationSize(int currentGenerationSize) {
addInP.currentGenerationSize = currentGenerationSize;
}